码迷,mamicode.com
首页 > 其他好文 > 详细

Serializable unordered set

时间:2015-01-29 23:47:42      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

Serializable unordered set  

可序列化的哈希表

 

 

/*‘‘‘

[[[[[[[[[[[[[[[                                 ]]]]]]]]]]]]]]]
[::::::::::::::                                 ::::::::::::::]
[::::::::::::::                                 ::::::::::::::]
[::::::[[[[[[[:                                 :]]]]]]]::::::]
[:::::[                                                 ]:::::]
[:::::[                                                 ]:::::]
[:::::[                                                 ]:::::]
[:::::[   Serializable unordered set                    ]:::::]
[:::::[   Created on Jan 25, 2015                        ]:::::]
[:::::[   @author: ScottGu<150316990@qq.com,            ]:::::]
[:::::[                     gu.kai.66@gmail.com>        ]:::::]
[:::::[   performance tested:                           ]:::::]
[:::::[   environment: 64bit win7, i7-4800MQ, 8GB       ]:::::]
[:::::[                                                 ]:::::]
[:::::[                                                 ]:::::]
[:::::[                                                 ]:::::]
[:::::[                                                 ]:::::]
[::::::[[[[[[[:                                 :]]]]]]]::::::]
[::::::::::::::                                 ::::::::::::::]
[::::::::::::::                                 ::::::::::::::]
[[[[[[[[[[[[[[[                                 ]]]]]]]]]]]]]]]]

‘‘‘*/

#pragma once

#include "StdAfx.h"
#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>

#include <boost/algorithm/string/predicate.hpp>
#include <boost/exception/diagnostic_information.hpp> 
#include <boost/exception_ptr.hpp> 

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/config.hpp>
#include <boost/unordered_set.hpp>
#include <boost/shared_ptr.hpp>

#include <boost/serialization/string.hpp>
#include <boost/serialization/version.hpp>
#include <boost/serialization/split_member.hpp>

#include <boost/serialization/collections_save_imp.hpp>
#include <boost/serialization/collections_load_imp.hpp>
#include <boost/serialization/utility.hpp>
#include <boost/serialization/split_free.hpp>

#include <boost/thread/shared_mutex.hpp>
#include <boost/thread/locks.hpp>

namespace boost {
    namespace serialization {

        template<class Archive, typename TArgs >
        inline void save(Archive & ar, boost::unordered_set<TArgs> const&t, unsigned) {
            boost::serialization::stl::save_collection<Archive, boost::unordered_set<TArgs> >(ar, t);
        };

        template<class Archive, typename TArgs >
        inline void load(Archive & ar, boost::unordered_set<TArgs> &t, unsigned) {
            boost::serialization::stl::load_collection<Archive,
                boost::unordered_set<TArgs>,
                boost::serialization::stl::archive_input_set<Archive, boost::unordered_set<TArgs> >,
                boost::serialization::stl::no_reserve_imp<boost::unordered_set<TArgs> >
            >(ar, t);
        };

        // split non-intrusive serialization function member into separate
        // non intrusive save/load member functions
        template <class Archive, typename TArgs>
        inline void serialize(Archive & ar, boost::unordered_set<TArgs> &t, unsigned file_version) {
            boost::serialization::split_free(ar, t, file_version);
        };
    }
};


template<typename DataType>
class Serializable_unordered_set : boost::noncopyable
{

    friend class boost::serialization::access;
    // When the class Archive corresponds to an output archive, the
    // & operator is defined similar to <<.  Likewise, when the class Archive
    // is a type of input archive the & operator is defined similar to >>.
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version) {
        ar & m_unordered_set;
    }

private:
        boost::unordered_set<DataType > m_unordered_set;
        mutable boost::shared_mutex m_mtx_protect;

public:

    Serializable_unordered_set() 
    {
    }

    //Serializable_unordered_set(const Serializable_unordered_set& newset) {
    //    m_unordered_set = newset.m_unordered_set;
    //    m_mtx_protect = newset.m_mtx_protect;

    //}

    void SetMap(boost::unordered_set<DataType>& newset)
    {
        m_unordered_set = newset;
    }

    void insert(DataType t) {
        boost::unique_lock< boost::shared_mutex > lock(m_mtx_protect);
        m_unordered_set.insert(t);
    }

    bool exist(DataType ky) 
    {
        boost::shared_lock< boost::shared_mutex > lock(m_mtx_protect);
        if (m_unordered_set.find(ky) != m_unordered_set.end())
            return true;
        return false;
    }

    void serialize_to(string file_path) {
        boost::shared_lock< boost::shared_mutex > lock(m_mtx_protect);
        std::ofstream fout(file_path.c_str());
        boost::archive::text_oarchive oa(fout);
        oa << m_unordered_set;
        fout.close();
    }

    void deserialize_from(std::string file_path) {
        boost::unique_lock< boost::shared_mutex > lock(m_mtx_protect);
        std::ifstream file_in(file_path.c_str());
        boost::archive::text_iarchive ia(file_in);
        ia >> m_unordered_set; //recover from file
        file_in.close();
    }
};
typedef std::shared_ptr<Serializable_unordered_set<int>> hashset_int_SPtr;

 

Serializable unordered set

标签:

原文地址:http://www.cnblogs.com/scottgu/p/4261189.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!