Iros
 
Loading...
Searching...
No Matches
deserialize.h
Go to the documentation of this file.
1#pragma once
2
5#include "di/meta/core.h"
8
9namespace di::concepts {
10template<typename T>
11concept Deserializer = requires(T& serializer) {
13 { serializer.reader() } -> Impl<io::Reader>;
14 util::as_const(serializer).reader();
15 util::move(serializer).reader();
16};
17}
18
19namespace di::meta {
20template<concepts::Deserializer S>
22}
23
24namespace di::serialization {
25namespace detail {
27 template<typename Format, concepts::Impl<io::Reader> Reader, typename... Args>
28 requires(concepts::TagInvocable<DeserializerFunction, Format, Reader, Args...> ||
29 requires { Format::deserializer(util::declval<Reader>(), util::declval<Args>()...); })
30 constexpr auto operator()(Format, Reader&& reader, Args&&... args) const -> concepts::Deserializer auto {
31 if constexpr (concepts::TagInvocable<DeserializerFunction, Format, Reader, Args...>) {
32 return function::tag_invoke(*this, Format {}, util::forward<Reader>(reader),
33 util::forward<Args>(args)...);
34 } else {
35 return Format::deserializer(util::forward<Reader>(reader), util::forward<Args>(args)...);
36 }
37 }
38 };
39}
40
41constexpr inline auto deserializer = detail::DeserializerFunction {};
42}
43
44namespace di::concepts {
45template<typename T, typename Reader = any::AnyRef<io::Reader>, typename... Args>
46concept DeserializationFormat = requires(T format, Reader&& reader, Args&&... args) {
47 serialization::deserializer(format, util::forward<Reader>(reader), util::forward<Args>(args)...);
48};
49}
50
51namespace di::meta {
52template<typename T, typename Reader = any::AnyRef<io::Reader>, typename... Args>
53requires(concepts::DeserializationFormat<T, Reader, Args...>)
56
57template<typename S, typename T>
59}
60
61namespace di::serialization {
62namespace detail {
64 template<typename T, typename F, typename U = meta::RemoveCVRef<T>,
65 concepts::DeserializationFormat V = meta::RemoveCVRef<F>>
80 };
81}
82
84}
85
86namespace di::meta {
87template<concepts::DeserializationFormat S, typename T>
89}
90
91namespace di::serialization {
92namespace detail {
94 template<concepts::Deserializer D, typename T, typename F = meta::DeserializationFormat<D>>
96 requires(D&& deserializer) { deserializer.deserialize(in_place_type<T>); })
97 constexpr auto operator()(D&& deserializer, InPlaceType<T>) const -> meta::DeserializeResult<D, T> {
100 } else {
101 return deserializer.deserialize(in_place_type<T>);
102 }
103 }
104
105 template<concepts::Deserializer D, typename T,
108 requires(D&& deserializer) { deserializer.deserialize(in_place_type<T>); }) &&
109 (concepts::TagInvocable<DeserializeInPlaceFunction, D&, InPlaceType<T>, M> ||
110 requires(D&& deserializer) { deserializer.deserialize(in_place_type<T>, M {}); }))
111 constexpr auto operator()(D&& deserializer, InPlaceType<T>) const -> meta::DeserializeResult<D, T> {
114 } else {
115 return deserializer.deserialize(in_place_type<T>, M {});
116 }
117 }
118
119 template<typename Format, concepts::Impl<io::Reader> Reader, typename T, typename... Args>
120 requires(concepts::DeserializationFormat<Format, Reader, Args...>)
121 constexpr auto operator()(Format format, Reader&& reader, InPlaceType<T>, Args&&... args) const
122 requires(requires {
123 (*this)(serialization::deserializer(format, util::forward<Reader>(reader)), in_place_type<T>,
124 util::forward<Args>(args)...);
125 })
126 {
127 return (*this)(serialization::deserializer(format, util::forward<Reader>(reader)), in_place_type<T>,
128 util::forward<Args>(args)...);
129 }
130 };
131}
132
134
135namespace detail {
137 template<concepts::Deserializer D, typename T, typename U = meta::RemoveCVRef<T>>
145 };
146}
147
149}
150
151namespace di::concepts {
152template<typename T, typename D>
154}
155
156namespace di::serialization {
157namespace detail {
158 template<typename T>
160 template<typename D>
162 constexpr auto operator()(D&& deserializer) const {
164 }
165
166 template<typename F, typename R, typename... Args>
167 requires(requires {
169 })
170 constexpr auto operator()(F format, R&& reader, Args&&... args) const {
171 return deserialize_in_place(format, util::forward<R>(reader), in_place_type<T>,
172 util::forward<Args>(args)...);
173 }
174 };
175}
176
177template<typename T>
179}
180
181namespace di {
182using concepts::Deserializable;
183using concepts::DeserializationFormat;
184using concepts::Deserializer;
185
188
192}
Definition deserialize.h:153
Definition deserialize.h:46
Definition deserialize.h:11
Definition impl.h:17
Definition reflect.h:51
Definition reflect.h:14
Definition tag_invoke.h:33
Definition impl.h:7
Definition any_storable.h:9
Definition bounded_format_context.h:7
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
meta::List< ReadSome > Reader
Definition reader.h:34
Definition json_deserializer.h:532
Definition merge_interfaces.h:6
RemoveCV< RemoveReference< T > > RemoveCVRef
Definition core.h:74
decltype(serialization::deserialize_metadata(in_place_type< T >, in_place_type< S >)) DeserializeMetadata
Definition deserialize.h:88
decltype(serialization::deserializer(util::declval< T >(), util::declval< Reader >(), util::declval< Args >()...)) Deserializer
Definition deserialize.h:54
Type< detail::LikeExpectedHelper< T, U > > LikeExpected
Definition vocab.h:60
decltype(serialization::serialize_metadata(in_place_type< T >, in_place_type< S >)) SerializeMetadata
Definition serialize.h:87
typename meta::RemoveCVRef< S >::DeserializationFormat DeserializationFormat
Definition deserialize.h:21
meta::LikeExpected< meta::ReaderResult< void, decltype(util::declval< S >().reader())>, T > DeserializeResult
Definition deserialize.h:58
constexpr auto reflect
Definition reflect.h:46
Definition binary_deserializer.h:33
constexpr auto deserializable
Definition deserialize.h:148
constexpr auto deserializer
Definition deserialize.h:41
constexpr auto deserialize_in_place
Definition deserialize.h:133
constexpr auto deserialize_metadata
Definition deserialize.h:83
constexpr auto deserialize
Definition deserialize.h:178
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
Definition zstring_parser.h:9
constexpr auto in_place_type
Definition in_place_type.h:12
constexpr auto serializer
Definition serialize.h:43
constexpr auto operator()(InPlaceType< D >, InPlaceType< T >) const -> bool
Definition deserialize.h:138
constexpr auto operator()(Format format, Reader &&reader, InPlaceType< T >, Args &&... args) const
Definition deserialize.h:121
Definition in_place_type.h:5