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