6#ifndef TTG_SERIALIZATION_BACKENDS_BOOST_ARCHIVE_H
7#define TTG_SERIALIZATION_BACKENDS_BOOST_ARCHIVE_H
9#include <boost/archive/binary_iarchive.hpp>
10#include <boost/archive/binary_oarchive.hpp>
11#include <boost/iostreams/device/array.hpp>
12#include <boost/iostreams/stream.hpp>
15#include <boost/archive/impl/basic_binary_iarchive.ipp>
16#include <boost/archive/impl/basic_binary_iprimitive.ipp>
17#include <boost/archive/impl/basic_binary_oarchive.ipp>
18#include <boost/archive/impl/basic_binary_oprimitive.ipp>
23 template <
typename Archive,
typename T>
25 if constexpr (boost::is_array<T>::value) {
26 boost::archive::detail::save_array_type<Archive>::invoke(ar, t);
28 }
else if constexpr (boost::is_enum<T>::value) {
29 boost::archive::detail::save_enum_type<Archive>::invoke(ar, t);
32 std::conditional_t<boost::is_pointer<T>::value, T, std::add_pointer_t<const T>> tptr;
33 if constexpr (boost::is_pointer<T>::value) {
34 static_assert(!std::is_polymorphic_v<T>,
35 "oarchive_save_override does not support serialization of polymorphic types");
39 if constexpr (boost::mpl::equal_to<boost::serialization::implementation_level<T>,
40 boost::mpl::int_<boost::serialization::primitive_type>>::value) {
41 boost::archive::detail::save_non_pointer_type<Archive>::save_primitive::invoke(ar, *tptr);
43 boost::archive::detail::save_non_pointer_type<Archive>::save_only::invoke(ar, *tptr);
48 template <
typename Archive,
typename T>
50 if constexpr (boost::is_array<T>::value) {
51 boost::archive::detail::load_array_type<Archive>::invoke(ar, t);
53 }
else if constexpr (boost::is_enum<T>::value) {
54 boost::archive::detail::load_enum_type<Archive>::invoke(ar, t);
57 std::conditional_t<boost::is_pointer<T>::value, T, std::add_pointer_t<T>> tptr;
58 if constexpr (boost::is_pointer<T>::value) {
59 static_assert(!std::is_polymorphic_v<T>,
60 "iarchive_load_override_optimized_dispatch does not support serialization of polymorphic types");
61 using Value = std::remove_pointer_t<T>;
62 std::allocator<Value> alloc;
63 auto* buf = alloc.allocate(
sizeof(Value));
68 if constexpr (boost::mpl::equal_to<boost::serialization::implementation_level<T>,
69 boost::mpl::int_<boost::serialization::primitive_type>>::value) {
70 boost::archive::detail::load_non_pointer_type<Archive>::load_primitive::invoke(ar, *tptr);
72 boost::archive::detail::load_non_pointer_type<Archive>::load_only::invoke(ar, *tptr);
91 template <
typename StreamOrStreambuf>
93 :
private StreamOrStreambuf,
94 public boost::archive::binary_oarchive_impl<boost_optimized_oarchive<StreamOrStreambuf>,
95 std::ostream::char_type, std::ostream::traits_type> {
98 using base_type = boost::archive::binary_oarchive_impl<boost_optimized_oarchive<StreamOrStreambuf>,
99 std::ostream::char_type, std::ostream::traits_type>;
105 friend class boost::archive::detail::common_oarchive<StreamOrStreambuf>;
108 const auto& pbase()
const {
return static_cast<const pbase_type&
>(*this); }
109 auto& pbase() {
return static_cast<pbase_type&
>(*this); }
110 const auto& base()
const {
return static_cast<const base_type&
>(*this); }
111 auto& base() {
return static_cast<base_type&
>(*this); }
121 template <
typename Arg>
144 void save_object(
const void* x,
const boost::archive::detail::basic_oserializer& bos) {
abort(); }
159 BOOST_ASSERT(0 ==
static_cast<int>(t) || 1 ==
static_cast<int>(t));
166 template <
class ValueType>
167 void save_array(boost::serialization::array_wrapper<ValueType>
const& a,
unsigned int)
169 save_binary(a.address(),a.count()*
sizeof(ValueType));
174 using Elem = std::ostream::char_type;
175 static_assert(
sizeof(Elem) == 1);
176 count = (count +
sizeof(Elem) - 1) /
sizeof(Elem);
177 std::streamsize scount =
static_cast<StreamOrStreambuf&
>(this->pbase())
178 .sputn(
static_cast<const Elem*
>(address),
static_cast<std::streamsize
>(count));
179 assert(count ==
static_cast<std::size_t
>(scount));
183 this->base().save_binary(address, count);
203 return static_cast<const StreamOrStreambuf&
>(this->pbase());
206 return this->pbase();
209 const auto&
stream()
const {
return this->pbase(); }
232 assert(buf_offset <=
size);
242 template <std::
size_t N>
244 assert(buf_offset <= N);
249 template <
typename StreamOrStreambuf>
251 :
private StreamOrStreambuf,
252 public boost::archive::binary_iarchive_impl<boost_optimized_iarchive<StreamOrStreambuf>,
253 std::ostream::char_type, std::ostream::traits_type> {
257 std::ostream::traits_type>;
266 const auto& pbase()
const {
return static_cast<const pbase_type&
>(*this); }
267 auto& pbase() {
return static_cast<pbase_type&
>(*this); }
268 const auto& base()
const {
return static_cast<const base_type&
>(*this); }
269 auto& base() {
return static_cast<base_type&
>(*this); }
279 template <
typename Arg>
302 void load_object(
void* x,
const boost::archive::detail::basic_oserializer& bos) {
abort(); }
320 BOOST_ASSERT(0 == i || 1 == i);
327 template <
class ValueType>
328 void load_array(boost::serialization::array_wrapper<ValueType>& a,
unsigned int)
330 load_binary(a.address(),a.count()*
sizeof(ValueType));
338 using Elem = std::ostream::char_type;
339 static_assert(
sizeof(Elem) == 1);
340 std::streamsize s =
static_cast<std::streamsize
>(count);
341 std::streamsize scount =
static_cast<StreamOrStreambuf&
>(this->pbase()).sgetn(
static_cast<Elem*
>(address), s);
342 assert(scount == count);
346 this->base().load_binary(address, count);
366 return static_cast<const StreamOrStreambuf&
>(this->pbase());
369 return this->pbase();
372 const auto&
stream()
const {
return this->pbase(); }
392 assert(buf_offset <=
size);
402 template <std::
size_t N>
404 assert(buf_offset <= N);
412#define BOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION_FOR_THIS_AND_BASE(x) \
413 BOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION(x); \
414 BOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION(x::base_type);
431#undef BOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION_FOR_THIS_AND_BASE
BOOST_SERIALIZATION_REGISTER_ARCHIVE(ttg::detail::boost_counting_oarchive)
#define BOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION_FOR_THIS_AND_BASE(x)
optimized data-only deserializer for boost_optimized_oarchive
void load_override(boost::archive::class_id_type &t)
const auto & streambuf() const
void load_binary(void *address, std::size_t count)
boost::archive::binary_iarchive_impl< boost_optimized_iarchive, std::ostream::char_type, std::ostream::traits_type > base_type
StreamOrStreambuf pbase_type
void load_override(boost::archive::version_type &t)
void load_array(boost::serialization::array_wrapper< ValueType > &a, unsigned int)
boost_optimized_iarchive(StreamOrStreambuf sbuf)
void load_object(void *x, const boost::archive::detail::basic_oserializer &bos)
boost_optimized_iarchive()
void load_override(boost::serialization::item_version_type &t)
void load_override(boost::archive::class_id_reference_type &t)
friend class boost::archive::save_access
void load_override(boost::archive::class_id_optional_type &)
boost_optimized_iarchive(Arg &&arg)
const auto & stream() const
static constexpr bool pbase_derived_from_stdstreambuf
optimized data-only serializer
const auto & stream() const
void save_binary(const void *address, std::size_t count)
void save_override(const boost::archive::version_type &t)
StreamOrStreambuf pbase_type
static constexpr bool pbase_derived_from_stdstreambuf
auto & operator<<(const T &t)
void save_override(const boost::archive::class_id_reference_type &t)
void save_override(const boost::serialization::item_version_type &t)
void save_override(const T &t)
boost_optimized_oarchive(Arg &&arg)
void save_override(const boost::archive::class_id_type &t)
auto & operator&(const T &t)
void save_override(const boost::archive::class_id_optional_type &)
boost_optimized_oarchive(StreamOrStreambuf sbuf)
const auto & streambuf() const
void save_object(const void *x, const boost::archive::detail::basic_oserializer &bos)
friend class boost::archive::save_access
boost::archive::binary_oarchive_impl< boost_optimized_oarchive< StreamOrStreambuf >, std::ostream::char_type, std::ostream::traits_type > base_type
void save_array(boost::serialization::array_wrapper< ValueType > const &a, unsigned int)
boost_optimized_oarchive()
streambuf that writes bytes to a buffer in memory
streambuf that writes bytes to a buffer in memory
void oarchive_save_override_optimized_dispatch(Archive &ar, const T &t)
auto make_boost_buffer_iarchive(const void *const buf, std::size_t size, std::size_t buf_offset=0)
constructs a boost_buffer_iarchive object
boost_optimized_oarchive< byte_ostreambuf > boost_byte_oarchive
an archive that constructs serialized representation of an object in a memory buffer,...
auto make_boost_buffer_oarchive(void *const buf, std::size_t size, std::size_t buf_offset=0)
constructs a boost_buffer_oarchive object
void iarchive_load_override_optimized_dispatch(Archive &ar, T &t)
boost_optimized_iarchive< byte_istreambuf > boost_byte_iarchive
the deserializer for boost_byte_oarchive
int size(World world=default_execution_context())
void abort()
Aborts the TTG program using the default backend's ttg_abort method.