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

fast_backend.hpp
Go to the documentation of this file.
1 
9 #ifndef EAGINE_SERIALIZE_FAST_BACKEND_HPP
10 #define EAGINE_SERIALIZE_FAST_BACKEND_HPP
11 
12 #include "read_backend.hpp"
13 #include "write_backend.hpp"
14 
15 namespace eagine {
16 //------------------------------------------------------------------------------
17 class fast_serializer_backend
18  : public serializer_backend_id<
19  common_serializer_backend<fast_serializer_backend>,
20  EAGINE_ID_V(FastLocal)> {
21  using base = serializer_backend_id<
22  common_serializer_backend<fast_serializer_backend>,
23  EAGINE_ID_V(FastLocal)>;
24 
25 public:
26  using base::base;
27  using base::remaining_size;
28  using base::sink;
29  using error_code = serialization_error_code;
30  using result = serialization_errors;
31 
32  template <typename T>
33  auto do_write(span<const T> values, span_size_t& done) -> result {
34  result errors{};
35  const span_size_t remaining = remaining_size();
36  span_size_t can_do = remaining / span_size(sizeof(T));
37  if(can_do < values.size()) {
38  values = head(values, can_do);
40  } else {
41  can_do = values.size();
42  }
43  errors |= sink(as_bytes(values));
44  done = can_do;
45  return errors;
46  }
47 
48  template <typename Str>
49  auto do_write_strings(span<const Str> values, span_size_t& done) -> result {
50  done = 0;
51  serialization_errors errors{};
52  for(auto& str : values) {
53  span_size_t written{0};
54  errors |= do_write(view_one(str.size()), written);
55  if(errors) {
56  return errors;
57  }
58  sink(str);
59  done += written;
60  }
61  return errors;
62  }
63 
64  auto do_write(span<const decl_name> values, span_size_t& done) {
65  return do_write_strings(values, done);
66  }
67 
68  auto do_write(span<const string_view> values, span_size_t& done) {
69  return do_write_strings(values, done);
70  }
71 
72  auto begin_struct(span_size_t size) -> result final {
73  span_size_t written{0};
74  return do_write(view_one(size), written);
75  }
76 
77  auto begin_list(span_size_t size) -> result final {
78  span_size_t written{0};
79  return do_write(view_one(size), written);
80  }
81 };
82 //------------------------------------------------------------------------------
83 class fast_deserializer_backend
84  : public serializer_backend_id<
85  common_deserializer_backend<fast_deserializer_backend>,
86  EAGINE_ID_V(FastLocal)> {
87  using base = serializer_backend_id<
88  common_deserializer_backend<fast_deserializer_backend>,
89  EAGINE_ID_V(FastLocal)>;
90 
91 public:
92  using base::base;
93  using base::pop;
94  using base::top;
95  using error_code = deserialization_error_code;
96  using result = deserialization_errors;
97 
98  template <typename T>
99  auto do_read(span<T> values, span_size_t& done) -> result {
100  auto dst = as_bytes(values);
101  auto src = top(dst.size());
102  const auto ts = span_size(sizeof(T));
103  if(src.size() < ts) {
104  return {error_code::not_enough_data};
105  }
106  result errors{};
107  if(src.size() < dst.size()) {
108  done = src.size() / ts;
109  src = head(src, done * ts);
110  errors |= error_code::incomplete_read;
111  } else {
112  done = values.size();
113  }
114  memory::copy(src, dst);
115  pop(src.size());
116  return errors;
117  }
118 
119  auto do_read(span<decl_name_storage> values, span_size_t& done) -> result {
120  result errors{};
121  done = 0;
122  for(auto& name : values) {
123  span_size_t unused{0};
124  span_size_t size{0};
125  errors |= do_read(cover_one(size), unused);
126  if(errors) {
127  break;
128  }
129  auto src = as_chars(top(size));
130  if(src.size() < size) {
131  return {error_code::not_enough_data};
132  }
133  name.assign(src);
134  pop(src.size());
135  ++done;
136  }
137  return errors;
138  }
139 
140  auto do_read(span<std::string> values, span_size_t& done) -> result {
141  result errors{};
142  done = 0;
143  for(auto& str : values) {
144  span_size_t unused{0};
145  span_size_t size{0};
146  errors |= do_read(cover_one(size), unused);
147  if(errors) {
148  break;
149  }
150  auto src = as_chars(top(size));
151  if(src.size() < size) {
152  return {error_code::not_enough_data};
153  }
154  assign_to(str, src);
155  pop(src.size());
156  ++done;
157  }
158  return errors;
159  }
160 
161  auto begin_struct(span_size_t& size) -> result final {
162  span_size_t done{0};
163  return do_read(cover_one(size), done);
164  }
165 
166  auto begin_list(span_size_t& size) -> result final {
167  span_size_t done{0};
168  return do_read(cover_one(size), done);
169  }
170 };
171 //------------------------------------------------------------------------------
172 } // namespace eagine
173 
174 #endif // EAGINE_SERIALIZE_FAST_BACKEND_HPP
std::ptrdiff_t span_size_t
Signed span size type used by eagine.
Definition: types.hpp:36
static constexpr auto as_bytes(basic_span< T, P, S > spn) noexcept -> basic_block< std::is_const_v< T >>
Converts a span into a basic_block.
Definition: block.hpp:39
#define EAGINE_ID_V(NAME)
Macro for constructing instances of eagine::identifier_t.
Definition: identifier.hpp:359
static constexpr auto span_size(T v) noexcept
Converts argument to span size type.
Definition: types.hpp:59
Common code is placed in this namespace.
Definition: eagine.hpp:21
auto sink() -> serializer_data_sink *final
Definition: write_backend.hpp:143
static constexpr auto head(basic_span< T, P, S > s, L l) noexcept -> basic_span< T, P, S >
Returns the first l elements from the front of a span.
Definition: span_algo.hpp:99
static constexpr auto assign_to(std::basic_string< C, T, A > &str, memory::basic_span< const C, P, S > spn) -> auto &
Assigns the contents of a span of characters to a standard string.
Definition: string_span.hpp:137
deserialization_error_code
Deserialization error code bits enumeration.
Definition: result.hpp:53
serialization_error_code
Serialization error code bits enumeration.
Definition: result.hpp:24
bitfield< deserialization_error_code > deserialization_errors
Alias for deserialization error bitfield.
Definition: result.hpp:106
@ incomplete_write
Incomplete write, remaining data should be written later.
static constexpr auto as_chars(block blk) noexcept
Converts a block into a span of characters.
Definition: block.hpp:48
static auto copy(const_block source, block dest) -> block
Copies the content of source block to destination block.
Definition: copy.hpp:23
bitfield< serialization_error_code > serialization_errors
Alias for serialization error bitfield.
Definition: result.hpp:100

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