serialize_reversible_cont.hpp 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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/serialization/split_free.hpp>
  10. #include <boost/serialization/nvp.hpp>
  11. namespace boost
  12. {
  13. namespace ptr_container_detail
  14. {
  15. template<class Archive, class Config, class CloneAllocator>
  16. void save_helper(Archive& ar, const ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>& c)
  17. {
  18. typedef ptr_container_detail::reversible_ptr_container<Config, CloneAllocator> container_type;
  19. typedef BOOST_DEDUCED_TYPENAME container_type::const_iterator const_iterator;
  20. typedef BOOST_DEDUCED_TYPENAME container_type::value_type value_type;
  21. const_iterator i = c.begin(), e = c.end();
  22. for(; i != e; ++i)
  23. ar << boost::serialization::make_nvp( ptr_container_detail::item(),
  24. ptr_container_detail::serialize_as_const(static_cast<value_type>(*i.base())));
  25. }
  26. template<class Archive, class Config, class CloneAllocator>
  27. void load_helper(Archive& ar, ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>& c,
  28. BOOST_DEDUCED_TYPENAME ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>::size_type n)
  29. {
  30. typedef ptr_container_detail::reversible_ptr_container<Config, CloneAllocator> container_type;
  31. typedef BOOST_DEDUCED_TYPENAME container_type::size_type size_type;
  32. typedef BOOST_DEDUCED_TYPENAME container_type::value_type value_type;
  33. //
  34. // Called after an appropriate reserve on c.
  35. //
  36. c.clear();
  37. for(size_type i = 0u; i != n; ++i)
  38. {
  39. //
  40. // Remark: pointers are not tracked,
  41. // so we need not call ar.reset_object_address(v, u)
  42. //
  43. value_type ptr;
  44. ar >> boost::serialization::make_nvp( ptr_container_detail::item(), ptr );
  45. c.insert(c.end(), ptr);
  46. }
  47. }
  48. } // namespace ptr_container_detail
  49. namespace serialization
  50. {
  51. template<class Archive, class Config, class CloneAllocator>
  52. void save(Archive& ar, const ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>& c, unsigned int /*version*/)
  53. {
  54. ar << boost::serialization::make_nvp( ptr_container_detail::count(),
  55. ptr_container_detail::serialize_as_const(c.size()) );
  56. ptr_container_detail::save_helper(ar, c);
  57. }
  58. template<class Archive, class Config, class CloneAllocator>
  59. void load(Archive& ar, ptr_container_detail::reversible_ptr_container<Config, CloneAllocator>& c, unsigned int /*version*/)
  60. {
  61. typedef ptr_container_detail::reversible_ptr_container<Config, CloneAllocator> container_type;
  62. typedef BOOST_DEDUCED_TYPENAME container_type::size_type size_type;
  63. size_type n;
  64. ar >> boost::serialization::make_nvp( ptr_container_detail::count(), n );
  65. ptr_container_detail::load_helper(ar, c, n);
  66. }
  67. } // namespace serialization
  68. } // namespace boost
  69. #endif