os/ossrv/ossrv_pub/boost_apis/boost/serialization/split_free.hpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 #ifndef BOOST_SERIALIZATION_SPLIT_FREE_HPP
     2 #define BOOST_SERIALIZATION_SPLIT_FREE_HPP
     3 
     4 // MS compatible compilers support #pragma once
     5 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
     6 # pragma once
     7 #endif
     8 
     9 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
    10 // split_free.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/mpl/eval_if.hpp>
    21 #include <boost/mpl/identity.hpp>
    22 #include <boost/serialization/serialization.hpp>
    23 
    24 namespace boost {
    25 namespace archive {
    26     namespace detail {
    27         template<class Archive> class interface_oarchive;
    28         template<class Archive> class interface_iarchive;
    29     } // namespace detail
    30 } // namespace archive
    31 
    32 namespace serialization {
    33 
    34 //namespace detail {
    35 template<class Archive, class T>
    36 struct free_saver {
    37     static void invoke(
    38         Archive & ar, 
    39         const  T & t, 
    40         const unsigned int file_version
    41     ){
    42         // use function overload (version_type) to workaround
    43         // two-phase lookup issue
    44         const version_type v(file_version);
    45         save(ar, t, v);
    46     }
    47 };
    48 template<class Archive, class T>
    49 struct free_loader {
    50     static void invoke(
    51         Archive & ar, 
    52         T & t, 
    53         const unsigned int file_version
    54     ){
    55         // use function overload (version_type) to workaround
    56         // two-phase lookup issue
    57         const version_type v(file_version);
    58         load(ar, t, v);
    59     }
    60 };
    61 //} // namespace detail
    62 
    63 template<class Archive, class T>
    64 inline void split_free(
    65     Archive & ar, 
    66     T & t, 
    67     const unsigned int file_version
    68 ){
    69     typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
    70         BOOST_DEDUCED_TYPENAME Archive::is_saving,
    71         mpl::identity</* detail:: */ free_saver<Archive, T> >, 
    72         mpl::identity</* detail:: */ free_loader<Archive, T> >
    73     >::type typex;
    74     typex::invoke(ar, t, file_version);
    75 }
    76 
    77 } // namespace serialization
    78 } // namespace boost
    79 
    80 #define BOOST_SERIALIZATION_SPLIT_FREE(T)       \
    81 namespace boost { namespace serialization {     \
    82 template<class Archive>                         \
    83 inline void serialize(                          \
    84         Archive & ar,                               \
    85         T & t,                                      \
    86         const unsigned int file_version             \
    87 ){                                              \
    88         split_free(ar, t, file_version);            \
    89 }                                               \
    90 }}
    91 /**/
    92 
    93 #endif // BOOST_SERIALIZATION_SPLIT_FREE_HPP