1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
// ----------------------------------------------------------------------------
// Copyright (C) 2002-2006 Marcin Kalicinski
//
// Distributed under 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)
//
// For more information, see www.boost.org
// ----------------------------------------------------------------------------
#ifndef BOOST_PROPERTY_TREE_PTREE_SERIALIZATION_HPP_INCLUDED
#define BOOST_PROPERTY_TREE_PTREE_SERIALIZATION_HPP_INCLUDED
#include <boost/property_tree/ptree.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/collections_save_imp.hpp>
#include <boost/serialization/detail/stack_constructor.hpp>
#include <boost/serialization/split_free.hpp>
#include <boost/serialization/utility.hpp>
namespace boost { namespace property_tree
{
///////////////////////////////////////////////////////////////////////////
// boost::serialization support
/**
* Serialize the property tree to the given archive.
* @note In addition to serializing to regular archives, this supports
* serializing to archives requiring name-value pairs, e.g. XML
* archives. However, the output format in the XML archive is not
* guaranteed to be the same as that when using the Boost.PropertyTree
* library's @c boost::property_tree::xml_parser::write_xml.
* @param ar The archive to which to save the serialized property tree.
* This archive should conform to the concept laid out by the
* Boost.Serialization library.
* @param t The property tree to serialize.
* @param file_version file_version for the archive.
* @post @c ar will contain the serialized form of @c t.
*/
template<class Archive, class K, class D, class C>
inline void save(Archive &ar,
const basic_ptree<K, D, C> &t,
const unsigned int file_version)
{
using namespace boost::serialization;
stl::save_collection<Archive, basic_ptree<K, D, C> >(ar, t);
ar << make_nvp("data", t.data());
}
namespace detail
{
template <class Archive, class K, class D, class C>
inline void load_children(Archive &ar,
basic_ptree<K, D, C> &t)
{
namespace bsl = boost::serialization;
namespace bsa = boost::archive;
typedef basic_ptree<K, D, C> tree;
typedef typename tree::value_type value_type;
bsl::collection_size_type count;
ar >> BOOST_SERIALIZATION_NVP(count);
bsl::item_version_type item_version(0);
const bsa::library_version_type library_version(
ar.get_library_version()
);
if(bsa::library_version_type(3) < library_version){
ar >> BOOST_SERIALIZATION_NVP(item_version);
}
// Can't use the serialization helper, it expects resize() to exist
// for default-constructible elements.
// This is a copy/paste of the fallback version.
t.clear();
while(count-- > 0){
bsl::detail::stack_construct<Archive, value_type>
u(ar, item_version);
ar >> bsl::make_nvp("item", u.reference());
t.push_back(u.reference());
ar.reset_object_address(& t.back() , & u.reference());
}
}
}
/**
* De-serialize the property tree to the given archive.
* @note In addition to de-serializing from regular archives, this supports
* loading from archives requiring name-value pairs, e.g. XML
* archives. The format should be that used by
* boost::property_tree::save.
* @param ar The archive from which to load the serialized property tree.
* This archive should conform to the concept laid out by the
* Boost.Serialization library.
* @param t The property tree to de-serialize.
* @param file_version file_version for the archive.
* @post @c t will contain the de-serialized data from @c ar.
*/
template<class Archive, class K, class D, class C>
inline void load(Archive &ar,
basic_ptree<K, D, C> &t,
const unsigned int file_version)
{
namespace bsl = boost::serialization;
detail::load_children(ar, t);
ar >> bsl::make_nvp("data", t.data());
}
/**
* Load or store the property tree using the given archive.
* @param ar The archive from which to load or save the serialized property
* tree. The type of this archive will determine whether saving or
* loading is performed.
* @param t The property tree to load or save.
* @param file_version file_version for the archive.
*/
template<class Archive, class K, class D, class C>
inline void serialize(Archive &ar,
basic_ptree<K, D, C> &t,
const unsigned int file_version)
{
using namespace boost::serialization;
split_free(ar, t, file_version);
}
} }
#endif
|