#ifndef BOOST_SERIALIZATION_BASE_OBJECT_HPP #define BOOST_SERIALIZATION_BASE_OBJECT_HPP // MS compatible compilers support #pragma once #if defined(_MSC_VER) # pragma once #endif /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 // base_object.hpp: // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for updates, documentation, and revision history. // if no archive headers have been included this is a no op // this is to permit BOOST_EXPORT etc to be included in a // file declaration header #include #include #include #include #include #include #include #include #include #include #include #include #include namespace lslboost { namespace serialization { namespace detail { // get the base type for a given derived type // preserving the const-ness template struct base_cast { typedef typename mpl::if_< is_const, const B, B >::type type; BOOST_STATIC_ASSERT(is_const::value == is_const::value); }; // only register void casts if the types are polymorphic template struct base_register { struct polymorphic { static void const * invoke(){ Base const * const b = 0; Derived const * const d = 0; return & void_cast_register(d, b); } }; struct non_polymorphic { static void const * invoke(){ return 0; } }; static void const * invoke(){ typedef typename mpl::eval_if< is_polymorphic, mpl::identity, mpl::identity >::type type; return type::invoke(); } }; } // namespace detail template typename detail::base_cast::type & base_object(Derived &d) { BOOST_STATIC_ASSERT(( is_base_and_derived::value)); BOOST_STATIC_ASSERT(! is_pointer::value); typedef typename detail::base_cast::type type; detail::base_register::invoke(); return access::cast_reference(d); } } // namespace serialization } // namespace lslboost #endif // BOOST_SERIALIZATION_BASE_OBJECT_HPP