williamr@2: #ifndef BOOST_SERIALIZATION_LEVEL_HPP williamr@2: #define BOOST_SERIALIZATION_LEVEL_HPP williamr@2: williamr@2: // MS compatible compilers support #pragma once williamr@2: #if defined(_MSC_VER) && (_MSC_VER >= 1020) williamr@2: # pragma once williamr@2: #endif williamr@2: williamr@2: /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 williamr@2: // level.hpp: williamr@2: williamr@2: // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . williamr@2: // Use, modification and distribution is subject to the Boost Software williamr@2: // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: williamr@2: // See http://www.boost.org for updates, documentation, and revision history. williamr@2: williamr@2: #include williamr@2: #include williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: #include williamr@2: williamr@2: namespace boost { williamr@2: namespace serialization { williamr@2: williamr@2: struct basic_traits; williamr@2: williamr@2: // default serialization implementation level williamr@2: template williamr@2: struct implementation_level { williamr@2: template williamr@2: struct traits_class_level { williamr@2: typedef BOOST_DEDUCED_TYPENAME U::level type; williamr@2: }; williamr@2: williamr@2: typedef mpl::integral_c_tag tag; williamr@2: // note: at least one compiler complained w/o the full qualification williamr@2: // on basic traits below williamr@2: typedef williamr@2: BOOST_DEDUCED_TYPENAME mpl::eval_if< williamr@2: is_base_and_derived, williamr@2: traits_class_level, williamr@2: //else williamr@2: BOOST_DEDUCED_TYPENAME mpl::eval_if< williamr@2: is_fundamental, williamr@2: mpl::int_, williamr@2: //else williamr@2: BOOST_DEDUCED_TYPENAME mpl::eval_if< williamr@2: is_class, williamr@2: mpl::int_, williamr@2: //else williamr@2: BOOST_DEDUCED_TYPENAME mpl::eval_if< williamr@2: is_array, williamr@2: #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x560)) williamr@2: mpl::int_, williamr@2: #else williamr@2: mpl::int_, williamr@2: #endif williamr@2: //else williamr@2: BOOST_DEDUCED_TYPENAME mpl::eval_if< williamr@2: is_enum, williamr@2: //#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x560)) williamr@2: // mpl::int_, williamr@2: //#else williamr@2: mpl::int_, williamr@2: //#endif williamr@2: //else williamr@2: mpl::int_ williamr@2: > williamr@2: > williamr@2: > williamr@2: > williamr@2: >::type type; williamr@2: // vc 7.1 doesn't like enums here williamr@2: BOOST_STATIC_CONSTANT(int, value = implementation_level::type::value); williamr@2: }; williamr@2: williamr@2: williamr@2: template williamr@2: inline bool operator>=(implementation_level t, enum level_type l) williamr@2: { williamr@2: return t.value >= (int)l; williamr@2: } williamr@2: williamr@2: } // namespace serialization williamr@2: } // namespace boost williamr@2: williamr@2: // specify the level of serialization implementation for the class williamr@2: // require that class info saved when versioning is used williamr@2: #define BOOST_CLASS_IMPLEMENTATION(T, E) \ williamr@2: namespace boost { \ williamr@2: namespace serialization { \ williamr@2: template <> \ williamr@2: struct implementation_level< T > \ williamr@2: { \ williamr@2: typedef mpl::integral_c_tag tag; \ williamr@2: typedef mpl::int_< E > type; \ williamr@2: BOOST_STATIC_CONSTANT( \ williamr@2: int, \ williamr@2: value = implementation_level::type::value \ williamr@2: ); \ williamr@2: }; \ williamr@2: } \ williamr@2: } williamr@2: /**/ williamr@2: williamr@2: #endif // BOOST_SERIALIZATION_LEVEL_HPP