di 0.1.0
Loading...
Searching...
No Matches
binary_deserializer.h
Go to the documentation of this file.
1#pragma once
2
13#include "di/io/read_exactly.h"
14#include "di/meta/constexpr.h"
15#include "di/meta/core.h"
16#include "di/meta/language.h"
17#include "di/meta/operations.h"
18#include "di/platform/prelude.h"
21#include "di/types/byte.h"
23#include "di/types/integers.h"
24#include "di/util/create.h"
25#include "di/util/declval.h"
32
33namespace di::serialization {
44template<Impl<io::Reader> Reader>
46public:
47 template<typename T = void>
49
51
52 template<concepts::NotDecaysTo<BinaryDeserializer> T>
53 requires(ConstructibleFrom<Reader, T>)
54 // NOLINTNEXTLINE(bugprone-forwarding-reference-overload)
55 constexpr explicit BinaryDeserializer(T&& reader) : m_reader(di::forward<T>(reader)) {}
56
57 template<concepts::IntegralOrEnum T>
59 auto bytes = Array<byte, sizeof(T)> {};
60 DI_TRY(read_exactly(reader(), bytes.span()));
61 auto const little_endian_value = di::bit_cast<LittleEndian<T>>(bytes);
62 return T(little_endian_value);
63 }
64
65 template<concepts::TupleLike T>
68 auto result = T();
70 [&]<typename U>(U&& element) -> Result<void> {
72 return {};
73 },
74 result));
75 return result;
76 }
77
78 template<concepts::VariantLike T>
80 using IndexType = u64;
81 auto const index = DI_TRY(di::deserialize<IndexType>(*this));
82 if (index >= meta::VariantSize<T>) {
83 return di::Unexpected(BasicError::InvalidArgument);
84 }
86 index, [&]<usize index>(Constexpr<index>) -> Result<T> {
88 });
89 }
90
91 template<concepts::DefaultConstructible T, concepts::InstanceOf<reflection::Fields> M>
92 constexpr auto deserialize(InPlaceType<T>, M fields) -> Result<T> {
93 // NOTE: for now, this requires T be default constructible.
94 auto result = T {};
96 [&](auto field) -> Result<void> {
97 using Value = meta::Type<decltype(field)>;
98 field.get(result) = DI_TRY(di::deserialize<Value>(*this));
99 return {};
100 },
101 fields));
102 return result;
103 }
104
105 template<concepts::InstanceOf<container::string::StringImpl> Str>
107 using Vec = decltype(di::declval<Str>().take_underlying_vector());
108 auto vector = DI_TRY(di::deserialize<Vec>(*this));
109
110 // NOTE: this can be fallible because the vector may contain invalid data for the encoding.
111 return util::create<Str>(di::move(vector));
112 }
113
114 template<concepts::Container T>
117 using SizeType = u64;
118 auto const size = DI_TRY(di::deserialize<SizeType>(*this));
119 return range(size) | transform([&](auto) {
121 }) |
123 }
124
125 constexpr auto reader() & -> Reader& { return m_reader; }
126 constexpr auto reader() const& -> Reader const& { return m_reader; }
127 constexpr auto reader() && -> Reader&& { return util::move(*this).m_reader; }
128
129private:
130 Reader m_reader;
131};
132
133template<typename T>
135
136namespace detail {
137 template<typename T>
138 struct DeserializeBinaryFunction {
139 template<concepts::Impl<io::Reader> Reader, typename... Args>
141 Args...> &&
143 constexpr auto operator()(Reader&& reader, Args&&... args) const {
144 return serialization::deserialize<T>(binary_format, ref(reader), util::forward<Args>(args)...);
145 }
146 };
147}
148
149template<typename T>
150constexpr inline auto deserialize_binary = detail::DeserializeBinaryFunction<T> {};
151}
152
153namespace di {
156}
constexpr BinaryDeserializer(T &&reader)
Definition binary_deserializer.h:55
A deserializer for a simple binary format.
Definition binary_deserializer.h:45
constexpr auto deserialize(InPlaceType< T >, M fields) -> Result< T >
Definition binary_deserializer.h:92
constexpr auto deserialize(InPlaceType< T >) -> Result< T >
Definition binary_deserializer.h:58
constexpr auto reader() &&-> Reader &&
Definition binary_deserializer.h:127
constexpr auto reader() &-> Reader &
Definition binary_deserializer.h:125
constexpr auto deserialize(InPlaceType< T >) -> Result< T >
Definition binary_deserializer.h:116
constexpr auto deserialize(InPlaceType< Str >) -> Result< Str >
Definition binary_deserializer.h:106
BinaryFormat DeserializationFormat
Definition binary_deserializer.h:50
constexpr auto reader() const &-> Reader const &
Definition binary_deserializer.h:126
meta::ReaderResult< T, Reader > Result
Definition binary_deserializer.h:48
constexpr BinaryDeserializer(T &&reader)
Definition binary_deserializer.h:55
constexpr auto deserialize(InPlaceType< T >) -> Result< T >
Definition binary_deserializer.h:67
Definition unexpected.h:14
Definition operations.h:11
Definition operations.h:24
Definition deserialize.h:153
Definition core.h:139
#define DI_TRY(...)
Definition monad_try.h:13
constexpr auto sequence_to(Con &&container, Args &&... args)
Definition sequence_to.h:49
constexpr auto index_dispatch
Definition index_dispatch.h:41
meta::List< ReadSome > Reader
Definition reader.h:34
T::Type Type
Definition core.h:26
RemoveCV< RemoveReference< T > > RemoveCVRef
Definition core.h:74
constexpr auto VariantSize
Definition variant_size.h:24
meta::LikeExpected< decltype(io::read_some(util::declval< Reader & >(), util::declval< Span< Byte > >())), T > ReaderResult
Definition reader.h:39
decltype(vocab::variant_alternative(in_place_type< meta::RemoveReference< T > >, c_< index >)) VariantAlternative
Definition variant_alternative.h:25
Definition base64.h:16
BinaryDeserializer(T &&) -> BinaryDeserializer< T >
constexpr auto binary_format
Definition binary_serializer.h:132
constexpr auto deserialize_binary
Definition binary_deserializer.h:150
constexpr auto deserialize
Definition deserialize.h:178
std::byte byte
Definition byte.h:64
size_t usize
Definition integers.h:33
__UINT64_TYPE__ u64
Definition integers.h:12
constexpr auto create(Args &&... args)
Definition create.h:21
Definition any_storable.h:9
constexpr auto ref
Definition reference_wrapper.h:98
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr auto read_exactly
Definition read_exactly.h:26
constexpr auto tuple_sequence
Definition tuple_sequence.h:36
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
constexpr auto size
Definition size.h:62
constexpr auto deserialize
Definition deserialize.h:178
constexpr auto field
Definition field.h:47
A wrapper for a constexpr value.
Definition constexpr.h:36
Definition binary_serializer.h:118
Definition in_place_type.h:5
Definition array.h:27