summaryrefslogtreecommitdiff
path: root/boost/property_tree/ptree_serialization.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/property_tree/ptree_serialization.hpp')
-rw-r--r--boost/property_tree/ptree_serialization.hpp51
1 files changed, 39 insertions, 12 deletions
diff --git a/boost/property_tree/ptree_serialization.hpp b/boost/property_tree/ptree_serialization.hpp
index 4dc916c0d0..a8181ca3b7 100644
--- a/boost/property_tree/ptree_serialization.hpp
+++ b/boost/property_tree/ptree_serialization.hpp
@@ -14,7 +14,7 @@
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/collections_save_imp.hpp>
-#include <boost/serialization/collections_load_imp.hpp>
+#include <boost/serialization/detail/stack_constructor.hpp>
#include <boost/serialization/split_free.hpp>
#include <boost/serialization/utility.hpp>
@@ -48,6 +48,41 @@ namespace boost { namespace property_tree
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
@@ -66,18 +101,10 @@ namespace boost { namespace property_tree
basic_ptree<K, D, C> &t,
const unsigned int file_version)
{
- using namespace boost::serialization;
- // Load children
- stl::load_collection<Archive,
- basic_ptree<K, D, C>,
- stl::archive_input_seq<Archive,
- basic_ptree<K, D, C> >,
- stl::no_reserve_imp<
- basic_ptree<K, D, C> >
- >(ar, t);
+ namespace bsl = boost::serialization;
- // Load data (must be after load_collection, as it calls clear())
- ar >> make_nvp("data", t.data());
+ detail::load_children(ar, t);
+ ar >> bsl::make_nvp("data", t.data());
}
/**