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

read_backend.hpp
Go to the documentation of this file.
1 
9 #ifndef EAGINE_SERIALIZE_READ_BACKEND_HPP
10 #define EAGINE_SERIALIZE_READ_BACKEND_HPP
11 
12 #include "../identifier.hpp"
13 #include "../interface.hpp"
14 #include "../reflect/decl_name.hpp"
15 #include "data_source.hpp"
16 #include "result.hpp"
17 #include <cstdint>
18 
19 namespace eagine {
20 //------------------------------------------------------------------------------
25 struct deserializer_backend : interface<deserializer_backend> {
26 
29 
31  virtual auto type_id() -> identifier = 0;
32 
34  virtual auto source() -> deserializer_data_source* = 0;
35 
37  virtual auto enum_as_string() -> bool = 0;
38 
40  virtual auto begin() -> result = 0;
41 
43  virtual auto read(span<bool>, span_size_t&) -> result = 0;
44 
46  virtual auto read(span<char>, span_size_t&) -> result = 0;
47 
49  virtual auto read(span<std::int8_t>, span_size_t&) -> result = 0;
50 
52  virtual auto read(span<short>, span_size_t&) -> result = 0;
53 
55  virtual auto read(span<int>, span_size_t&) -> result = 0;
56 
58  virtual auto read(span<long>, span_size_t&) -> result = 0;
59 
61  virtual auto read(span<long long>, span_size_t&) -> result = 0;
62 
64  virtual auto read(span<std::uint8_t>, span_size_t&) -> result = 0;
65 
67  virtual auto read(span<unsigned short>, span_size_t&) -> result = 0;
68 
70  virtual auto read(span<unsigned>, span_size_t&) -> result = 0;
71 
73  virtual auto read(span<unsigned long>, span_size_t&) -> result = 0;
74 
76  virtual auto read(span<unsigned long long>, span_size_t&) -> result = 0;
77 
79  virtual auto read(span<float>, span_size_t&) -> result = 0;
80 
82  virtual auto read(span<double>, span_size_t&) -> result = 0;
83 
85  virtual auto read(span<identifier>, span_size_t&) -> result = 0;
86 
88  virtual auto read(span<decl_name_storage>, span_size_t&) -> result = 0;
89 
91  virtual auto read(span<std::string>, span_size_t&) -> result = 0;
92 
94  virtual auto begin_struct(span_size_t& member_count) -> result = 0;
95 
97  virtual auto begin_member(string_view name) -> result = 0;
98 
100  virtual auto finish_member(string_view name) -> result = 0;
101 
103  virtual auto finish_struct() -> result = 0;
104 
106  virtual auto begin_list(span_size_t& element_count) -> result = 0;
107 
109  virtual auto begin_element(span_size_t index) -> result = 0;
110 
112  virtual auto finish_element(span_size_t index) -> result = 0;
113 
115  virtual auto finish_list() -> result = 0;
116 
118  virtual auto finish() -> result = 0;
119 };
120 //------------------------------------------------------------------------------
125 template <typename Derived, typename Source = deserializer_data_source>
127 public:
129  common_deserializer_backend() noexcept = default;
130 
133  : _source{&source} {}
134 
136  auto set_source(Source& s) noexcept -> Derived& {
137  _source = &s;
138  return derived();
139  }
140 
142  using result = deserialization_errors;
143 
144  auto source() -> deserializer_data_source* final {
145  return _source;
146  }
147 
148  auto enum_as_string() -> bool override {
149  return false;
150  }
151 
152  auto begin() -> result override {
153  return {};
154  }
155 
156  auto read(span<bool> values, span_size_t& done) -> result override {
157  return derived().do_read(values, done);
158  }
159 
160  auto read(span<char> values, span_size_t& done) -> result override {
161  return derived().do_read(values, done);
162  }
163 
164  auto read(span<std::int8_t> values, span_size_t& done) -> result override {
165  return derived().do_read(values, done);
166  }
167 
168  auto read(span<short> values, span_size_t& done) -> result override {
169  return derived().do_read(values, done);
170  }
171 
172  auto read(span<int> values, span_size_t& done) -> result override {
173  return derived().do_read(values, done);
174  }
175 
176  auto read(span<long> values, span_size_t& done) -> result override {
177  return derived().do_read(values, done);
178  }
179 
180  auto read(span<long long> values, span_size_t& done) -> result override {
181  return derived().do_read(values, done);
182  }
183 
184  auto read(span<std::uint8_t> values, span_size_t& done) -> result override {
185  return derived().do_read(values, done);
186  }
187 
188  auto read(span<unsigned short> values, span_size_t& done)
189  -> result override {
190  return derived().do_read(values, done);
191  }
192 
193  auto read(span<unsigned> values, span_size_t& done) -> result override {
194  return derived().do_read(values, done);
195  }
196 
197  auto read(span<unsigned long> values, span_size_t& done)
198  -> result override {
199  return derived().do_read(values, done);
200  }
201 
202  auto read(span<unsigned long long> values, span_size_t& done)
203  -> result override {
204  return derived().do_read(values, done);
205  }
206 
207  auto read(span<float> values, span_size_t& done) -> result override {
208  return derived().do_read(values, done);
209  }
210 
211  auto read(span<double> values, span_size_t& done) -> result override {
212  return derived().do_read(values, done);
213  }
214 
215  auto read(span<identifier> values, span_size_t& done) -> result override {
216  return derived().do_read(values, done);
217  }
218 
219  auto read(span<decl_name_storage> values, span_size_t& done)
220  -> result override {
221  return derived().do_read(values, done);
222  }
223 
224  auto read(span<std::string> values, span_size_t& done) -> result override {
225  return derived().do_read(values, done);
226  }
227 
228  auto begin_struct(span_size_t&) -> result override {
229  return {};
230  }
231  auto begin_member(string_view) -> result override {
232  return {};
233  }
234  auto finish_member(string_view) -> result override {
235  return {};
236  }
237  auto finish_struct() -> result override {
238  return {};
239  }
240  auto begin_list(span_size_t&) -> result override {
241  return {};
242  }
243  auto begin_element(span_size_t) -> result override {
244  return {};
245  }
246  auto finish_element(span_size_t) -> result override {
247  return {};
248  }
249  auto finish_list() -> result override {
250  return {};
251  }
252  auto finish() -> result override {
253  return {};
254  }
255 
256 protected:
257  auto scan_for(
258  byte what,
260  const valid_if_positive<span_size_t>& step = {256})
261  -> valid_if_nonnegative<span_size_t> {
262  EAGINE_ASSERT(_source);
263  return _source->scan_for(what, max, step);
264  }
265 
266  auto top(span_size_t size) -> memory::const_block {
267  EAGINE_ASSERT(_source);
268  return _source->top(size);
269  }
270 
271  auto top_string(span_size_t size) {
272  return as_chars(top(size));
273  }
274 
275  auto string_before(
276  char c,
277  const valid_if_positive<span_size_t>& max,
278  const valid_if_positive<span_size_t>& step = {256}) {
279  auto found = scan_for(byte(c), max, step);
280  return top_string(extract_or(found, 0));
281  }
282 
283  auto top_char() {
284  return top_string(1);
285  }
286 
287  void pop(span_size_t size) {
288  EAGINE_ASSERT(_source);
289  _source->pop(size);
290  }
291 
292  auto starts_with(string_view what) -> bool {
293  return are_equal(top_string(what.size()), what);
294  }
295 
296  auto starts_with(char c) -> bool {
297  return starts_with(view_one(c));
298  }
299 
300  auto consume(string_view what, result& errors) -> bool {
301  errors = {};
302  auto top_str = top_string(what.size());
303  if(top_str.size() < what.size()) {
304  errors |= error_code::not_enough_data;
305  } else {
306  if(are_equal(top_str, what)) {
307  pop(what.size());
308  return true;
309  } else {
310  errors |= error_code::unexpected_data;
311  }
312  }
313  return false;
314  }
315 
316  auto consume(char what, result& errors) -> bool {
317  return consume(view_one(what), errors);
318  }
319 
320  template <typename Function>
321  void consume_until(
322  Function predicate,
323  const valid_if_positive<span_size_t> step = {256}) {
324  while(auto pos = _source->scan_until(predicate, step, step)) {
325  if(extract(pos) > 0) {
326  pop(extract(pos));
327  } else {
328  break;
329  }
330  }
331  }
332 
333  auto require(string_view what) -> result {
334  result errors{};
335  auto top_str = top_string(what.size());
336  if(top_str.size() < what.size()) {
337  errors |= error_code::not_enough_data;
338  } else {
339  if(are_equal(top_str, what)) {
340  pop(what.size());
341  } else {
342  errors |= error_code::invalid_format;
343  }
344  }
345 
346  return errors;
347  }
348 
349  auto require(char what) -> result {
350  return require(view_one(what));
351  }
352 
353 private:
354  Source* _source{nullptr};
355 
356  auto derived() noexcept -> Derived& {
357  return *static_cast<Derived*>(this);
358  }
359 };
360 //------------------------------------------------------------------------------
361 } // namespace eagine
362 
363 #endif // EAGINE_SERIALIZE_READ_BACKEND_HPP
virtual auto finish() -> result=0
Finishes the deserialization of a potentially complex structured value.
std::ptrdiff_t span_size_t
Signed span size type used by eagine.
Definition: types.hpp:36
basic_string_span< const char > string_view
Alias for const string views.
Definition: string_span.hpp:116
virtual auto type_id() -> identifier=0
Returns a descriptive identifier of the implementation.
auto set_source(Source &s) noexcept -> Derived &
Sets a reference to a new Source object.
Definition: read_backend.hpp:136
Typed enumeration for GL error code constants.
Definition: enum_types.hpp:32
virtual auto begin_struct(span_size_t &member_count) -> result=0
Begins the deserialization of a structure instance.
auto read(span< char > values, span_size_t &done) -> result override
Reads character values, returns how many were done through second argument.
Definition: read_backend.hpp:160
virtual auto begin_element(span_size_t index) -> result=0
Begins the deserialization of a container element.
virtual auto begin_list(span_size_t &element_count) -> result=0
Begins the deserialization of a container instance.
auto read(span< unsigned > values, span_size_t &done) -> result override
Reads uint values, returns how many were done through second argument.
Definition: read_backend.hpp:193
Common code is placed in this namespace.
Definition: eagine.hpp:21
common_deserializer_backend(Source &source) noexcept
Construction from a reference to a Source.
Definition: read_backend.hpp:132
auto begin_member(string_view) -> result override
Begins the deserialization of a structure data member.
Definition: read_backend.hpp:231
static constexpr auto extract(api_result_value< Result, api_result_validity::never > &) noexcept -> Result &
Overload of extract for api_result_value.
Definition: c_api_wrap.hpp:270
basic_block< true > const_block
Alias for const byte memory span.
Definition: block.hpp:32
Primary template for conditionally valid values.
Definition: decl.hpp:49
auto read(span< unsigned long > values, span_size_t &done) -> result override
Reads ulong values, returns how many were done through second argument.
Definition: read_backend.hpp:197
auto begin_element(span_size_t) -> result override
Begins the deserialization of a container element.
Definition: read_backend.hpp:243
auto read(span< unsigned short > values, span_size_t &done) -> result override
Reads ushort values, returns how many were done through second argument.
Definition: read_backend.hpp:188
virtual auto begin() -> result=0
Starts the deserialization of a potentially complex structured value.
virtual auto finish_member(string_view name) -> result=0
Finishes the deserialization of a structure data member.
auto read(span< std::int8_t > values, span_size_t &done) -> result override
Reads 8-bit int values, returns how many were done through second argument.
Definition: read_backend.hpp:164
auto begin_struct(span_size_t &) -> result override
Begins the deserialization of a structure instance.
Definition: read_backend.hpp:228
deserialization_error_code
Deserialization error code bits enumeration.
Definition: result.hpp:53
Base template for abstract interfaces, implements common functionality.
Definition: interface.hpp:18
auto finish_member(string_view) -> result override
Finishes the deserialization of a structure data member.
Definition: read_backend.hpp:234
auto source() -> deserializer_data_source *final
Returns a pointer to the associated data source, if any.
Definition: read_backend.hpp:144
virtual auto finish_list() -> result=0
Finishes the deserialization of a container instance.
auto begin() -> result override
Starts the deserialization of a potentially complex structured value.
Definition: read_backend.hpp:152
virtual auto source() -> deserializer_data_source *=0
Returns a pointer to the associated data source, if any.
auto finish_element(span_size_t) -> result override
Finishes the deserialization of a container element.
Definition: read_backend.hpp:246
auto begin_list(span_size_t &) -> result override
Begins the deserialization of a container instance.
Definition: read_backend.hpp:240
auto read(span< bool > values, span_size_t &done) -> result override
Reads boolean values, returns how many were done through second argument.
Definition: read_backend.hpp:156
common_deserializer_backend() noexcept=default
Default constructor.
bitfield< deserialization_error_code > deserialization_errors
Alias for deserialization error bitfield.
Definition: result.hpp:106
Abstract base class for deserialization data sources.
Definition: data_source.hpp:25
virtual auto finish_struct() -> result=0
Finishes the deserialization of a structure instance.
Interface for deserialization read backends.
Definition: read_backend.hpp:25
virtual auto begin_member(string_view name) -> result=0
Begins the deserialization of a structure data member.
auto read(span< short > values, span_size_t &done) -> result override
Reads short values, returns how many were done through second argument.
Definition: read_backend.hpp:168
auto read(span< long long > values, span_size_t &done) -> result override
Reads long long values, returns how many were done through second argument.
Definition: read_backend.hpp:180
auto enum_as_string() -> bool override
@brie Indicates if the backed stores enumerators as strings (or numeric values).
Definition: read_backend.hpp:148
auto read(span< long > values, span_size_t &done) -> result override
Reads long values, returns how many were done through second argument.
Definition: read_backend.hpp:176
auto read(span< decl_name_storage > values, span_size_t &done) -> result override
Reads decl_name values, returns how many were done through second argument.
Definition: read_backend.hpp:219
auto read(span< std::uint8_t > values, span_size_t &done) -> result override
Reads 8-bit uint values, returns how many were done through second argument.
Definition: read_backend.hpp:184
auto finish_list() -> result override
Finishes the deserialization of a container instance.
Definition: read_backend.hpp:249
auto finish_struct() -> result override
Finishes the deserialization of a structure instance.
Definition: read_backend.hpp:237
auto read(span< double > values, span_size_t &done) -> result override
Reads double values, returns how many were done through second argument.
Definition: read_backend.hpp:211
auto read(span< std::string > values, span_size_t &done) -> result override
Reads string values, returns how many were done through second argument.
Definition: read_backend.hpp:224
auto read(span< int > values, span_size_t &done) -> result override
Reads int values, returns how many were done through second argument.
Definition: read_backend.hpp:172
virtual auto enum_as_string() -> bool=0
@brie Indicates if the backed stores enumerators as strings (or numeric values).
CRTP mixin implementing the common parts of deserializer backends.
Definition: read_backend.hpp:126
static constexpr auto as_chars(block blk) noexcept
Converts a block into a span of characters.
Definition: block.hpp:48
auto read(span< unsigned long long > values, span_size_t &done) -> result override
Reads ulong long values, returns how many were done through second argument.
Definition: read_backend.hpp:202
auto finish() -> result override
Finishes the deserialization of a potentially complex structured value.
Definition: read_backend.hpp:252
virtual auto finish_element(span_size_t index) -> result=0
Finishes the deserialization of a container element.
virtual auto read(span< bool >, span_size_t &) -> result=0
Reads boolean values, returns how many were done through second argument.
auto read(span< identifier > values, span_size_t &done) -> result override
Reads identifier values, returns how many were done through second argument.
Definition: read_backend.hpp:215
auto read(span< float > values, span_size_t &done) -> result override
Reads float values, returns how many were done through second argument.
Definition: read_backend.hpp:207

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