Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/boost/serialization/optional.hpp @ 47

Last change on this file since 47 was 29, checked in by landauf, 16 years ago

updated boost from 1_33_1 to 1_34_1

File size: 3.0 KB
Line 
1/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
2
3// (C) Copyright 2002-4 Pavel Vozenilek .
4// Use, modification and distribution is subject to the Boost Software
5// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6// http://www.boost.org/LICENSE_1_0.txt)
7
8// Provides non-intrusive serialization for boost::optional.
9
10#ifndef BOOST_SERIALIZATION_OPTIONAL_HPP_
11#define BOOST_SERIALIZATION_OPTIONAL_HPP_
12
13#if defined(_MSC_VER) && (_MSC_VER >= 1020)
14# pragma once
15#endif
16
17#include <boost/config.hpp>
18
19#include <boost/optional.hpp>
20#include <boost/serialization/split_free.hpp>
21#include <boost/serialization/level.hpp>
22#include <boost/serialization/nvp.hpp>
23#include <boost/serialization/detail/stack_constructor.hpp>
24
25// function specializations must be defined in the appropriate
26// namespace - boost::serialization
27namespace boost { 
28namespace serialization {
29
30template<class Archive, class T>
31void save(
32    Archive & ar, 
33    const boost::optional<T> & t, 
34    const unsigned int /*version*/
35){
36    const bool tflag = t.is_initialized();
37    ar << boost::serialization::make_nvp("initialized", tflag);
38    if (tflag){
39        if(3 < ar.get_library_version()){
40            const int v = version<T>::value;
41            ar << make_nvp("item_version", v);
42        }
43        ar << boost::serialization::make_nvp("value", *t);
44    }
45}
46
47template<class Archive, class T>
48void load(
49    Archive & ar, 
50    boost::optional<T> & t, 
51    const unsigned int /*version*/
52){
53    bool tflag;
54    ar >> boost::serialization::make_nvp("initialized", tflag);
55    if (tflag){
56        unsigned int v;
57        if(3 < ar.get_library_version()){
58            ar >> make_nvp("item_version", v);
59        }
60        detail::stack_construct<Archive, T> aux(ar, v);
61        ar >> boost::serialization::make_nvp("value", aux.reference());
62        t.reset(aux.reference());
63    }
64    else {
65        t.reset();
66    }
67}
68
69template<class Archive, class T>
70void serialize(
71    Archive & ar, 
72    boost::optional<T> & t, 
73    const unsigned int version
74){
75    boost::serialization::split_free(ar, t, version);
76}
77
78// the following would be slightly more efficient.  But it
79// would mean that archives created with programs that support
80// TPS wouldn't be readable by programs that don't support TPS.
81// Hence we decline to support this otherwise convenient optimization.
82//#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
83#if 0
84
85template <class T>
86struct implementation_level<optional<T> >
87{
88    typedef mpl::integral_c_tag tag;
89    typedef mpl::int_<boost::serialization::object_serializable> type;
90    BOOST_STATIC_CONSTANT(
91        int ,
92        value = boost::serialization::implementation_level::type::value
93    );
94};
95
96template<class T>
97struct tracking_level<optional<T> >
98{
99    typedef mpl::integral_c_tag tag;
100    typedef mpl::int_<boost::serialization::track_never> type;
101    BOOST_STATIC_CONSTANT(
102        int ,
103        value = boost::serialization::tracking_level::type::value
104    );
105};
106
107#endif
108
109} // serialization
110} // namespace boost
111
112#endif // BOOST_SERIALIZATION_OPTIONAL_HPP_
Note: See TracBrowser for help on using the repository browser.