1 #ifndef BOOST_SERIALIZATION_VERSION_HPP
2 #define BOOST_SERIALIZATION_VERSION_HPP
3 
4 // MS compatible compilers support #pragma once
5 #if defined(_MSC_VER)
6 # pragma once
7 #endif
8 
9 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
10 // version.hpp:
11 
12 // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
13 // Use, modification and distribution is subject to the Boost Software
14 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
15 // http://www.boost.org/LICENSE_1_0.txt)
16 
17 //  See http://www.boost.org for updates, documentation, and revision history.
18 
19 #include <boost/config.hpp>
20 #include <boost/mpl/assert.hpp>
21 #include <boost/mpl/int.hpp>
22 #include <boost/mpl/eval_if.hpp>
23 #include <boost/mpl/identity.hpp>
24 #include <boost/mpl/integral_c_tag.hpp>
25 
26 #include <boost/type_traits/is_base_and_derived.hpp>
27 
28 namespace boost {
29 namespace serialization {
30 
31 struct basic_traits;
32 
33 // default version number is 0. Override with higher version
34 // when class definition changes.
35 template<class T>
36 struct version
37 {
38     template<class U>
39     struct traits_class_version {
40         typedef typename U::version type;
41     };
42 
43     typedef mpl::integral_c_tag tag;
44     // note: at least one compiler complained w/o the full qualification
45     // on basic traits below
46     typedef
47         typename mpl::eval_if<
48             is_base_and_derived<boost::serialization::basic_traits,T>,
49             traits_class_version< T >,
50             mpl::int_<0>
51         >::type type;
52     BOOST_STATIC_CONSTANT(int, value = version::type::value);
53 };
54 
55 #ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
56 template<class T>
57 const int version<T>::value;
58 #endif
59 
60 } // namespace serialization
61 } // namespace boost
62 
63 /* note: at first it seemed that this would be a good place to trap
64  * as an error an attempt to set a version # for a class which doesn't
65  * save its class information (including version #) in the archive.
66  * However, this imposes a requirement that the version be set after
67  * the implemention level which would be pretty confusing.  If this
68  * is to be done, do this check in the input or output operators when
69  * ALL the serialization traits are available.  Included the implementation
70  * here with this comment as a reminder not to do this!
71  */
72 
73 #include <boost/mpl/less.hpp>
74 #include <boost/mpl/comparison.hpp>
75 
76 // specify the current version number for the class
77 // version numbers limited to 8 bits !!!
78 #define BOOST_CLASS_VERSION(T, N)                                      \
79 namespace boost {                                                      \
80 namespace serialization {                                              \
81 template<>                                                             \
82 struct version<T >                                                     \
83 {                                                                      \
84     typedef mpl::int_<N> type;                                         \
85     typedef mpl::integral_c_tag tag;                                   \
86     BOOST_STATIC_CONSTANT(int, value = version::type::value);          \
87     BOOST_MPL_ASSERT((                                                 \
88         boost::mpl::less<                                              \
89             boost::mpl::int_<N>,                                       \
90             boost::mpl::int_<256>                                      \
91         >                                                              \
92     ));                                                                \
93     /*                                                                 \
94     BOOST_MPL_ASSERT((                                                 \
95         mpl::equal_to<                                                 \
96             :implementation_level<T >,                                 \
97             mpl::int_<object_class_info>                               \
98         >::value                                                       \
99     ));                                                                \
100     */                                                                 \
101 };                                                                     \
102 }                                                                      \
103 }
104 
105 #endif // BOOST_SERIALIZATION_VERSION_HPP
106