Iros
 
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
44template<Impl<io::Reader> Reader>
46private:
47 template<typename T>
49
50public:
52
53 template<concepts::NotDecaysTo<BinaryDeserializer> T>
54 requires(ConstructibleFrom<Reader, T>)
55 // NOLINTNEXTLINE(bugprone-forwarding-reference-overload)
56 constexpr explicit BinaryDeserializer(T&& reader) : m_reader(di::forward<T>(reader)) {}
57
58 template<concepts::IntegralOrEnum T>
59 constexpr auto deserialize(InPlaceType<T>) -> Result<T> {
60 auto bytes = Array<byte, sizeof(T)> {};
61 DI_TRY(read_exactly(reader(), bytes.span()));
62 auto const little_endian_value = di::bit_cast<LittleEndian<T>>(bytes);
63 return T(little_endian_value);
64 }
65
66 template<concepts::TupleLike T>
68 constexpr auto deserialize(InPlaceType<T>) -> Result<T> {
69 auto result = T();
70 DI_TRY(tuple_sequence<Result<void>>(
71 [&]<typename U>(U&& element) -> Result<void> {
73 return {};
74 },
75 result));
76 return result;
77 }
78
79 template<concepts::VariantLike T>
80 constexpr auto deserialize(InPlaceType<T>) -> Result<T> {
81 using IndexType = u64;
82 auto const index = DI_TRY(di::deserialize<IndexType>(*this));
83 if (index >= meta::VariantSize<T>) {
84 return di::Unexpected(BasicError::InvalidArgument);
85 }
87 index, [&]<usize index>(Constexpr<index>) -> Result<T> {
89 });
90 }
91
92 template<concepts::DefaultConstructible T, concepts::InstanceOf<reflection::Fields> M>
93 constexpr auto deserialize(InPlaceType<T>, M fields) -> Result<T> {
94 // NOTE: for now, this requires T be default constructible.
95 auto result = T {};
96 DI_TRY(tuple_sequence<Result<void>>(
97 [&](auto field) -> Result<void> {
98 using Value = meta::Type<decltype(field)>;
99 field.get(result) = DI_TRY(di::deserialize<Value>(*this));
100 return {};
101 },
102 fields));
103 return result;
104 }
105
106 template<concepts::InstanceOf<container::string::StringImpl> Str>
107 constexpr auto deserialize(InPlaceType<Str>) -> Result<Str> {
108 using Vec = decltype(di::declval<Str>().take_underlying_vector());
109 auto vector = DI_TRY(di::deserialize<Vec>(*this));
110
111 // NOTE: this can be fallible because the vector may contain invalid data for the encoding.
112 return util::create<Str>(di::move(vector));
113 }
114
115 template<concepts::Container T>
117 constexpr auto deserialize(InPlaceType<T>) -> Result<T> {
118 using SizeType = u64;
119 auto const size = DI_TRY(di::deserialize<SizeType>(*this));
120 return range(size) | transform([&](auto) {
122 }) |
124 }
125
126 constexpr auto reader() & -> Reader& { return m_reader; }
127 constexpr auto reader() const& -> Reader const& { return m_reader; }
128 constexpr auto reader() && -> Reader&& { return util::move(*this).m_reader; }
129
130private:
131 Reader m_reader;
132};
133
134template<typename T>
136
137namespace detail {
138 template<typename T>
140 template<concepts::Impl<io::Reader> Reader, typename... Args>
142 Args...> &&
144 constexpr auto operator()(Reader&& reader, Args&&... args) const {
145 return serialization::deserialize<T>(binary_format, ref(reader), util::forward<Args>(args)...);
146 }
147 };
148}
149
150template<typename T>
152}
153
154namespace di {
157}
A deserializer for a simple binary format.
Definition binary_serializer.h:116
constexpr auto deserialize(InPlaceType< T >, M fields) -> Result< T >
Definition binary_deserializer.h:93
constexpr auto deserialize(InPlaceType< T >) -> Result< T >
Definition binary_deserializer.h:59
constexpr auto reader() &&-> Reader &&
Definition binary_deserializer.h:128
constexpr auto reader() &-> Reader &
Definition binary_deserializer.h:126
constexpr auto deserialize(InPlaceType< T >) -> Result< T >
Definition binary_deserializer.h:117
constexpr auto deserialize(InPlaceType< Str >) -> Result< Str >
Definition binary_deserializer.h:107
BinaryFormat DeserializationFormat
Definition binary_deserializer.h:51
constexpr auto reader() const &-> Reader const &
Definition binary_deserializer.h:127
constexpr BinaryDeserializer(T &&reader)
Definition binary_deserializer.h:56
constexpr auto deserialize(InPlaceType< T >) -> Result< T >
Definition binary_deserializer.h:68
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 binary_deserializer.h:137
Definition binary_deserializer.h:33
BinaryDeserializer(T &&) -> BinaryDeserializer< T >
constexpr auto binary_format
Definition binary_serializer.h:132
constexpr auto deserialize_binary
Definition binary_deserializer.h:151
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
Expected< T, Error > Result
Definition result.h:8
Definition zstring_parser.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 field
Definition field.h:42
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:54
constexpr auto deserialize
Definition deserialize.h:178
A wrapper for a constexpr value.
Definition core.h:77
Definition binary_serializer.h:118
Definition binary_deserializer.h:139
Definition in_place_type.h:5
Definition span_fixed_size.h:37