Iros
 
Loading...
Searching...
No Matches
binary_serializer.h
Go to the documentation of this file.
1#pragma once
2
11#include "di/io/write_exactly.h"
12#include "di/meta/language.h"
13#include "di/meta/operations.h"
14#include "di/meta/util.h"
16#include "di/types/integers.h"
17#include "di/util/bit_cast.h"
22
23namespace di::serialization {
24struct BinaryFormat;
25
40template<Impl<io::Writer> Writer>
42public:
44
45 template<concepts::NotDecaysTo<BinarySerializer> T>
46 requires(ConstructibleFrom<Writer, T>)
47 // NOLINTNEXTLINE(bugprone-forwarding-reference-overload)
48 constexpr explicit BinarySerializer(T&& writer) : m_writer(di::forward<T>(writer)) {}
49
50 template<typename T, concepts::InstanceOf<reflection::Fields> M>
51 constexpr auto serialize(T&& value, M) {
53 [&](auto field) {
54 return di::serialize(*this, field.get(value));
55 },
56 M {});
57 }
58
59 constexpr auto serialize(concepts::TupleLike auto&& value) {
61 [&](auto&& element) {
62 return di::serialize(*this, element);
63 },
64 value);
65 }
66
68 // NOTE: Explicitly casting to u64 allows forwards compatibility when adding new alternatives to a variant.
69 // By default the index type would be a u8 for a variant with 256 alternatives.
70 auto const index = u64(value.index());
71 DI_TRY(di::serialize(*this, index));
72 return visit(
73 [&](auto&& alternative) {
74 return di::serialize(*this, alternative);
75 },
76 value);
77 }
78
79 template<concepts::IntegralOrEnum T>
80 constexpr auto serialize(T value) {
81 auto const little_endian = LittleEndian<T>(value);
82 auto const as_bytes = di::bit_cast<Array<byte, sizeof(T)>>(little_endian);
84 }
85
86 template<typename T, concepts::InstanceOf<reflection::Atom> M>
87 requires(M::is_string())
88 constexpr auto serialize(T&& value, M) {
89 // Serialize the underlying data, in terms of code units.
90 return di::serialize(*this, value.span());
91 }
92
93 template<concepts::SizedContainer T>
95 constexpr auto serialize(T&& value) -> meta::WriterResult<void, Writer> {
96 // NOTE: Explicitly casting to u64 allows interoperability with 32 bit systems.
97 auto const size = u64(container::size(value));
98 DI_TRY(di::serialize(*this, size));
99 return container::sequence(value, [&](auto&& element) {
100 return di::serialize(*this, element);
101 });
102 }
103
104 constexpr auto writer() & -> Writer& { return m_writer; }
105 constexpr auto writer() const& -> Writer const& { return m_writer; }
106 constexpr auto writer() && -> Writer&& { return util::move(*this).m_writer; }
107
108private:
109 Writer m_writer;
110};
111
112template<typename T>
114
115template<Impl<io::Reader> Reader>
117
119 template<concepts::Impl<io::Writer> Writer, typename... Args>
120 requires(ConstructibleFrom<BinarySerializer<meta::RemoveCVRef<Writer>>, Writer, Args...>)
121 constexpr static auto serializer(Writer&& writer, Args&&... args) {
122 return BinarySerializer<meta::RemoveCVRef<Writer>>(di::forward<Writer>(writer), di::forward<Args>(args)...);
123 }
124
125 template<concepts::Impl<io::Reader> Reader, typename... Args>
126 requires(ConstructibleFrom<BinaryDeserializer<meta::RemoveCVRef<Reader>>, Reader, Args...>)
127 constexpr static auto deserializer(Reader&& reader, Args&&... args) {
128 return BinaryDeserializer<meta::RemoveCVRef<Reader>>(di::forward<Reader>(reader), di::forward<Args>(args)...);
129 }
130};
131
132constexpr inline auto binary_format = BinaryFormat {};
133
134namespace detail {
136 template<Impl<io::Writer> Writer, Serializable<BinarySerializer<Writer>> T, typename... Args>
137 requires(ConstructibleFrom<BinarySerializer<ReferenceWrapper<meta::RemoveReference<Writer>>>,
139 constexpr auto operator()(Writer&& writer, T&& value, Args&&... args) const {
140 return serialize(binary_format, di::ref(writer), value, di::forward<Args>(args)...);
141 }
142 };
143}
144
146}
147
148namespace di {
150using serialization::BinaryFormat;
153}
Definition little_endian.h:25
A deserializer for a simple binary format.
Definition binary_serializer.h:116
constexpr BinaryDeserializer(T &&reader)
Definition binary_deserializer.h:56
A serializer for a simple binary format.
Definition binary_serializer.h:41
constexpr auto writer() const &-> Writer const &
Definition binary_serializer.h:105
constexpr auto serialize(concepts::TupleLike auto &&value)
Definition binary_serializer.h:59
constexpr auto serialize(T value)
Definition binary_serializer.h:80
constexpr auto writer() &-> Writer &
Definition binary_serializer.h:104
constexpr BinarySerializer(T &&writer)
Definition binary_serializer.h:48
constexpr auto serialize(T &&value, M)
Definition binary_serializer.h:88
constexpr auto serialize(T &&value) -> meta::WriterResult< void, Writer >
Definition binary_serializer.h:95
constexpr auto writer() &&-> Writer &&
Definition binary_serializer.h:106
constexpr auto serialize(T &&value, M)
Definition binary_serializer.h:51
constexpr auto serialize(concepts::VariantLike auto &&value) -> meta::WriterResult< void, Writer >
Definition binary_serializer.h:67
BinaryFormat SerializationFormat
Definition binary_serializer.h:43
Definition reference_wrapper.h:14
Definition serialize.h:175
Definition tuple_like.h:38
Definition variant_like.h:37
#define DI_TRY(...)
Definition monad_try.h:13
constexpr auto sequence
Definition sequence.h:34
constexpr auto size
Definition size.h:54
constexpr auto write_exactly
Definition write_exactly.h:51
meta::List< ReadSome > Reader
Definition reader.h:34
meta::List< WriteSome, Flush > Writer
Definition writer.h:59
Definition json_deserializer.h:532
meta::LikeExpected< decltype(io::write_some(util::declval< Writer & >(), util::declval< Span< Byte const > >())), T > WriterResult
Definition writer.h:64
Definition binary_deserializer.h:33
BinarySerializer(T &&) -> BinarySerializer< T >
constexpr auto serialize
Definition serialize.h:130
constexpr auto serialize_binary
Definition binary_serializer.h:145
constexpr auto binary_format
Definition binary_serializer.h:132
std::byte byte
Definition byte.h:64
__UINT64_TYPE__ u64
Definition integers.h:12
Definition zstring_parser.h:9
constexpr auto ref
Definition reference_wrapper.h:98
constexpr auto serialize
Definition serialize.h:130
constexpr auto visit(Vis &&visitor, Vars &&... variants) -> R
Definition visit.h:39
constexpr auto field
Definition field.h:42
constexpr auto tuple_sequence
Definition tuple_sequence.h:36
constexpr auto as_bytes
Definition as_bytes.h:16
constexpr auto size
Definition size.h:54
Definition binary_serializer.h:118
static constexpr auto serializer(Writer &&writer, Args &&... args)
Definition binary_serializer.h:121
static constexpr auto deserializer(Reader &&reader, Args &&... args)
Definition binary_serializer.h:127
Definition binary_serializer.h:135
Definition span_fixed_size.h:37