// Copyright 2015-2017 Hans Dembinski // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt // or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_HISTOGRAM_SERIALIZATION_HPP #define BOOST_HISTOGRAM_SERIALIZATION_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** \file boost/histogram/serialization.hpp Implemenations of the serialization functions using [Boost.Serialization](https://www.boost.org/doc/libs/develop/libs/serialization/doc/index.html). */ #ifndef BOOST_HISTOGRAM_DOXYGEN_INVOKED namespace std { template void serialize(Archive& ar, tuple& t, unsigned /* version */) { ::boost::mp11::tuple_for_each( t, [&ar](auto& x) { ar& boost::serialization::make_nvp("item", x); }); } } // namespace std namespace boost { namespace histogram { namespace accumulators { template template void sum::serialize(Archive& ar, unsigned /* version */) { ar& serialization::make_nvp("large", large_); ar& serialization::make_nvp("small", small_); } template template void weighted_sum::serialize(Archive& ar, unsigned /* version */) { ar& serialization::make_nvp("sum_of_weights", sum_of_weights_); ar& serialization::make_nvp("sum_of_weights_squared", sum_of_weights_squared_); } template template void mean::serialize(Archive& ar, unsigned /* version */) { ar& serialization::make_nvp("sum", sum_); ar& serialization::make_nvp("mean", mean_); ar& serialization::make_nvp("sum_of_deltas_squared", sum_of_deltas_squared_); } template template void weighted_mean::serialize(Archive& ar, unsigned /* version */) { ar& serialization::make_nvp("sum_of_weights", sum_of_weights_); ar& serialization::make_nvp("sum_of_weights_squared", sum_of_weights_squared_); ar& serialization::make_nvp("weighted_mean", weighted_mean_); ar& serialization::make_nvp("sum_of_weighted_deltas_squared", sum_of_weighted_deltas_squared_); } } // namespace accumulators namespace axis { namespace transform { template void serialize(Archive&, id&, unsigned /* version */) {} template void serialize(Archive&, log&, unsigned /* version */) {} template void serialize(Archive&, sqrt&, unsigned /* version */) {} template void serialize(Archive& ar, pow& t, unsigned /* version */) { ar& serialization::make_nvp("power", t.power); } } // namespace transform template void serialize(Archive&, null_type&, unsigned /* version */) {} template template void regular::serialize(Archive& ar, unsigned /* version */) { ar& serialization::make_nvp("transform", static_cast(*this)); ar& serialization::make_nvp("size", size_meta_.first()); ar& serialization::make_nvp("meta", size_meta_.second()); ar& serialization::make_nvp("min", min_); ar& serialization::make_nvp("delta", delta_); } template template void integer::serialize(Archive& ar, unsigned /* version */) { ar& serialization::make_nvp("size", size_meta_.first()); ar& serialization::make_nvp("meta", size_meta_.second()); ar& serialization::make_nvp("min", min_); } template template void variable::serialize(Archive& ar, unsigned /* version */) { ar& serialization::make_nvp("seq", vec_meta_.first()); ar& serialization::make_nvp("meta", vec_meta_.second()); } template template void category::serialize(Archive& ar, unsigned /* version */) { ar& serialization::make_nvp("seq", vec_meta_.first()); ar& serialization::make_nvp("meta", vec_meta_.second()); } template template void variant::serialize(Archive& ar, unsigned /* version */) { ar& serialization::make_nvp("variant", impl); } } // namespace axis namespace detail { template void serialize(Archive& ar, vector_impl& impl, unsigned /* version */) { ar& serialization::make_nvp("vector", static_cast(impl)); } template void serialize(Archive& ar, array_impl& impl, unsigned /* version */) { ar& serialization::make_nvp("size", impl.size_); ar& serialization::make_nvp("array", serialization::make_array(&impl.front(), impl.size_)); } template void serialize(Archive& ar, map_impl& impl, unsigned /* version */) { ar& serialization::make_nvp("size", impl.size_); ar& serialization::make_nvp("map", static_cast(impl)); } template void serialize(Archive& ar, mp_int& x, unsigned /* version */) { ar& serialization::make_nvp("data", x.data); } } // namespace detail template void serialize(Archive& ar, storage_adaptor& s, unsigned /* version */) { ar& serialization::make_nvp("impl", static_cast&>(s)); } template template void unlimited_storage::serialize(Archive& ar, unsigned /* version */) { if (Archive::is_loading::value) { buffer_type dummy(buffer.alloc); std::size_t size; ar& serialization::make_nvp("type", dummy.type); ar& serialization::make_nvp("size", size); dummy.apply([this, size](auto* tp) { BOOST_ASSERT(tp == nullptr); using T = detail::remove_cvref_t; buffer.template make(size); }); } else { ar& serialization::make_nvp("type", buffer.type); ar& serialization::make_nvp("size", buffer.size); } buffer.apply([this, &ar](auto* tp) { using T = detail::remove_cvref_t; ar& serialization::make_nvp( "buffer", serialization::make_array(reinterpret_cast(buffer.ptr), buffer.size)); }); } template void serialize(Archive& ar, histogram& h, unsigned /* version */) { ar& serialization::make_nvp("axes", unsafe_access::axes(h)); ar& serialization::make_nvp("storage", unsafe_access::storage(h)); } } // namespace histogram } // namespace boost #endif #endif