OGLplus  (0.59.0) a C++ wrapper for rendering APIs

write_backend.hpp
Go to the documentation of this file.
1 
9 #ifndef EAGINE_SERIALIZE_WRITE_BACKEND_HPP
10 #define EAGINE_SERIALIZE_WRITE_BACKEND_HPP
11 
12 #include "../identifier.hpp"
13 #include "../interface.hpp"
14 #include "../reflect/decl_name.hpp"
15 #include "data_sink.hpp"
16 #include "result.hpp"
17 #include <cstdint>
18 
19 namespace eagine {
20 //------------------------------------------------------------------------------
26 struct serializer_backend : interface<serializer_backend> {
27 
30 
32  virtual auto type_id() -> identifier = 0;
33 
35  virtual auto sink() -> serializer_data_sink* = 0;
36 
38  virtual auto enum_as_string() -> bool = 0;
39 
41  virtual auto begin() -> result = 0;
42 
44  virtual auto write(span<const bool>, span_size_t&) -> result = 0;
45 
47  virtual auto write(span<const char>, span_size_t&) -> result = 0;
48 
50  virtual auto write(span<const std::int8_t>, span_size_t&) -> result = 0;
51 
53  virtual auto write(span<const short>, span_size_t&) -> result = 0;
54 
56  virtual auto write(span<const int>, span_size_t&) -> result = 0;
57 
59  virtual auto write(span<const long>, span_size_t&) -> result = 0;
60 
62  virtual auto write(span<const long long>, span_size_t&) -> result = 0;
63 
65  virtual auto write(span<const std::uint8_t>, span_size_t&) -> result = 0;
66 
68  virtual auto write(span<const unsigned short>, span_size_t&) -> result = 0;
69 
71  virtual auto write(span<const unsigned>, span_size_t&) -> result = 0;
72 
74  virtual auto write(span<const unsigned long>, span_size_t&) -> result = 0;
75 
77  virtual auto write(span<const unsigned long long>, span_size_t&)
78  -> result = 0;
79 
81  virtual auto write(span<const float>, span_size_t&) -> result = 0;
82 
84  virtual auto write(span<const double>, span_size_t&) -> result = 0;
85 
87  virtual auto write(span<const identifier>, span_size_t&) -> result = 0;
88 
90  virtual auto write(span<const decl_name>, span_size_t&) -> result = 0;
91 
93  virtual auto write(span<const string_view>, span_size_t&) -> result = 0;
94 
96  virtual auto begin_struct(span_size_t member_count) -> result = 0;
97 
99  virtual auto begin_member(string_view name) -> result = 0;
100 
102  virtual auto finish_member(string_view name) -> result = 0;
103 
105  virtual auto finish_struct() -> result = 0;
106 
108  virtual auto begin_list(span_size_t element_count) -> result = 0;
109 
111  virtual auto begin_element(span_size_t index) -> result = 0;
112 
114  virtual auto finish_element(span_size_t index) -> result = 0;
115 
117  virtual auto finish_list() -> result = 0;
118 
120  virtual auto finish() -> result = 0;
121 };
122 //------------------------------------------------------------------------------
127 template <typename Derived, typename Sink = serializer_data_sink>
129 public:
131  common_serializer_backend() noexcept = default;
132 
134  common_serializer_backend(Sink& s) noexcept
135  : _sink{&s} {}
136 
138  auto set_sink(Sink& s) noexcept -> auto& {
139  _sink = &s;
140  return derived();
141  }
142 
143  auto sink() -> serializer_data_sink* final {
144  return _sink;
145  }
146 
147  auto enum_as_string() -> bool override {
148  return false;
149  }
150 
151  auto begin() -> result override {
152  return {};
153  }
154 
155  auto write(span<const bool> values, span_size_t& done) -> result override {
156  return derived().do_write(values, done);
157  }
158 
159  auto write(span<const char> values, span_size_t& done) -> result override {
160  return derived().do_write(values, done);
161  }
162 
163  auto write(span<const std::int8_t> values, span_size_t& done)
164  -> result override {
165  return derived().do_write(values, done);
166  }
167 
168  auto write(span<const short> values, span_size_t& done) -> result override {
169  return derived().do_write(values, done);
170  }
171 
172  auto write(span<const int> values, span_size_t& done) -> result override {
173  return derived().do_write(values, done);
174  }
175 
176  auto write(span<const long> values, span_size_t& done) -> result override {
177  return derived().do_write(values, done);
178  }
179 
180  auto write(span<const long long> values, span_size_t& done)
181  -> result override {
182  return derived().do_write(values, done);
183  }
184 
185  auto write(span<const std::uint8_t> values, span_size_t& done)
186  -> result override {
187  return derived().do_write(values, done);
188  }
189 
190  auto write(span<const unsigned short> values, span_size_t& done)
191  -> result override {
192  return derived().do_write(values, done);
193  }
194 
195  auto write(span<const unsigned> values, span_size_t& done)
196  -> result override {
197  return derived().do_write(values, done);
198  }
199 
200  auto write(span<const unsigned long> values, span_size_t& done)
201  -> result override {
202  return derived().do_write(values, done);
203  }
204 
205  auto write(span<const unsigned long long> values, span_size_t& done)
206  -> result override {
207  return derived().do_write(values, done);
208  }
209 
210  auto write(span<const float> values, span_size_t& done) -> result override {
211  return derived().do_write(values, done);
212  }
213 
214  auto write(span<const double> values, span_size_t& done)
215  -> result override {
216  return derived().do_write(values, done);
217  }
218 
219  auto write(span<const identifier> values, span_size_t& done)
220  -> result override {
221  return derived().do_write(values, done);
222  }
223 
224  auto write(span<const decl_name> values, span_size_t& done)
225  -> result override {
226  return derived().do_write(values, done);
227  }
228 
229  auto write(span<const string_view> values, span_size_t& done)
230  -> result override {
231  return derived().do_write(values, done);
232  }
233 
234  auto begin_struct(span_size_t) -> result override {
235  return {};
236  }
237  auto begin_member(string_view) -> result override {
238  return {};
239  }
240  auto finish_member(string_view) -> result override {
241  return {};
242  }
243  auto finish_struct() -> result override {
244  return {};
245  }
246  auto begin_list(span_size_t) -> result override {
247  return {};
248  }
249  auto begin_element(span_size_t) -> result override {
250  return {};
251  }
252  auto finish_element(span_size_t) -> result override {
253  return {};
254  }
255  auto finish_list() -> result override {
256  return {};
257  }
258  auto finish() -> result override {
259  return {};
260  }
261 
262 protected:
263  auto remaining_size() const -> span_size_t {
264  EAGINE_ASSERT(_sink);
265  return _sink->remaining_size();
266  }
267 
268  template <typename... Args>
269  auto sink(Args&&... args) const -> result {
270  EAGINE_ASSERT(_sink);
271  return _sink->write(std::forward<Args>(args)...);
272  }
273 
274 private:
275  Sink* _sink{nullptr};
276 
277  auto derived() noexcept -> Derived& {
278  return *static_cast<Derived*>(this);
279  }
280 };
281 //------------------------------------------------------------------------------
286 template <typename Base, identifier_t Id>
287 class serializer_backend_id : public Base {
288 public:
289  using Base::Base;
290 
291  static constexpr const identifier_t id_value = Id;
292 
293  auto type_id() -> identifier final {
294  return identifier{Id};
295  }
296 };
297 //------------------------------------------------------------------------------
298 } // namespace eagine
299 
300 #endif // EAGINE_SERIALIZE_WRITE_BACKEND_HPP
Base class partially implementing serializer and deserialized backends.
Definition: write_backend.hpp:287
virtual auto begin_struct(span_size_t member_count) -> result=0
Begins the serialization of a structure instance.
serialization_errors result
Alias for the serialization operations result type.
Definition: write_backend.hpp:29
auto write(span< const std::int8_t > values, span_size_t &done) -> result override
Writes 8-bit int values, returns how many were done through second argument.
Definition: write_backend.hpp:163
virtual auto sink() -> serializer_data_sink *=0
Returns a pointer to the associated data sink, if any.
std::ptrdiff_t span_size_t
Signed span size type used by eagine.
Definition: types.hpp:36
auto write(span< const long long > values, span_size_t &done) -> result override
Writes long long values, returns how many were done through second argument.
Definition: write_backend.hpp:180
common_serializer_backend(Sink &s) noexcept
Construction from a reference to a Sink.
Definition: write_backend.hpp:134
Common code is placed in this namespace.
Definition: eagine.hpp:21
auto write(span< const unsigned short > values, span_size_t &done) -> result override
Writes ushort values, returns how many were done through second argument.
Definition: write_backend.hpp:190
auto sink() -> serializer_data_sink *final
Returns a pointer to the associated data sink, if any.
Definition: write_backend.hpp:143
virtual auto type_id() -> identifier=0
Returns a descriptive identifier of the implementation.
virtual auto finish_element(span_size_t index) -> result=0
Finishes the serialization of a container element.
Class for manipulating and testing a group of enumeration-based bits.
Definition: bitfield.hpp:19
Abstract base class for serialization data sinks.
Definition: data_sink.hpp:24
auto write(span< const bool > values, span_size_t &done) -> result override
Writes boolean values, returns how many were done through second argument.
Definition: write_backend.hpp:155
auto write(span< const unsigned long long > values, span_size_t &done) -> result override
Writes ulong long values, returns how many were done through second argument.
Definition: write_backend.hpp:205
auto begin_element(span_size_t) -> result override
Begins the serialization of a container element.
Definition: write_backend.hpp:249
auto finish_struct() -> result override
Finishes the serialization of a structure instance.
Definition: write_backend.hpp:243
auto write(span< const decl_name > values, span_size_t &done) -> result override
Writes decl_name values, returns how many were done through second argument.
Definition: write_backend.hpp:224
virtual auto finish_list() -> result=0
Finishes the serialization of a container instance.
auto finish_element(span_size_t) -> result override
Finishes the serialization of a container element.
Definition: write_backend.hpp:252
Base template for abstract interfaces, implements common functionality.
Definition: interface.hpp:18
auto write(span< const string_view > values, span_size_t &done) -> result override
Writes string values, returns how many were done through second argument.
Definition: write_backend.hpp:229
auto begin_struct(span_size_t) -> result override
Begins the serialization of a structure instance.
Definition: write_backend.hpp:234
auto begin() -> result override
Starts the serialization of a potentially complex structured value.
Definition: write_backend.hpp:151
virtual auto finish_struct() -> result=0
Finishes the serialization of a structure instance.
auto finish_list() -> result override
Finishes the serialization of a container instance.
Definition: write_backend.hpp:255
auto write(span< const long > values, span_size_t &done) -> result override
Writes long values, returns how many were done through second argument.
Definition: write_backend.hpp:176
auto write(span< const double > values, span_size_t &done) -> result override
Writes double values, returns how many were done through second argument.
Definition: write_backend.hpp:214
virtual auto write(span< const bool >, span_size_t &) -> result=0
Writes boolean values, returns how many were done through second argument.
auto set_sink(Sink &s) noexcept -> auto &
Sets a reference to a new Sink object.
Definition: write_backend.hpp:138
auto write(span< const short > values, span_size_t &done) -> result override
Writes short int values, returns how many were done through second argument.
Definition: write_backend.hpp:168
virtual auto begin() -> result=0
Starts the serialization of a potentially complex structured value.
virtual auto finish_member(string_view name) -> result=0
Finishes the serialization of a structure data member.
virtual auto finish() -> result=0
Finishes the serialization of a potentially complex structured value.
auto write(span< const std::uint8_t > values, span_size_t &done) -> result override
Writes 8-bit uint values, returns how many were done through second argument.
Definition: write_backend.hpp:185
auto write(span< const identifier > values, span_size_t &done) -> result override
Writes identifier values, returns how many were done through second argument.
Definition: write_backend.hpp:219
auto write(span< const unsigned > values, span_size_t &done) -> result override
Writes uint values, returns how many were done through second argument.
Definition: write_backend.hpp:195
CRTP mixin implementing the common parts of serializer backends.
Definition: write_backend.hpp:128
auto finish_member(string_view) -> result override
Finishes the serialization of a structure data member.
Definition: write_backend.hpp:240
auto begin_member(string_view) -> result override
Begins the serialization of a structure data member.
Definition: write_backend.hpp:237
auto enum_as_string() -> bool override
@brie Indicates if the backed stores enumerators as strings (or numeric values).
Definition: write_backend.hpp:147
virtual auto begin_member(string_view name) -> result=0
Begins the serialization of a structure data member.
auto finish() -> result override
Finishes the serialization of a potentially complex structured value.
Definition: write_backend.hpp:258
virtual auto enum_as_string() -> bool=0
@brie Indicates if the backed stores enumerators as strings (or numeric values).
std::uint64_t identifier_t
The underlying integer type for eagine::identifier.
Definition: identifier_t.hpp:19
auto write(span< const int > values, span_size_t &done) -> result override
Writes int values, returns how many were done through second argument.
Definition: write_backend.hpp:172
auto write(span< const char > values, span_size_t &done) -> result override
Writes character values, returns how many were done through second argument.
Definition: write_backend.hpp:159
auto write(span< const unsigned long > values, span_size_t &done) -> result override
Writes ulong values, returns how many were done through second argument.
Definition: write_backend.hpp:200
virtual auto begin_list(span_size_t element_count) -> result=0
Begins the serialization of a container instance.
virtual auto begin_element(span_size_t index) -> result=0
Begins the serialization of a container element.
auto write(span< const float > values, span_size_t &done) -> result override
Writes float values, returns how many were done through second argument.
Definition: write_backend.hpp:210
Interface for serialization write backends.
Definition: write_backend.hpp:26
bitfield< serialization_error_code > serialization_errors
Alias for serialization error bitfield.
Definition: result.hpp:100
common_serializer_backend() noexcept=default
Default constructor.
auto begin_list(span_size_t) -> result override
Begins the serialization of a container instance.
Definition: write_backend.hpp:246

Copyright © 2015-2021 Matúš Chochlík.
<chochlik -at -gmail.com>
Documentation generated on Tue Apr 13 2021 by Doxygen (version 1.8.17).