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 //#include <boost/serialization/level.hpp> 73 //#include <boost/mpl/equal_to.hpp> 74 75 #include <boost/mpl/less.hpp> 76 #include <boost/mpl/comparison.hpp> 77 78 // specify the current version number for the class 79 // version numbers limited to 8 bits !!! 80 #define BOOST_CLASS_VERSION(T, N) \ 81 namespace boost { \ 82 namespace serialization { \ 83 template<> \ 84 struct version<T > \ 85 { \ 86 typedef mpl::int_<N> type; \ 87 typedef mpl::integral_c_tag tag; \ 88 BOOST_STATIC_CONSTANT(int, value = version::type::value); \ 89 BOOST_MPL_ASSERT(( \ 90 boost::mpl::less< \ 91 boost::mpl::int_<N>, \ 92 boost::mpl::int_<256> \ 93 > \ 94 )); \ 95 /* \ 96 BOOST_MPL_ASSERT(( \ 97 mpl::equal_to< \ 98 :implementation_level<T >, \ 99 mpl::int_<object_class_info> \ 100 >::value \ 101 )); \ 102 */ \ 103 }; \ 104 } \ 105 } 106 107 #endif // BOOST_SERIALIZATION_VERSION_HPP 108