1 | #ifndef BOOST_SERIALIZATION_LEVEL_HPP |
2 | #define BOOST_SERIALIZATION_LEVEL_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 | // level.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/detail/workaround.hpp> |
21 | |
22 | #include <boost/type_traits/is_fundamental.hpp> |
23 | #include <boost/type_traits/is_enum.hpp> |
24 | #include <boost/type_traits/is_array.hpp> |
25 | #include <boost/type_traits/is_class.hpp> |
26 | #include <boost/type_traits/is_base_and_derived.hpp> |
27 | |
28 | #include <boost/mpl/eval_if.hpp> |
29 | #include <boost/mpl/int.hpp> |
30 | #include <boost/mpl/integral_c.hpp> |
31 | #include <boost/mpl/integral_c_tag.hpp> |
32 | |
33 | #include <boost/serialization/level_enum.hpp> |
34 | |
35 | namespace boost { |
36 | namespace serialization { |
37 | |
38 | struct basic_traits; |
39 | |
40 | // default serialization implementation level |
41 | template<class T> |
42 | struct implementation_level_impl { |
43 | template<class U> |
44 | struct traits_class_level { |
45 | typedef typename U::level type; |
46 | }; |
47 | |
48 | typedef mpl::integral_c_tag tag; |
49 | // note: at least one compiler complained w/o the full qualification |
50 | // on basic traits below |
51 | typedef |
52 | typename mpl::eval_if< |
53 | is_base_and_derived<boost::serialization::basic_traits, T>, |
54 | traits_class_level< T >, |
55 | //else |
56 | typename mpl::eval_if< |
57 | is_fundamental< T >, |
58 | mpl::int_<primitive_type>, |
59 | //else |
60 | typename mpl::eval_if< |
61 | is_class< T >, |
62 | mpl::int_<object_class_info>, |
63 | //else |
64 | typename mpl::eval_if< |
65 | is_array< T >, |
66 | mpl::int_<object_serializable>, |
67 | //else |
68 | typename mpl::eval_if< |
69 | is_enum< T >, |
70 | mpl::int_<primitive_type>, |
71 | //else |
72 | mpl::int_<not_serializable> |
73 | > |
74 | > |
75 | > |
76 | > |
77 | >::type type; |
78 | // vc 7.1 doesn't like enums here |
79 | BOOST_STATIC_CONSTANT(int, value = type::value); |
80 | }; |
81 | |
82 | template<class T> |
83 | struct implementation_level : |
84 | public implementation_level_impl<const T> |
85 | { |
86 | }; |
87 | |
88 | template<class T, int L> |
89 | inline bool operator>=(implementation_level< T > t, enum level_type l) |
90 | { |
91 | return t.value >= (int)l; |
92 | } |
93 | |
94 | } // namespace serialization |
95 | } // namespace boost |
96 | |
97 | // specify the level of serialization implementation for the class |
98 | // require that class info saved when versioning is used |
99 | #define BOOST_CLASS_IMPLEMENTATION(T, E) \ |
100 | namespace boost { \ |
101 | namespace serialization { \ |
102 | template <> \ |
103 | struct implementation_level_impl< const T > \ |
104 | { \ |
105 | typedef mpl::integral_c_tag tag; \ |
106 | typedef mpl::int_< E > type; \ |
107 | BOOST_STATIC_CONSTANT( \ |
108 | int, \ |
109 | value = implementation_level_impl::type::value \ |
110 | ); \ |
111 | }; \ |
112 | } \ |
113 | } |
114 | /**/ |
115 | |
116 | #endif // BOOST_SERIALIZATION_LEVEL_HPP |
117 | |