/usr/include/boost/histogram/detail
Edit: /usr/include/boost/histogram/detail/array_wrapper.hpp (2050B)
// Copyright 2019 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_DETAIL_ARRAY_WRAPPER_HPP
#define BOOST_HISTOGRAM_DETAIL_ARRAY_WRAPPER_HPP
#include
#include
#include
#include
#include
#include
namespace boost {
namespace histogram {
namespace detail {
template )>
struct has_save_array_impl;
template )>
struct has_load_array_impl;
template
using has_array_optimization = mp11::mp_or,
mp11::mp_valid>;
template
struct array_wrapper {
using pointer = T*;
pointer ptr;
std::size_t size;
template
void serialize(Archive& ar, unsigned /* version */) {
static_if_c<(has_array_optimization::value &&
std::is_trivially_copyable::value)>(
[this](auto& ar) {
// cannot use and therefore bypass save_array / load_array interface, because
// it requires exact type boost::serialization::array_wrapper
static_if_c(
[this](auto& ar) { ar.load_binary(this->ptr, sizeof(T) * this->size); },
[this](auto& ar) { ar.save_binary(this->ptr, sizeof(T) * this->size); },
ar);
},
[this](auto& ar) {
for (auto&& x : boost::histogram::detail::make_span(this->ptr, this->size))
ar& make_nvp("item", x);
},
ar);
}
};
template
auto make_array_wrapper(T* t, std::size_t s) {
return array_wrapper{t, s};
}
} // namespace detail
} // namespace histogram
} // namespace boost
#endif