Iros
 
Loading...
Searching...
No Matches
serialize.h
Go to the documentation of this file.
1#pragma once
2
5#include "di/io/size_writer.h"
6#include "di/meta/language.h"
9#include "di/util/declval.h"
10
11namespace di::concepts {
12template<typename T>
13concept Serializer = requires(T& serializer) {
15 { serializer.writer() } -> Impl<io::Writer>;
16 util::as_const(serializer).writer();
17 util::move(serializer).writer();
18};
19}
20
21namespace di::meta {
22template<concepts::Serializer S>
24}
25
26namespace di::serialization {
27namespace detail {
29 template<typename Format, concepts::Impl<io::Writer> Writer, typename... Args>
30 requires(concepts::TagInvocable<SerializerFunction, Format, Writer, Args...> ||
31 requires { Format::serializer(util::declval<Writer>(), util::declval<Args>()...); })
32 constexpr auto operator()(Format, Writer&& writer, Args&&... args) const -> concepts::Serializer auto {
33 if constexpr (concepts::TagInvocable<SerializerFunction, Format, Writer, Args...>) {
34 return function::tag_invoke(*this, Format {}, util::forward<Writer>(writer),
35 util::forward<Args>(args)...);
36 } else {
37 return Format::serializer(util::forward<Writer>(writer), util::forward<Args>(args)...);
38 }
39 }
40 };
41}
42
43constexpr inline auto serializer = detail::SerializerFunction {};
44}
45
46namespace di::concepts {
47template<typename T, typename Writer = any::AnyRef<io::Writer>, typename... Args>
48concept SerializationFormat = requires(T format, Writer&& writer, Args&&... args) {
49 serialization::serializer(format, util::forward<Writer>(writer), util::forward<Args>(args)...);
50};
51}
52
53namespace di::meta {
54template<typename T, typename Writer = any::AnyRef<io::Writer>, typename... Args>
55requires(concepts::SerializationFormat<T, Writer, Args...>)
58
59template<typename S>
61}
62
63namespace di::serialization {
64namespace detail {
66 template<typename T, typename S, typename U = meta::RemoveCVRef<T>,
67 concepts::SerializationFormat V = meta::RemoveCVRef<S>>
79 };
80}
81
83}
84
85namespace di::meta {
86template<concepts::SerializationFormat S, typename T>
88}
89
90namespace di::serialization {
91namespace detail {
93 template<concepts::Serializer S, typename T, typename F = meta::SerializationFormat<S>>
95 requires(S& serializer, T& value) { serializer.serialize(value); })
96 constexpr auto operator()(S&& serializer, T&& value) const -> meta::SerializeResult<S> {
98 return function::tag_invoke(*this, F(), serializer, value);
99 } else {
100 return serializer.serialize(value);
101 }
102 }
103
104 template<concepts::Serializer S, typename T, typename F = meta::SerializationFormat<S>,
105 typename M = meta::SerializeMetadata<F, T>>
107 !requires(S& serializer, T& value) { serializer.serialize(value); } &&
109 requires(S& serializer, T& value) { serializer.serialize(value, M()); }))
110 constexpr auto operator()(S&& serializer, T&& value) const -> meta::SerializeResult<S> {
112 return function::tag_invoke(*this, serializer, value, M());
113 } else {
114 return serializer.serialize(value, M());
115 }
116 }
117
118 template<typename Format, concepts::Impl<io::Writer> Writer, typename T, typename... Args>
120 constexpr auto operator()(Format format, Writer&& writer, T&& value, Args&&... args) const
121 requires(requires {
122 (*this)(serialization::serializer(format, util::ref(writer), util::forward<Args>(args)...), value);
123 })
124 {
125 return (*this)(serialization::serializer(format, util::ref(writer), util::forward<Args>(args)...), value);
126 }
127 };
128}
129
130constexpr inline auto serialize = detail::SerializeFunction {};
131
132namespace detail {
134 template<typename Format, typename T, typename... Args>
135 constexpr auto operator()(Format format, T&& value, Args&&... args) const
136 requires(concepts::TagInvocable<SerializeSizeFunction, Format, T, Args...> ||
137 requires {
139 serialization::serializer(format, di::declval<SizeWriter>(), util::forward<Args>(args)...),
140 value);
141 })
142 {
143 if constexpr (concepts::TagInvocable<SerializeSizeFunction, Format, T, Args...>) {
144 return function::tag_invoke(*this, format, value, args...);
145 } else {
146 auto writer = SizeWriter {};
147 auto serializer = serialization::serializer(format, util::ref(writer), util::forward<Args>(args)...);
149 return writer.written();
150 }
151 }
152 };
153}
154
156
157namespace detail {
159 template<concepts::Serializer S, typename T, typename U = meta::RemoveCVRef<T>>
167 };
168}
169
171}
172
173namespace di::concepts {
174template<typename T, typename S>
177}
178
179namespace di {
183
186
190}
Definition size_writer.h:6
Definition impl.h:17
Definition reflect.h:51
Definition reflect.h:14
Definition serialize.h:175
Definition serialize.h:48
Definition serialize.h:13
Definition tag_invoke.h:33
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< WriteSome, Flush > Writer
Definition writer.h:59
Definition json_deserializer.h:532
Definition merge_interfaces.h:6
typename meta::RemoveCVRef< S >::SerializationFormat SerializationFormat
Definition serialize.h:23
RemoveCV< RemoveReference< T > > RemoveCVRef
Definition core.h:74
meta::WriterResult< void, decltype(util::declval< S >().writer())> SerializeResult
Definition serialize.h:60
decltype(serialization::serializer(util::declval< T >(), util::declval< Writer >(), util::declval< Args >()...)) Serializer
Definition serialize.h:56
meta::LikeExpected< decltype(io::write_some(util::declval< Writer & >(), util::declval< Span< Byte const > >())), T > WriterResult
Definition writer.h:64
decltype(serialization::serialize_metadata(in_place_type< T >, in_place_type< S >)) SerializeMetadata
Definition serialize.h:87
constexpr auto reflect
Definition reflect.h:46
Definition binary_deserializer.h:33
constexpr auto serialize_size
Definition serialize.h:155
constexpr auto serialize_metadata
Definition serialize.h:82
constexpr auto serialize
Definition serialize.h:130
constexpr auto serializable
Definition serialize.h:170
constexpr auto serializer
Definition serialize.h:43
constexpr auto ref
Definition reference_wrapper.h:98
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
Definition zstring_parser.h:9
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr auto in_place_type
Definition in_place_type.h:12
constexpr auto serializer
Definition serialize.h:43
constexpr auto operator()(InPlaceType< S >, InPlaceType< T >) const -> bool
Definition serialize.h:160
constexpr auto operator()(S &&serializer, T &&value) const -> meta::SerializeResult< S >
Definition serialize.h:110
constexpr auto operator()(Format format, T &&value, Args &&... args) const
Definition serialize.h:135
Definition in_place_type.h:5