williamr@2: #ifndef BOOST_SERIALIZATION_TRACKING_HPP williamr@2: #define BOOST_SERIALIZATION_TRACKING_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: // tracking.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: #include 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: namespace boost { williamr@2: namespace serialization { williamr@2: williamr@2: struct basic_traits; williamr@2: williamr@2: // default tracking level williamr@2: template williamr@2: struct tracking_level { williamr@2: template williamr@2: struct traits_class_tracking { williamr@2: typedef BOOST_DEDUCED_TYPENAME U::tracking type; 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_tracking, williamr@2: //else williamr@2: BOOST_DEDUCED_TYPENAME mpl::eval_if< williamr@2: is_pointer, williamr@2: // pointers are not tracked by default williamr@2: mpl::int_, williamr@2: //else williamr@2: BOOST_DEDUCED_TYPENAME mpl::eval_if< williamr@2: // for primitives williamr@2: BOOST_DEDUCED_TYPENAME mpl::equal_to< williamr@2: implementation_level, williamr@2: mpl::int_ williamr@2: >, williamr@2: // is never williamr@2: mpl::int_, williamr@2: // otherwise its selective williamr@2: mpl::int_ williamr@2: > > >::type type; williamr@2: BOOST_STATIC_CONSTANT(int, value = tracking_level::type::value); williamr@2: }; williamr@2: williamr@2: williamr@2: template williamr@2: inline bool operator>=(tracking_level t, enum tracking_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: williamr@2: // The STATIC_ASSERT is prevents one from setting tracking for a primitive type. williamr@2: // This almost HAS to be an error. Doing this will effect serialization of all williamr@2: // char's in your program which is almost certainly what you don't want to do. williamr@2: // If you want to track all instances of a given primitive type, You'll have to williamr@2: // wrap it in your own type so its not a primitive anymore. Then it will compile williamr@2: // without problem. williamr@2: #define BOOST_CLASS_TRACKING(T, E) \ williamr@2: namespace boost { \ williamr@2: namespace serialization { \ williamr@2: template<> \ williamr@2: struct tracking_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 = tracking_level::type::value \ williamr@2: ); \ williamr@2: /* tracking for a class */ \ williamr@2: BOOST_STATIC_ASSERT(( \ williamr@2: mpl::greater< \ williamr@2: /* that is a prmitive */ \ williamr@2: implementation_level< T >, \ williamr@2: mpl::int_ \ williamr@2: >::value \ williamr@2: )); \ williamr@2: }; \ williamr@2: }} williamr@2: williamr@2: #endif // BOOST_SERIALIZATION_TRACKING_HPP