serialize_reversible_cont.hpp 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Copyright Sebastian Ramacher, 2007.
  2. // Distributed under the Boost Software License, Version 1.0. (See
  3. // accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. #ifndef BOOST_PTR_CONTAINER_DETAIL_SERIALIZE_REVERSIBLE_PTR_CONTAINER_HPP
  6. #define BOOST_PTR_CONTAINER_DETAIL_SERIALIZE_REVERSIBLE_PTR_CONTAINER_HPP
  7. #include <boost/ptr_container/detail/reversible_ptr_container.hpp>
  8. #include <boost/ptr_container/detail/serialize_xml_names.hpp>
  9. #include <boost/core/serialization.hpp>
  10. namespace boost
  11. {
  12. namespace ptr_container_detail
  13. {
  14. template<class Archive, class Config, class CloneAllocator>
  15. void save_helper(Archive& ar, const ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>& c)
  16. {
  17. typedef ptr_container_detail::reversible_ptr_container<Config, CloneAllocator> container_type;
  18. typedef BOOST_DEDUCED_TYPENAME container_type::const_iterator const_iterator;
  19. typedef BOOST_DEDUCED_TYPENAME container_type::value_type value_type;
  20. const_iterator i = c.begin(), e = c.end();
  21. for(; i != e; ++i)
  22. ar << boost::serialization::make_nvp( ptr_container_detail::item(),
  23. ptr_container_detail::serialize_as_const(static_cast<value_type>(*i.base())));
  24. }
  25. template<class Archive, class Config, class CloneAllocator>
  26. void load_helper(Archive& ar, ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>& c,
  27. BOOST_DEDUCED_TYPENAME ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>::size_type n)
  28. {
  29. typedef ptr_container_detail::reversible_ptr_container<Config, CloneAllocator> container_type;
  30. typedef BOOST_DEDUCED_TYPENAME container_type::size_type size_type;
  31. typedef BOOST_DEDUCED_TYPENAME container_type::value_type value_type;
  32. //
  33. // Called after an appropriate reserve on c.
  34. //
  35. c.clear();
  36. for(size_type i = 0u; i != n; ++i)
  37. {
  38. //
  39. // Remark: pointers are not tracked,
  40. // so we need not call ar.reset_object_address(v, u)
  41. //
  42. value_type ptr;
  43. ar >> boost::serialization::make_nvp( ptr_container_detail::item(), ptr );
  44. c.insert(c.end(), ptr);
  45. }
  46. }
  47. } // namespace ptr_container_detail
  48. namespace serialization
  49. {
  50. template<class Archive, class Config, class CloneAllocator>
  51. void save(Archive& ar, const ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>& c, unsigned int /*version*/)
  52. {
  53. ar << boost::serialization::make_nvp( ptr_container_detail::count(),
  54. ptr_container_detail::serialize_as_const(c.size()) );
  55. ptr_container_detail::save_helper(ar, c);
  56. }
  57. template<class Archive, class Config, class CloneAllocator>
  58. void load(Archive& ar, ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>& c, unsigned int /*version*/)
  59. {
  60. typedef ptr_container_detail::reversible_ptr_container<Config, CloneAllocator> container_type;
  61. typedef BOOST_DEDUCED_TYPENAME container_type::size_type size_type;
  62. size_type n;
  63. ar >> boost::serialization::make_nvp( ptr_container_detail::count(), n );
  64. ptr_container_detail::load_helper(ar, c, n);
  65. }
  66. } // namespace serialization
  67. } // namespace boost
  68. #endif