2#ifndef TTG_SERIALIZATION_DATA_DESCRIPTOR_H
3#define TTG_SERIALIZATION_DATA_DESCRIPTOR_H
7#ifdef TTG_SERIALIZATION_SUPPORTS_MADNESS
8#include <madness/world/buffer_archive.h>
37 uint64_t (*
pack_payload)(
const void *object, uint64_t max_nbytes_to_write, uint64_t offset,
void *buf);
45 uint64_t (*
unpack_payload)(
void *object, uint64_t max_nbytes_to_read, uint64_t offset,
const void *buf);
47 void (*
print)(
const void *object);
60 template <
typename T,
typename Enabler =
void>
67 T,
std::enable_if_t<detail::is_memcpyable_v<T> && !detail::is_user_buffer_serializable_v<T> &&
68 !ttg::has_split_metadata<T>::value>> {
69 static constexpr const bool serialize_size_is_const =
true;
74 static uint64_t
payload_size(
const void *
object) {
return static_cast<uint64_t
>(
sizeof(T)); }
82 static uint64_t
pack_payload(
const void *
object, uint64_t max_nbytes_to_write, uint64_t begin,
void *buf) {
83 unsigned char *char_buf =
reinterpret_cast<unsigned char *
>(buf);
84 assert(
sizeof(T)<=max_nbytes_to_write);
85 std::memcpy(&char_buf[begin],
object,
sizeof(T));
86 return begin +
sizeof(T);
95 static uint64_t
unpack_payload(
void *
object, uint64_t max_nbytes_to_read, uint64_t begin,
const void *buf) {
96 const unsigned char *char_buf =
reinterpret_cast<const unsigned char *
>(buf);
97 assert(
sizeof(T)<=max_nbytes_to_read);
98 std::memcpy(
object, &char_buf[begin],
sizeof(T));
99 return begin +
sizeof(T);
105 template <
typename T>
107 static constexpr const bool serialize_size_is_const =
false;
114 const T *t =
reinterpret_cast<T *
>(object);
115 auto metadata = smd.get_metadata(t);
116 size_t size =
sizeof(metadata);
117 for (
auto &&
iovec : smd.get_data(t)) {
121 return static_cast<uint64_t
>(
size);
130 static uint64_t
pack_payload(
const void *
object, uint64_t max_nbytes_to_write, uint64_t begin,
void *buf) {
132 const T *t =
reinterpret_cast<T *
>(object);
134 unsigned char *char_buf =
reinterpret_cast<unsigned char *
>(buf);
135 auto metadata = smd.get_metadata(t);
136 assert(
sizeof(metadata) <= max_nbytes_to_write);
137 std::memcpy(&char_buf[begin], metadata,
sizeof(metadata));
138 size_t pos =
sizeof(metadata);
139 for (
auto &&
iovec : smd.get_data(t)) {
142 assert(pos <= max_nbytes_to_write);
153 static uint64_t
unpack_payload(
void *
object, uint64_t max_nbytes_to_read, uint64_t begin,
const void *buf) {
155 T *t =
reinterpret_cast<T *
>(object);
157 using metadata_t =
decltype(smd.get_metadata(t));
158 assert(
sizeof(metadata_t) <= max_nbytes_to_read);
159 const unsigned char *char_buf =
reinterpret_cast<const unsigned char *
>(buf);
160 const metadata_t *metadata =
reinterpret_cast<const metadata_t *
>(char_buf + begin);
161 T t_created = smd.create_from_metadata();
162 size_t pos =
sizeof(metadata);
164 for (
auto &&
iovec : smd.get_data(t)) {
167 assert(pos <= max_nbytes_to_read);
175#if defined(TTG_SERIALIZATION_SUPPORTS_MADNESS)
180 template <
typename T>
181 struct default_data_descriptor<
182 T,
std::enable_if_t<((!detail::is_memcpyable_v<T> && detail::is_madness_buffer_serializable_v<T>) ||
183 detail::is_madness_user_buffer_serializable_v<T>)&&!ttg::has_split_metadata<T>::value>> {
184 static constexpr const bool serialize_size_is_const =
false;
189 static uint64_t payload_size(
const void *
object) {
190 madness::archive::BufferOutputArchive ar;
191 ar & (*
static_cast<std::add_pointer_t<std::add_const_t<T>
>>(object));
192 return static_cast<uint64_t
>(ar.size());
201 static uint64_t pack_payload(
const void *
object, uint64_t max_nbytes_to_write, uint64_t pos,
void *_buf) {
202 unsigned char *buf =
reinterpret_cast<unsigned char *
>(_buf);
203 madness::archive::BufferOutputArchive ar(&buf[pos], max_nbytes_to_write);
204 ar & (*
static_cast<std::add_pointer_t<std::add_const_t<T>
>>(object));
205 return pos + ar.size();
214 static uint64_t unpack_payload(
void *
object, uint64_t max_nbytes_to_read, uint64_t pos,
const void *_buf) {
215 const unsigned char *buf =
reinterpret_cast<const unsigned char *
>(_buf);
216 madness::archive::BufferInputArchive ar(&buf[pos], max_nbytes_to_read);
217 ar & (*
static_cast<std::add_pointer_t<T>
>(object));
218 return pos + (max_nbytes_to_read - ar.nbyte_avail());
226#if defined(TTG_SERIALIZATION_SUPPORTS_BOOST)
233 template <
typename T>
234 struct default_data_descriptor<
235 T,
std::enable_if_t<(!detail::is_memcpyable_v<T> && !detail::is_madness_buffer_serializable_v<T> &&
236 detail::is_boost_buffer_serializable_v<T>) ||
237 (!detail::is_madness_user_buffer_serializable_v<T> &&
238 detail::is_boost_user_buffer_serializable_v<T>)>> {
239 static constexpr const bool serialize_size_is_const =
false;
244 static uint64_t payload_size(
const void *
object) {
246 oa << (*
static_cast<std::add_pointer_t<std::add_const_t<T>
>>(object));
247 return oa.streambuf().size();
256 static uint64_t pack_payload(
const void *
object, uint64_t max_nbytes_to_write, uint64_t pos,
void *buf) {
258 oa << (*
static_cast<std::add_pointer_t<std::add_const_t<T>
>>(object));
259 assert(oa.streambuf().size() <= max_nbytes_to_write);
260 return pos + oa.streambuf().size();
269 static uint64_t unpack_payload(
void *
object, uint64_t max_nbytes_to_read, uint64_t pos,
const void *buf) {
271 ia >> (*
static_cast<std::add_pointer_t<T>
>(object));
272 assert(ia.streambuf().size() <= max_nbytes_to_read);
273 return pos + ia.streambuf().size();
285 template <
typename T>
optimized data-only serializer
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
auto make_boost_buffer_oarchive(void *const buf, std::size_t size, std::size_t buf_offset=0)
constructs a boost_buffer_oarchive object
top-level TTG namespace contains runtime-neutral functionality
const ttg_data_descriptor * get_data_descriptor()
int size(World world=default_execution_context())
static uint64_t unpack_payload(void *object, uint64_t max_nbytes_to_read, uint64_t begin, const void *buf)
deserializes object from a buffer
static uint64_t payload_size(const void *object)
measures the size of the binary representation of object
static uint64_t pack_payload(const void *object, uint64_t max_nbytes_to_write, uint64_t begin, void *buf)
serializes object to a buffer
static uint64_t unpack_payload(void *object, uint64_t max_nbytes_to_read, uint64_t begin, const void *buf)
deserializes object from a buffer
static uint64_t pack_payload(const void *object, uint64_t max_nbytes_to_write, uint64_t begin, void *buf)
serializes object to a buffer
static uint64_t payload_size(const void *object)
measures the size of the binary representation of object
Provides (de)serialization of C++ data that can be invoked from C via ttg_data_descriptor.
std::size_t num_bytes
The number of bytes to read from / write to the memory location given by data.
void * data
Pointer to the data to be read from / written to.
uint64_t(* pack_payload)(const void *object, uint64_t max_nbytes_to_write, uint64_t offset, void *buf)
serializes object to a buffer
uint64_t(* payload_size)(const void *object)
measures the size of the binary representation of object
uint64_t(* unpack_payload)(void *object, uint64_t max_nbytes_to_read, uint64_t offset, const void *buf)
deserializes object from a buffer
void(* print)(const void *object)