1#ifndef FENIX_LOGGING_SERIALIZE_H
2#define FENIX_LOGGING_SERIALIZE_H
14namespace fenix::logging::serialize {
16template <
template <
typename...>
typename Base,
typename T>
20template <
template <
typename...>
typename Base,
typename T,
typename... U>
25template <
template <
typename...>
typename Base,
typename T>
28template <
template <
typename...>
typename Base,
typename T>
29using container_type_t =
typename container_type<Base, T>::type;
45template <
template <
typename...>
typename Base,
typename T>
47 container_type_v<Base, T> && writable_v<container_type_t<Base, T>>;
48template <
template <
typename...>
typename Base,
typename T>
50 container_type_v<Base, T> && readable_v<container_type_t<Base, T>>;
54void write(std::ostream& s,
const T* t,
int n);
56void write(std::ostream& s,
const T&& t);
59void read(std::istream& s, T* t,
int n);
61T read(std::istream& s);
66 requires(
const T t, std::ostream& o) { t.serialize(o); };
69template <Serializable T>
70void write(std::ostream& s,
const T& t) {
74 s.write(
static_cast<const char*
>(
static_cast<const void*
>(&t)),
sizeof(T));
85template <Deserializable T>
86void read(std::istream& s, T& t) {
90 s.read(
static_cast<char*
>(
static_cast<void*
>(&t)),
sizeof(T));
100template <SerializableVector T>
101void write(std::ostream& s,
const T& t) {
102 write<int>(s, t.size());
103 write(s, t.data(), t.size());
105template <DeserializableVector T>
106void read(std::istream& s, T& t) {
107 t.resize(read<int>(s));
108 read(s, t.data(), t.size());
117template <SerializableSet T>
118void write(std::ostream& s,
const T& st) {
119 write<int>(s, st.size());
120 for (
auto& t : st) write(s, t);
122template <DeserializableSet T>
123void read(std::istream& s, T& st) {
125 int size = read<int>(s);
126 for (
int i = 0; i < size; i++) {
127 auto [it, inserted] = st.insert(read<container_type_t<std::set, T>>(s));
138template <SerializableOptional T>
139void write(std::ostream& s,
const T& t) {
143template <DeserializableOptional T>
144void read(std::istream& s, T& t) {
146 t.emplace(read<container_type_t<std::optional, T>>(s));
153void write(std::ostream& s,
const MPI_Datatype& d);
154void read(std::istream& s, MPI_Datatype& d);
157void write(std::ostream& s,
const MPI_Op& d);
158void read(std::istream& s, MPI_Op& d);
164 std::is_same_v<T, MPI_Datatype> ||
165 std::is_same_v<T, MPI_Op>;
167template <
template <
typename...>
typename Base,
typename T,
typename... Args>
169 static constexpr bool value =
176 std::is_same_v<T, MPI_Datatype> ||
177 std::is_same_v<T, MPI_Op>;
179template <
template <
typename...>
typename Base,
typename T,
typename... Args>
187void write(std::ostream& s,
const T* t,
int n) {
191 static_cast<const char*
>(
static_cast<const void*
>(t)),
sizeof(T) * n
194 for (
int i = 0; i < n; i++) write(s, t[i]);
198void write(std::ostream& s,
const T&& t) {
203void read(std::istream& s, T* t,
int n) {
204 if constexpr (!FunctionDeserializable<T> && TriviallyCopyable<T>) {
206 s.read(
static_cast<char*
>(
static_cast<void*
>(t)),
sizeof(T) * n);
208 for (
int i = 0; i < n; i++) read(s, t[i]);
212T read(std::istream& s) {
213 if constexpr (FunctionDeserializable<T>) {
Definition serialize.h:49
Definition serialize.h:136
Definition serialize.h:115
Definition serialize.h:98
Definition serialize.h:84
Definition serialize.h:79
Definition serialize.h:65
Definition serialize.h:46
Definition serialize.h:134
Definition serialize.h:113
Definition serialize.h:96
Definition serialize.h:68
Definition serialize.h:43
Definition serialize.h:17
Definition serialize.h:174
Definition serialize.h:162