1 /*!
2  * \file      bitset.hpp
3  * \brief     Provides Boost.Serialization support for std::bitset
4  * \author    Brian Ravnsgaard Riis
5  * \author    Kenneth Riddile
6  * \date      16.09.2004, updated 04.03.2009
7  * \copyright 2004 Brian Ravnsgaard Riis
8  * \license   Boost Software License 1.0
9  */
10 #ifndef BOOST_SERIALIZATION_BITSET_HPP
11 #define BOOST_SERIALIZATION_BITSET_HPP
12 
13 // MS compatible compilers support #pragma once
14 #if defined(_MSC_VER)
15 # pragma once
16 #endif
17 
18 #include <bitset>
19 #include <cstddef> // size_t
20 
21 #include <boost/config.hpp>
22 #include <boost/serialization/split_free.hpp>
23 #include <boost/serialization/string.hpp>
24 #include <boost/serialization/nvp.hpp>
25 
26 namespace boost{
27 namespace serialization{
28 
29 template <class Archive, std::size_t size>
save(Archive & ar,std::bitset<size> const & t,const unsigned int)30 inline void save(
31     Archive & ar,
32     std::bitset<size> const & t,
33     const unsigned int /* version */
34 ){
35     const std::string bits = t.template to_string<
36         std::string::value_type,
37         std::string::traits_type,
38         std::string::allocator_type
39     >();
40     ar << BOOST_SERIALIZATION_NVP( bits );
41 }
42 
43 template <class Archive, std::size_t size>
load(Archive & ar,std::bitset<size> & t,const unsigned int)44 inline void load(
45     Archive & ar,
46     std::bitset<size> & t,
47     const unsigned int /* version */
48 ){
49     std::string bits;
50     ar >> BOOST_SERIALIZATION_NVP( bits );
51     t = std::bitset<size>(bits);
52 }
53 
54 template <class Archive, std::size_t size>
serialize(Archive & ar,std::bitset<size> & t,const unsigned int version)55 inline void serialize(
56     Archive & ar,
57     std::bitset<size> & t,
58     const unsigned int version
59 ){
60     boost::serialization::split_free( ar, t, version );
61 }
62 
63 // don't track bitsets since that would trigger tracking
64 // all over the program - which probably would be a surprise.
65 // also, tracking would be hard to implement since, we're
66 // serialization a representation of the data rather than
67 // the data itself.
68 template <std::size_t size>
69 struct tracking_level<std::bitset<size> >
70     : mpl::int_<track_never> {} ;
71 
72 } //serialization
73 } //boost
74 
75 #endif // BOOST_SERIALIZATION_BITSET_HPP
76