22#include <boost/mpl/bool.hpp>
23#include <boost/serialization/is_bitwise_serializable.hpp>
24#include <boost/serialization/nvp.hpp>
25#include <boost/serialization/serialization.hpp>
48 std::is_trivially_copyable_v<T> or
49 boost::serialization::is_bitwise_serializable<T>::value> {};
55 std::bool_constant<std::is_trivially_copyable_v<T> or
56 boost::serialization::is_bitwise_serializable<T>::value>;
60using use_serialize = std::bool_constant<not use_memcpy<T>::value and
63template <
class Derived>
class BasicMemcpyArchive {
71 explicit BasicMemcpyArchive(std::span<char> buf)
72 : buf(buf), insert(buf.data()) {}
75 auto get_library_version()
const {
return std::size_t{4}; }
77 auto bytes_processed()
const {
78 return static_cast<std::size_t
>(insert - buf.data());
81 void skip(std::size_t bytes) {
82 assert((insert + bytes) <= &*buf.end());
87 void read(
void *data, std::size_t bytes) {
89 assert((insert + bytes) <= &*buf.end());
90 std::memcpy(data, insert, bytes);
94 void write(
const void *data, std::size_t bytes) {
96 assert((insert + bytes) <= &*buf.end());
97 std::memcpy(insert, data, bytes);
102 template <
typename T>
103 auto operator>>(T &value) -> std::enable_if_t<use_memcpy<T>::value> {
104 read(&value,
sizeof(T));
107 template <
typename T>
108 auto operator<<(T
const &value) -> std::enable_if_t<use_memcpy<T>::value> {
109 write(&value,
sizeof(T));
113 template <
class T>
void process(T &value) {
114 auto const old_pos = insert;
115 boost::serialization::serialize_adl(*
static_cast<Derived *
>(
this), value,
117 auto const new_pos = insert;
118 assert(
static_cast<std::size_t
>(new_pos - old_pos) <=
sizeof(T));
120 auto const padding_size =
sizeof(T) - (new_pos - old_pos);
127 operator>>(T &value) -> std::enable_if_t<detail::use_serialize<T>::value> {
133 operator<<(T &value) -> std::enable_if_t<detail::use_serialize<T>::value> {
137 template <
class T>
void operator<<(
const boost::serialization::nvp<T> &nvp) {
138 operator<<(nvp.const_value());
141 template <
class T>
void operator>>(
const boost::serialization::nvp<T> &nvp) {
142 operator>>(nvp.value());
150 template <
class T>
static constexpr std::size_t packing_size() {
167 using base_type = detail::BasicMemcpyArchive<MemcpyIArchive>;
185 using base_type::packing_size;
186 using base_type::operator>>;
201 using base_type = detail::BasicMemcpyArchive<MemcpyOArchive>;
219 using base_type::packing_size;
220 using base_type::operator<<;
Archive that deserializes from a buffer via memcpy.
boost::mpl::true_ is_loading
MemcpyIArchive & operator&(T &value)
std::size_t bytes_read() const
Number of bytes read from the buffer.
MemcpyIArchive(std::span< char > buf)
boost::mpl::false_ is_saving
Archive that serializes to a buffer via memcpy.
boost::mpl::false_ is_loading
MemcpyOArchive(std::span< char > buf)
std::size_t bytes_written() const
Number of bytes written to the buffer.
MemcpyOArchive & operator&(T &value)
boost::mpl::true_ is_saving
static std::basic_ostream< char > & operator<<(std::basic_ostream< char > &os, const dim3 &dim)
Type trait to indicate that a type is serializable with a static size, e.g.