serialize_fca_container.hpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /* Copyright 2023 Joaquin M Lopez Munoz.
  2. * Distributed under the Boost Software License, Version 1.0.
  3. * (See accompanying file LICENSE_1_0.txt or copy at
  4. * http://www.boost.org/LICENSE_1_0.txt)
  5. *
  6. * See https://www.boost.org/libs/unordered for library home page.
  7. */
  8. #ifndef BOOST_UNORDERED_DETAIL_SERIALIZE_FCA_CONTAINER_HPP
  9. #define BOOST_UNORDERED_DETAIL_SERIALIZE_FCA_CONTAINER_HPP
  10. #include <boost/unordered/detail/serialize_container.hpp>
  11. #if defined(BOOST_UNORDERED_ENABLE_SERIALIZATION_COMPATIBILITY_V0)
  12. #define BOOST_UNORDERED_BLOCK_BOOSTDEP_HEADER \
  13. <boost/serialization/archive_input_unordered_map.hpp>
  14. #include BOOST_UNORDERED_BLOCK_BOOSTDEP_HEADER
  15. #undef BOOST_UNORDERED_BLOCK_BOOSTDEP_HEADER
  16. #define BOOST_UNORDERED_BLOCK_BOOSTDEP_HEADER \
  17. <boost/serialization/archive_input_unordered_set.hpp>
  18. #include BOOST_UNORDERED_BLOCK_BOOSTDEP_HEADER
  19. #undef BOOST_UNORDERED_BLOCK_BOOSTDEP_HEADER
  20. #define BOOST_UNORDERED_BLOCK_BOOSTDEP_HEADER \
  21. <boost/serialization/unordered_collections_load_imp.hpp>
  22. #include BOOST_UNORDERED_BLOCK_BOOSTDEP_HEADER
  23. #undef BOOST_UNORDERED_BLOCK_BOOSTDEP_HEADER
  24. #define BOOST_UNORDERED_BLOCK_BOOSTDEP_HEADER \
  25. <boost/serialization/utility.hpp>
  26. #include BOOST_UNORDERED_BLOCK_BOOSTDEP_HEADER
  27. #undef BOOST_UNORDERED_BLOCK_BOOSTDEP_HEADER
  28. #include <boost/unordered/unordered_map_fwd.hpp>
  29. #include <boost/unordered/unordered_set_fwd.hpp>
  30. #else
  31. #include <boost/throw_exception.hpp>
  32. #include <stdexcept>
  33. #endif
  34. namespace boost{
  35. namespace unordered{
  36. namespace detail{
  37. /* Support for boost::unordered_[multi](map|set) loading from legacy archives.
  38. * Until Boost 1.84, serialization of these containers was provided from
  39. * Boost.Serialization via boost/serialization/boost_unordered_(map|set).hpp,
  40. * from that release on support is native in Boost.Unordered. To enable legacy
  41. * archive loading, BOOST_UNORDERED_ENABLE_SERIALIZATION_COMPATIBILITY_V0
  42. * must be defined (it implies header dependency from Boost.Serialization).
  43. */
  44. #if defined(BOOST_UNORDERED_ENABLE_SERIALIZATION_COMPATIBILITY_V0)
  45. template<typename Archive,typename Container>
  46. struct archive_input;
  47. template<
  48. typename Archive,typename K,typename T,typename H,typename P,typename A
  49. >
  50. struct archive_input<Archive,boost::unordered_map<K,T,H,P,A> >:
  51. boost::serialization::stl::archive_input_unordered_map<
  52. Archive,
  53. boost::unordered_map<K,T,H,P,A>
  54. >
  55. {};
  56. template<
  57. typename Archive,typename K,typename T,typename H,typename P,typename A
  58. >
  59. struct archive_input<Archive,boost::unordered_multimap<K,T,H,P,A> >:
  60. boost::serialization::stl::archive_input_unordered_multimap<
  61. Archive,
  62. boost::unordered_multimap<K,T,H,P,A>
  63. >
  64. {};
  65. template<
  66. typename Archive,typename K,typename H,typename P,typename A
  67. >
  68. struct archive_input<Archive,boost::unordered_set<K,H,P,A> >:
  69. boost::serialization::stl::archive_input_unordered_set<
  70. Archive,
  71. boost::unordered_set<K,H,P,A>
  72. >
  73. {};
  74. template<
  75. typename Archive,typename K,typename H,typename P,typename A
  76. >
  77. struct archive_input<Archive,boost::unordered_multiset<K,H,P,A> >:
  78. boost::serialization::stl::archive_input_unordered_multiset<
  79. Archive,
  80. boost::unordered_multiset<K,H,P,A>
  81. >
  82. {};
  83. #else
  84. struct legacy_archive_exception:std::runtime_error
  85. {
  86. legacy_archive_exception():std::runtime_error(
  87. "Legacy archive detected, define "
  88. "BOOST_UNORDERED_ENABLE_SERIALIZATION_COMPATIBILITY_V0 to load"){}
  89. };
  90. #endif
  91. template<typename Container,bool IsSaving>
  92. struct load_or_save_fca_container;
  93. template<typename Container>
  94. struct load_or_save_fca_container<Container,true> /* save */
  95. {
  96. template<typename Archive>
  97. void operator()(Archive& ar,Container& x,unsigned int version)const
  98. {
  99. serialize_container(ar,x,version);
  100. }
  101. };
  102. template<typename Container>
  103. struct load_or_save_fca_container<Container,false> /* load */
  104. {
  105. template<typename Archive>
  106. void operator()(Archive& ar,Container& x,unsigned int version)const
  107. {
  108. if(version==0){
  109. #if defined(BOOST_UNORDERED_ENABLE_SERIALIZATION_COMPATIBILITY_V0)
  110. boost::serialization::stl::load_unordered_collection<
  111. Archive,Container,archive_input<Archive,Container>
  112. >(ar,x);
  113. #else
  114. throw_exception(legacy_archive_exception());
  115. #endif
  116. }
  117. else{
  118. serialize_container(ar,x,version);
  119. }
  120. }
  121. };
  122. template<typename Archive,typename Container>
  123. void serialize_fca_container(Archive& ar,Container& x,unsigned int version)
  124. {
  125. load_or_save_fca_container<Container,Archive::is_saving::value>()(
  126. ar,x,version);
  127. }
  128. } /* namespace detail */
  129. } /* namespace unordered */
  130. } /* namespace boost */
  131. #endif