annotate DEPENDENCIES/generic/include/boost/serialization/base_object.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 #ifndef BOOST_SERIALIZATION_BASE_OBJECT_HPP
Chris@16 2 #define BOOST_SERIALIZATION_BASE_OBJECT_HPP
Chris@16 3
Chris@16 4 // MS compatible compilers support #pragma once
Chris@101 5 #if defined(_MSC_VER)
Chris@16 6 # pragma once
Chris@16 7 #endif
Chris@16 8
Chris@16 9 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
Chris@16 10 // base_object.hpp:
Chris@16 11
Chris@16 12 // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
Chris@16 13 // Use, modification and distribution is subject to the Boost Software
Chris@16 14 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 15 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 16
Chris@16 17 // See http://www.boost.org for updates, documentation, and revision history.
Chris@16 18
Chris@16 19 // if no archive headers have been included this is a no op
Chris@16 20 // this is to permit BOOST_EXPORT etc to be included in a
Chris@16 21 // file declaration header
Chris@16 22
Chris@16 23 #include <boost/config.hpp>
Chris@16 24 #include <boost/detail/workaround.hpp>
Chris@16 25
Chris@16 26 #include <boost/mpl/eval_if.hpp>
Chris@16 27 #include <boost/mpl/int.hpp>
Chris@16 28 #include <boost/mpl/bool.hpp>
Chris@16 29 #include <boost/mpl/identity.hpp>
Chris@16 30
Chris@16 31 #include <boost/type_traits/is_base_and_derived.hpp>
Chris@16 32 #include <boost/type_traits/is_pointer.hpp>
Chris@16 33 #include <boost/type_traits/is_const.hpp>
Chris@16 34 #include <boost/type_traits/is_polymorphic.hpp>
Chris@16 35
Chris@16 36 #include <boost/static_assert.hpp>
Chris@16 37 #include <boost/serialization/access.hpp>
Chris@16 38 #include <boost/serialization/force_include.hpp>
Chris@16 39 #include <boost/serialization/void_cast_fwd.hpp>
Chris@16 40
Chris@16 41 namespace boost {
Chris@16 42 namespace serialization {
Chris@16 43
Chris@16 44 namespace detail
Chris@16 45 {
Chris@16 46 // get the base type for a given derived type
Chris@16 47 // preserving the const-ness
Chris@16 48 template<class B, class D>
Chris@16 49 struct base_cast
Chris@16 50 {
Chris@101 51 typedef typename
Chris@16 52 mpl::if_<
Chris@16 53 is_const<D>,
Chris@16 54 const B,
Chris@16 55 B
Chris@16 56 >::type type;
Chris@16 57 BOOST_STATIC_ASSERT(is_const<type>::value == is_const<D>::value);
Chris@16 58 };
Chris@16 59
Chris@16 60 // only register void casts if the types are polymorphic
Chris@16 61 template<class Base, class Derived>
Chris@16 62 struct base_register
Chris@16 63 {
Chris@16 64 struct polymorphic {
Chris@16 65 static void const * invoke(){
Chris@16 66 Base const * const b = 0;
Chris@16 67 Derived const * const d = 0;
Chris@16 68 return & void_cast_register(d, b);
Chris@16 69 }
Chris@16 70 };
Chris@16 71 struct non_polymorphic {
Chris@16 72 static void const * invoke(){
Chris@16 73 return 0;
Chris@16 74 }
Chris@16 75 };
Chris@16 76 static void const * invoke(){
Chris@101 77 typedef typename mpl::eval_if<
Chris@16 78 is_polymorphic<Base>,
Chris@16 79 mpl::identity<polymorphic>,
Chris@16 80 mpl::identity<non_polymorphic>
Chris@16 81 >::type type;
Chris@16 82 return type::invoke();
Chris@16 83 }
Chris@16 84 };
Chris@16 85
Chris@16 86 } // namespace detail
Chris@16 87 #if defined(__BORLANDC__) && __BORLANDC__ < 0x610
Chris@16 88 template<class Base, class Derived>
Chris@16 89 const Base &
Chris@16 90 base_object(const Derived & d)
Chris@16 91 {
Chris@16 92 BOOST_STATIC_ASSERT(! is_pointer<Derived>::value);
Chris@16 93 detail::base_register<Base, Derived>::invoke();
Chris@16 94 return access::cast_reference<const Base, Derived>(d);
Chris@16 95 }
Chris@16 96 #else
Chris@16 97 template<class Base, class Derived>
Chris@101 98 typename detail::base_cast<Base, Derived>::type &
Chris@16 99 base_object(Derived &d)
Chris@16 100 {
Chris@16 101 BOOST_STATIC_ASSERT(( is_base_and_derived<Base,Derived>::value));
Chris@16 102 BOOST_STATIC_ASSERT(! is_pointer<Derived>::value);
Chris@101 103 typedef typename detail::base_cast<Base, Derived>::type type;
Chris@16 104 detail::base_register<type, Derived>::invoke();
Chris@16 105 return access::cast_reference<type, Derived>(d);
Chris@16 106 }
Chris@16 107 #endif
Chris@16 108
Chris@16 109 } // namespace serialization
Chris@16 110 } // namespace boost
Chris@16 111
Chris@16 112 #endif // BOOST_SERIALIZATION_BASE_OBJECT_HPP