serialization.hpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. // Copyright 2015-2017 Hans Dembinski
  2. //
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // (See accompanying file LICENSE_1_0.txt
  5. // or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. #ifndef BOOST_HISTOGRAM_SERIALIZATION_HPP
  7. #define BOOST_HISTOGRAM_SERIALIZATION_HPP
  8. #include <boost/assert.hpp>
  9. #include <boost/histogram/accumulators/mean.hpp>
  10. #include <boost/histogram/accumulators/sum.hpp>
  11. #include <boost/histogram/accumulators/weighted_mean.hpp>
  12. #include <boost/histogram/accumulators/weighted_sum.hpp>
  13. #include <boost/histogram/axis/category.hpp>
  14. #include <boost/histogram/axis/integer.hpp>
  15. #include <boost/histogram/axis/regular.hpp>
  16. #include <boost/histogram/axis/variable.hpp>
  17. #include <boost/histogram/axis/variant.hpp>
  18. #include <boost/histogram/histogram.hpp>
  19. #include <boost/histogram/storage_adaptor.hpp>
  20. #include <boost/histogram/unlimited_storage.hpp>
  21. #include <boost/histogram/unsafe_access.hpp>
  22. #include <boost/mp11/tuple.hpp>
  23. #include <boost/serialization/array.hpp>
  24. #include <boost/serialization/map.hpp>
  25. #include <boost/serialization/nvp.hpp>
  26. #include <boost/serialization/string.hpp>
  27. #include <boost/serialization/variant.hpp>
  28. #include <boost/serialization/vector.hpp>
  29. #include <tuple>
  30. #include <type_traits>
  31. /**
  32. \file boost/histogram/serialization.hpp
  33. Implemenations of the serialization functions using
  34. [Boost.Serialization](https://www.boost.org/doc/libs/develop/libs/serialization/doc/index.html).
  35. */
  36. #ifndef BOOST_HISTOGRAM_DOXYGEN_INVOKED
  37. namespace std {
  38. template <class Archive, class... Ts>
  39. void serialize(Archive& ar, tuple<Ts...>& t, unsigned /* version */) {
  40. ::boost::mp11::tuple_for_each(
  41. t, [&ar](auto& x) { ar& boost::serialization::make_nvp("item", x); });
  42. }
  43. } // namespace std
  44. namespace boost {
  45. namespace histogram {
  46. namespace accumulators {
  47. template <class RealType>
  48. template <class Archive>
  49. void sum<RealType>::serialize(Archive& ar, unsigned /* version */) {
  50. ar& serialization::make_nvp("large", large_);
  51. ar& serialization::make_nvp("small", small_);
  52. }
  53. template <class RealType>
  54. template <class Archive>
  55. void weighted_sum<RealType>::serialize(Archive& ar, unsigned /* version */) {
  56. ar& serialization::make_nvp("sum_of_weights", sum_of_weights_);
  57. ar& serialization::make_nvp("sum_of_weights_squared", sum_of_weights_squared_);
  58. }
  59. template <class RealType>
  60. template <class Archive>
  61. void mean<RealType>::serialize(Archive& ar, unsigned /* version */) {
  62. ar& serialization::make_nvp("sum", sum_);
  63. ar& serialization::make_nvp("mean", mean_);
  64. ar& serialization::make_nvp("sum_of_deltas_squared", sum_of_deltas_squared_);
  65. }
  66. template <class RealType>
  67. template <class Archive>
  68. void weighted_mean<RealType>::serialize(Archive& ar, unsigned /* version */) {
  69. ar& serialization::make_nvp("sum_of_weights", sum_of_weights_);
  70. ar& serialization::make_nvp("sum_of_weights_squared", sum_of_weights_squared_);
  71. ar& serialization::make_nvp("weighted_mean", weighted_mean_);
  72. ar& serialization::make_nvp("sum_of_weighted_deltas_squared",
  73. sum_of_weighted_deltas_squared_);
  74. }
  75. } // namespace accumulators
  76. namespace axis {
  77. namespace transform {
  78. template <class Archive>
  79. void serialize(Archive&, id&, unsigned /* version */) {}
  80. template <class Archive>
  81. void serialize(Archive&, log&, unsigned /* version */) {}
  82. template <class Archive>
  83. void serialize(Archive&, sqrt&, unsigned /* version */) {}
  84. template <class Archive>
  85. void serialize(Archive& ar, pow& t, unsigned /* version */) {
  86. ar& serialization::make_nvp("power", t.power);
  87. }
  88. } // namespace transform
  89. template <class Archive>
  90. void serialize(Archive&, null_type&, unsigned /* version */) {}
  91. template <class T, class Tr, class M, class O>
  92. template <class Archive>
  93. void regular<T, Tr, M, O>::serialize(Archive& ar, unsigned /* version */) {
  94. ar& serialization::make_nvp("transform", static_cast<transform_type&>(*this));
  95. ar& serialization::make_nvp("size", size_meta_.first());
  96. ar& serialization::make_nvp("meta", size_meta_.second());
  97. ar& serialization::make_nvp("min", min_);
  98. ar& serialization::make_nvp("delta", delta_);
  99. }
  100. template <class T, class M, class O>
  101. template <class Archive>
  102. void integer<T, M, O>::serialize(Archive& ar, unsigned /* version */) {
  103. ar& serialization::make_nvp("size", size_meta_.first());
  104. ar& serialization::make_nvp("meta", size_meta_.second());
  105. ar& serialization::make_nvp("min", min_);
  106. }
  107. template <class T, class M, class O, class A>
  108. template <class Archive>
  109. void variable<T, M, O, A>::serialize(Archive& ar, unsigned /* version */) {
  110. ar& serialization::make_nvp("seq", vec_meta_.first());
  111. ar& serialization::make_nvp("meta", vec_meta_.second());
  112. }
  113. template <class T, class M, class O, class A>
  114. template <class Archive>
  115. void category<T, M, O, A>::serialize(Archive& ar, unsigned /* version */) {
  116. ar& serialization::make_nvp("seq", vec_meta_.first());
  117. ar& serialization::make_nvp("meta", vec_meta_.second());
  118. }
  119. template <class... Ts>
  120. template <class Archive>
  121. void variant<Ts...>::serialize(Archive& ar, unsigned /* version */) {
  122. ar& serialization::make_nvp("variant", impl);
  123. }
  124. } // namespace axis
  125. namespace detail {
  126. template <class Archive, class T>
  127. void serialize(Archive& ar, vector_impl<T>& impl, unsigned /* version */) {
  128. ar& serialization::make_nvp("vector", static_cast<T&>(impl));
  129. }
  130. template <class Archive, class T>
  131. void serialize(Archive& ar, array_impl<T>& impl, unsigned /* version */) {
  132. ar& serialization::make_nvp("size", impl.size_);
  133. ar& serialization::make_nvp("array",
  134. serialization::make_array(&impl.front(), impl.size_));
  135. }
  136. template <class Archive, class T>
  137. void serialize(Archive& ar, map_impl<T>& impl, unsigned /* version */) {
  138. ar& serialization::make_nvp("size", impl.size_);
  139. ar& serialization::make_nvp("map", static_cast<T&>(impl));
  140. }
  141. template <class Archive, class Allocator>
  142. void serialize(Archive& ar, mp_int<Allocator>& x, unsigned /* version */) {
  143. ar& serialization::make_nvp("data", x.data);
  144. }
  145. } // namespace detail
  146. template <class Archive, class T>
  147. void serialize(Archive& ar, storage_adaptor<T>& s, unsigned /* version */) {
  148. ar& serialization::make_nvp("impl", static_cast<detail::storage_adaptor_impl<T>&>(s));
  149. }
  150. template <class A>
  151. template <class Archive>
  152. void unlimited_storage<A>::serialize(Archive& ar, unsigned /* version */) {
  153. if (Archive::is_loading::value) {
  154. buffer_type dummy(buffer.alloc);
  155. std::size_t size;
  156. ar& serialization::make_nvp("type", dummy.type);
  157. ar& serialization::make_nvp("size", size);
  158. dummy.apply([this, size](auto* tp) {
  159. BOOST_ASSERT(tp == nullptr);
  160. using T = detail::remove_cvref_t<decltype(*tp)>;
  161. buffer.template make<T>(size);
  162. });
  163. } else {
  164. ar& serialization::make_nvp("type", buffer.type);
  165. ar& serialization::make_nvp("size", buffer.size);
  166. }
  167. buffer.apply([this, &ar](auto* tp) {
  168. using T = detail::remove_cvref_t<decltype(*tp)>;
  169. ar& serialization::make_nvp(
  170. "buffer",
  171. serialization::make_array(reinterpret_cast<T*>(buffer.ptr), buffer.size));
  172. });
  173. }
  174. template <class Archive, class A, class S>
  175. void serialize(Archive& ar, histogram<A, S>& h, unsigned /* version */) {
  176. ar& serialization::make_nvp("axes", unsafe_access::axes(h));
  177. ar& serialization::make_nvp("storage", unsafe_access::storage(h));
  178. }
  179. } // namespace histogram
  180. } // namespace boost
  181. #endif
  182. #endif