21 #ifndef SERIALIZER_HPP 22 #define SERIALIZER_HPP 33 #include <type_traits> 34 #include <unordered_map> 35 #include <unordered_set> 41 namespace Dune {
template<
typename,
int>
class FieldVector; }
45 namespace Dune {
template<
typename,
typename>
class BlockVector; }
51 template<
typename ...Ts>
55 template<std::size_t Index,
typename,
typename ...Rest>
56 static decltype(
auto) make_variant(std::size_t index)
59 return std::variant<Ts...>{std::in_place_index_t<Index>{}};
61 if constexpr(
sizeof...(Rest) != 0)
62 return make_variant<Index + 1, Rest...>(index);
64 throw std::runtime_error(
"Invalid variant index");
69 template<
typename ...Ts>
70 decltype(
auto) make_variant(
std::
size_t index)
76 using remove_cvr_t = std::remove_cv_t<std::remove_reference_t<T>>;
85 constexpr
bool is_pod_v = std::is_standard_layout_v<T> && std::is_trivial_v<T>;
94 template<
class Packer>
128 const_cast<T&
>(data).serializeOp(*
this);
160 template<
class... Args>
166 variadic_call(data...);
171 variadic_call(data...);
191 template<
class... Args>
197 variadic_call(data...);
217 template <
typename Vector>
220 if constexpr (detail::is_pod_v<typename Vector::value_type>) {
222 (*this)(data.size());
223 if (data.size() > 0) {
227 (*this)(data.size());
228 if (data.size() > 0) {
232 std::size_t size = 0;
234 auto& data_mut =
const_cast<Vector&
>(data);
235 data_mut.resize(size);
242 std::size_t size = 0;
244 auto& data_mut =
const_cast<Vector&
>(data);
245 data_mut.resize(size);
246 std::ranges::for_each(data_mut, std::ref(*
this));
248 (*this)(data.size());
249 std::ranges::for_each(data, std::ref(*
this));
256 void vector(
const std::vector<bool>& data)
259 std::size_t size = 0;
261 auto& data_mut =
const_cast<std::vector<bool>&
>(data);
263 data_mut.reserve(size);
264 for (std::size_t i = 0; i < size; ++i) {
267 data_mut.push_back(entry);
270 (*this)(data.size());
271 for (
const auto entry : data) {
280 template <
class Array>
283 using T =
typename Array::value_type;
285 if constexpr (detail::is_pod_v<T>) {
291 auto& data_mut =
const_cast<Array&
>(data);
295 std::ranges::for_each(data, std::ref(*
this));
301 template<
class... Args>
302 void variant(
const std::variant<Args...>& data)
305 std::size_t index = 0;
307 auto& data_mut =
const_cast<std::variant<Args...
>&>(data);
308 data_mut = detail::make_variant<Args...>(index);
309 std::visit(std::ref(*
this), data_mut);
311 (*this)(data.index());
312 std::visit(std::ref(*
this), data);
328 const_cast<std::optional<T>&
>(data) = res;
330 const_cast<std::optional<T>&
>(data) = std::nullopt;
333 (*this)(data.has_value());
334 if (data.has_value()) {
342 template<
class Tuple>
355 std::size_t size = 0;
357 auto& data_mut =
const_cast<Map&
>(data);
358 for (std::size_t i = 0; i < size; ++i) {
359 typename Map::value_type entry;
361 data_mut.insert(std::move(entry));
364 (*this)(data.size());
365 std::ranges::for_each(data, std::ref(*
this));
373 void set(
const Set& data)
376 std::size_t size = 0;
378 auto& data_mut =
const_cast<Set&
>(data);
379 for (std::size_t i = 0; i < size; ++i) {
380 typename Set::value_type entry{};
382 data_mut.insert(entry);
385 (*this)(data.size());
386 std::ranges::for_each(data, std::ref(*
this));
390 template<
typename T,
typename... Args>
391 void variadic_call(T& first,
395 if constexpr (
sizeof...(args) > 0)
396 variadic_call(
std::forward<Args>(args)...);
399 template<
std::
size_t I = 0, typename Tuple>
400 typename
std::enable_if<I ==
std::tuple_size<Tuple>::
value,
void>::type
401 tuple_call(const Tuple&)
405 template<std::
size_t I = 0,
typename Tuple>
406 typename std::enable_if<I != std::tuple_size<Tuple>::value,
void>::type
407 tuple_call(
const Tuple&
tuple)
409 (*this)(std::get<I>(
tuple));
410 tuple_call<I+1>(
tuple);
423 constexpr
static bool value =
false;
426 template<
class T1,
class Allocator>
428 constexpr
static bool value =
true;
432 template<
class T1,
class Allocator>
434 constexpr
static bool value =
true;
441 constexpr
static bool value =
false;
444 template<
class... Ts>
446 constexpr
static bool value =
true;
452 constexpr
static bool value =
false;
455 template<
class... Ts>
457 constexpr
static bool value =
true;
460 template<
class T1,
class T2>
462 constexpr
static bool value =
true;
468 constexpr
static bool value =
false;
473 constexpr
static bool value =
true;
476 template<
class T1,
class Deleter>
478 constexpr
static bool value =
true;
484 constexpr
static bool value =
false;
489 constexpr
static bool value =
true;
495 constexpr
static bool value =
false;
498 template<
class Key,
class T,
class Compare,
class Allocator>
500 constexpr
static bool value =
true;
503 template<
class Key,
class T,
class Hash,
class KeyEqual,
class Allocator>
504 struct is_map<
std::unordered_map<Key,T,Hash,KeyEqual,Allocator>> {
505 constexpr
static bool value =
true;
511 constexpr
static bool value =
false;
514 template<
class Key,
class Compare,
class Allocator>
516 constexpr
static bool value =
true;
519 template<
class Key,
class Hash,
class KeyEqual,
class Allocator>
520 struct is_set<
std::unordered_set<Key,Hash,KeyEqual,Allocator>> {
521 constexpr
static bool value =
true;
527 constexpr
static bool value =
false;
530 template<
class T, std::
size_t N>
532 constexpr
static bool value =
true;
536 template<
class T,
int N>
538 constexpr
static bool value =
true;
545 template <
typename,
class =
void>
552 template <
typename T>
554 T,
std::void_t<decltype(std::declval<T>().serializeOp(std::declval<Serializer<Packer>&>()))>
555 > :
public std::true_type {};
558 template<
class PtrType>
561 using T1 =
typename PtrType::element_type;
562 std::uintptr_t data_ptr =
reinterpret_cast<std::uintptr_t
>(data.get());
567 if (
m_ptrmap.count(data_ptr) == 0) {
572 if (
m_ptrmap.count(data_ptr) == 0) {
573 const_cast<PtrType&
>(data) = std::make_shared<T1>();
574 m_ptrmap[data_ptr] = std::static_pointer_cast<
void>(data);
577 const_cast<PtrType&
>(data) = std::static_pointer_cast<T1>(
m_ptrmap[data_ptr]);
582 template<
class PtrType>
583 void unique_ptr(
const PtrType& data)
585 using T1 =
typename PtrType::element_type;
588 (*this)(data ? 1 : 0);
596 const_cast<PtrType&
>(data) = std::make_unique<T1>();
607 std::map<std::uintptr_t, std::shared_ptr<void>>
m_ptrmap;
std::size_t m_packSize
Required buffer size after PACKSIZE has been done.
Definition: Serializer.hpp:604
Calculating serialization buffer size.
std::size_t position() const
Returns current position in buffer.
Definition: Serializer.hpp:202
Definition: SymmTensor.hpp:23
void operator()(const T &data)
Applies current serialization op to the passed data.
Definition: Serializer.hpp:105
Predicate for arrays.
Definition: Serializer.hpp:526
void vector(const std::vector< bool > &data)
Handler for bool vectors.
Definition: Serializer.hpp:256
Performing de-serialization.
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:30
Predicate for detecting pairs and tuples.
Definition: Serializer.hpp:451
void set(const Set &data)
Handler for sets.
Definition: Serializer.hpp:373
Definition: CriticalError.hpp:115
Operation
Enumeration of operations.
Definition: Serializer.hpp:414
void tuple(const Tuple &data)
Handler for std::tuple.
Definition: Serializer.hpp:343
void pack(const Args &... data)
Call this to serialize data.
Definition: Serializer.hpp:161
Predicate for std::optional.
Definition: Serializer.hpp:483
void unpack(Args &... data)
Call this to de-serialize data.
Definition: Serializer.hpp:192
Operation m_op
Current operation.
Definition: Serializer.hpp:603
std::size_t m_position
Current position in buffer.
Definition: Serializer.hpp:605
Predicate for detecting vectors.
Definition: Serializer.hpp:422
void shared_ptr(const PtrType &data)
Handler for shared pointers.
Definition: Serializer.hpp:559
Serializer(const Packer &packer)
Constructor.
Definition: Serializer.hpp:99
std::map< std::uintptr_t, std::shared_ptr< void > > m_ptrmap
Map to keep track of which pointer data has been serialized and actual pointers during unpacking...
Definition: Serializer.hpp:607
Predicate for detecting variants.
Definition: Serializer.hpp:440
std::vector< char > m_buffer
Buffer for serialized data.
Definition: Serializer.hpp:606
void variant(const std::variant< Args... > &data)
Handler for std::variant.
Definition: Serializer.hpp:302
void vector(const Vector &data)
Handler for vectors.
Definition: Serializer.hpp:218
Definition: Serializer.hpp:52
Predicate for maps.
Definition: Serializer.hpp:494
Predicate for sets.
Definition: Serializer.hpp:510
void unpack(T &data)
Call this to de-serialize data.
Definition: Serializer.hpp:179
Predicate for smart pointers.
Definition: Serializer.hpp:467
bool isSerializing() const
Returns true if we are currently doing a serialization operation.
Definition: Serializer.hpp:208
void array(const Array &data)
Handler for arrays.
Definition: Serializer.hpp:281
const Packer & m_packer
Packer to use.
Definition: Serializer.hpp:602
Class for (de-)serializing.
Definition: Serializer.hpp:95
Definition: Serializer.hpp:79
void map(const Map &data)
Handler for maps.
Definition: Serializer.hpp:352
void optional(const std::optional< T > &data)
Handler for std::optional.
Definition: Serializer.hpp:320
Detect existence of serializeOp member function.
Definition: Serializer.hpp:546
void pack(const T &data)
Call this to serialize data.
Definition: Serializer.hpp:143
Performing serialization.