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

serialize.hpp
Go to the documentation of this file.
1 
9 #ifndef EAGINE_MESSAGE_BUS_SERIALIZE_HPP
10 #define EAGINE_MESSAGE_BUS_SERIALIZE_HPP
11 
12 #include "../extract.hpp"
13 #include "../message_id.hpp"
14 #include "../serialize/block_sink.hpp"
15 #include "../serialize/block_source.hpp"
16 #include "../serialize/data_buffer.hpp"
17 #include "../serialize/packed_block_sink.hpp"
18 #include "../serialize/packed_block_source.hpp"
19 #include "../serialize/read.hpp"
20 #include "../serialize/string_backend.hpp"
21 #include "../serialize/write.hpp"
22 #include "message.hpp"
23 #include <array>
24 
25 namespace eagine {
26 
27 template <identifier_t Sid, typename Selector>
28 struct get_serialize_buffer_size<Sid, message_id, Selector>
29  : get_serialize_buffer_size<Sid, message_id::base, Selector> {};
30 //------------------------------------------------------------------------------
31 namespace msgbus {
32 
37 
42 
45 template <typename T>
46 inline auto default_serialize_buffer_for(const T& inst) {
47  return serialize_buffer_for<default_serializer_backend::id_value>(inst);
48 }
49 //------------------------------------------------------------------------------
54 template <typename Backend>
56  message_id msg_id,
57  const message_view& msg,
58  Backend& backend)
59  -> std::enable_if_t<
60  std::is_base_of_v<serializer_backend, Backend>,
62 
63  auto message_params = std::make_tuple(
64  msg_id.class_(),
65  msg_id.method(),
66  msg.source_id,
67  msg.target_id,
68  msg.serializer_id,
69  msg.sequence_no,
70  msg.hop_count,
71  msg.age_quarter_seconds,
72  msg.priority,
73  msg.crypto_flags);
74  return serialize(message_params, backend);
75 }
76 //------------------------------------------------------------------------------
82 template <typename Backend>
84  message_id msg_id,
85  const message_view& msg,
86  Backend& backend)
87  -> std::enable_if_t<
88  std::is_base_of_v<serializer_backend, Backend>,
90 
91  auto errors = serialize_message_header(msg_id, msg, backend);
92 
93  if(!errors) {
94  if(auto sink = backend.sink()) {
95  errors |= extract(sink).write(msg.data);
96  } else {
98  }
99  }
100 
101  return errors;
102 }
103 //------------------------------------------------------------------------------
108 template <typename Backend>
110  identifier& class_id,
111  identifier& method_id,
112  stored_message& msg,
113  Backend& backend)
114  -> std::enable_if_t<
115  std::is_base_of_v<deserializer_backend, Backend>,
117 
118  auto message_params = std::tie(
119  class_id,
120  method_id,
121  msg.source_id,
122  msg.target_id,
123  msg.serializer_id,
124  msg.sequence_no,
125  msg.hop_count,
126  msg.age_quarter_seconds,
127  msg.priority,
128  msg.crypto_flags);
129  return deserialize(message_params, backend);
130 }
131 //------------------------------------------------------------------------------
137 template <typename Backend>
139  identifier& class_id,
140  identifier& method_id,
141  stored_message& msg,
142  Backend& backend)
143  -> std::enable_if_t<
144  std::is_base_of_v<deserializer_backend, Backend>,
146 
147  auto errors = deserialize_message_header(class_id, method_id, msg, backend);
148 
149  if(!errors) {
150  if(auto source{backend.source()}) {
151  msg.fetch_all_from(extract(source));
152  } else {
154  }
155  }
156 
157  return errors;
158 }
159 //------------------------------------------------------------------------------
164 template <typename Backend>
166  message_id& msg_id,
167  stored_message& msg,
168  Backend& backend)
169  -> std::enable_if_t<
170  std::is_base_of_v<deserializer_backend, Backend>,
172 
173  identifier class_id{};
174  identifier method_id{};
175  deserialization_errors errors =
176  deserialize_message(class_id, method_id, msg, backend);
177  if(!errors) {
178  msg_id = {class_id, method_id};
179  }
180  return errors;
181 }
182 //------------------------------------------------------------------------------
183 // default_serialize
184 //------------------------------------------------------------------------------
190 template <typename T>
191 inline auto default_serialize(T& value, memory::block blk)
193  block_data_sink sink(blk);
194  default_serializer_backend backend(sink);
195  auto errors = serialize(value, backend);
196  return {sink.done(), errors};
197 }
198 //------------------------------------------------------------------------------
205 template <typename T>
207  T& value,
208  memory::block blk,
210  packed_block_data_sink sink(std::move(compressor), blk);
211  default_serializer_backend backend(sink);
212  auto errors = serialize(value, backend);
213  return {sink.done(), errors};
214 }
215 //------------------------------------------------------------------------------
221 inline auto
223  const auto value{msg_id.id_tuple()};
224  return default_serialize(value, blk);
225 }
226 //------------------------------------------------------------------------------
227 // default_deserialize
228 //------------------------------------------------------------------------------
234 template <typename T>
235 inline auto default_deserialize(T& value, memory::const_block blk)
237  block_data_source source(blk);
238  default_deserializer_backend backend(source);
239  auto errors = deserialize(value, backend);
240  return {source.remaining(), errors};
241 }
242 //------------------------------------------------------------------------------
249 template <typename T>
251  T& value,
254  packed_block_data_source source(std::move(compressor), blk);
255  default_deserializer_backend backend(source);
256  auto errors = deserialize(value, backend);
257  return {source.remaining(), errors};
258 }
259 //------------------------------------------------------------------------------
265 inline auto
267  std::tuple<identifier, identifier> value{};
268  auto result = default_deserialize(value, blk);
269  if(result) {
270  msg_id = {value};
271  }
272  return result;
273 }
274 //------------------------------------------------------------------------------
275 template <typename Backend, typename Value>
276 inline auto
277 stored_message::do_store_value(const Value& value, span_size_t max_size)
278  -> bool {
279  _buffer.resize(max_size);
280  block_data_sink sink(cover(_buffer));
281  Backend backend(sink);
282  auto errors = serialize(value, backend);
283  if(!errors) {
284  set_serializer_id(backend.type_id());
285  _buffer.resize(sink.done().size());
286  return true;
287  }
288  return false;
289 }
290 //------------------------------------------------------------------------------
291 template <typename Value>
292 inline auto
293 stored_message::store_value(const Value& value, span_size_t max_size) -> bool {
294  return do_store_value<default_serializer_backend>(value, max_size);
295 }
296 //------------------------------------------------------------------------------
297 template <typename Backend, typename Value>
298 inline auto stored_message::do_fetch_value(Value& value) -> bool {
299  block_data_source source(view(_buffer));
300  Backend backend(source);
301  auto errors = deserialize(value, backend);
302  return !errors;
303 }
304 //------------------------------------------------------------------------------
305 template <typename Value>
306 inline auto stored_message::fetch_value(Value& value) -> bool {
307  return do_fetch_value<default_deserializer_backend>(value);
308 }
309 //------------------------------------------------------------------------------
310 } // namespace msgbus
311 } // namespace eagine
312 
313 #endif // EAGINE_MESSAGE_BUS_SERIALIZE_HPP
Cross-platform implementation of deserializer backend using ASCII-only strings.
Definition: string_backend.hpp:206
std::ptrdiff_t span_size_t
Signed span size type used by eagine.
Definition: types.hpp:36
Common code is placed in this namespace.
Definition: eagine.hpp:21
auto store_value(const Value &value, span_size_t max_size) -> bool
Serializes and stores the specified value (up to max_size).
Definition: serialize.hpp:293
auto fetch_value(Value &value) -> bool
Deserializes the stored content into the specified value.
Definition: serialize.hpp:306
static constexpr auto cover(T *addr, S size) noexcept -> span_if_mutable< T >
Creates a span starting at the specified pointer and specified length.
Definition: span.hpp:465
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
Primary template for conditionally valid values.
Definition: decl.hpp:49
Class for manipulating and testing a group of enumeration-based bits.
Definition: bitfield.hpp:19
Serialization data sink backed by a pre-allocated memory block.
Definition: block_sink.hpp:23
auto serialize_message(message_id msg_id, const message_view &msg, Backend &backend) -> std::enable_if_t< std::is_base_of_v< serializer_backend, Backend >, serialization_errors >
Serializes a bus message with the specified serializer backend.
Definition: serialize.hpp:83
static constexpr auto view(T *addr, S size) noexcept -> const_span< T >
Creates a view starting at the specified pointer and specified length.
Definition: span.hpp:458
Unpacking deserialization data source backed by a pre-allocated memory block.
Definition: packed_block_source.hpp:21
auto done() const noexcept -> memory::block
Returns the part of the backing block already written to.
Definition: block_sink.hpp:43
Deserialization data source backed by a pre-allocated memory block.
Definition: block_source.hpp:23
auto default_serialize_packed(T &value, memory::block blk, data_compressor compressor) -> serialization_result< memory::const_block >
Uses backend and compressor to serialize and pack a value into a memory block.
Definition: serialize.hpp:206
auto serialize_message_header(message_id msg_id, const message_view &msg, Backend &backend) -> std::enable_if_t< std::is_base_of_v< serializer_backend, Backend >, serialization_errors >
Serializes a bus message header with the specified serializer backend.
Definition: serialize.hpp:55
auto deserialize(T &value, Backend &backend) -> std::enable_if_t< std::is_base_of_v< deserializer_backend, Backend >, deserialization_errors >
Deserializes a value with the specified serialization backend.
Definition: read.hpp:475
auto default_deserialize_packed(T &value, memory::const_block blk, data_compressor compressor) -> deserialization_result< memory::const_block >
Uses backend and compressor to deserialize and unpack a value from a block.
Definition: serialize.hpp:250
Combines message information and a non-owning view to message content.
Definition: message.hpp:288
Non-owning view of a contiguous range of memory with ValueType elements.
Definition: flatten_fwd.hpp:16
auto serialize(T &value, Backend &backend) -> std::enable_if_t< std::is_base_of_v< serializer_backend, Backend >, serialization_errors >
Serializes a value with the specified serialization backend.
Definition: write.hpp:480
auto deserialize_message_header(identifier &class_id, identifier &method_id, stored_message &msg, Backend &backend) -> std::enable_if_t< std::is_base_of_v< deserializer_backend, Backend >, deserialization_errors >
Deserializes a bus message header with the specified deserializer backend.
Definition: serialize.hpp:109
Packing serialization data sink backed by a pre-allocated memory block.
Definition: packed_block_sink.hpp:21
constexpr auto id_tuple() const noexcept -> std::tuple< identifier, identifier >
Returns the class and method identifiers in a tuple. See class_ See method.
Definition: message_id.hpp:78
auto default_serialize_message_type(message_id msg_id, memory::block blk)
Default-serializes the specified message id into a memory block.
Definition: serialize.hpp:222
auto default_serialize(T &value, memory::block blk) -> serialization_result< memory::const_block >
Uses the default backend to serialize a value into a memory block.
Definition: serialize.hpp:191
auto default_deserialize(T &value, memory::const_block blk) -> deserialization_result< memory::const_block >
Uses the default backend to deserialize a value from a memory block.
Definition: serialize.hpp:235
Class implementing data compression and decompresson.
Definition: compression.hpp:37
auto deserialize_message(identifier &class_id, identifier &method_id, stored_message &msg, Backend &backend) -> std::enable_if_t< std::is_base_of_v< deserializer_backend, Backend >, deserialization_errors >
Deserializes a bus message with the specified deserializer backend.
Definition: serialize.hpp:138
auto default_serialize_buffer_for(const T &inst)
Returns a suitable buffer for the serialization of the specified object.
Definition: serialize.hpp:46
Cross-platform implementation of serializer backend using ASCII-only strings.
Definition: string_backend.hpp:26
Basic template for limited length, packed string identifiers.
Definition: identifier.hpp:178
@ backend_error
Internal error in the serialization backend.
Class storing two identifier values representing class/method pair.
Definition: message_id.hpp:25
@ backend_error
Internal error in the deserialization backend.
Combines message information and an owned message content buffer.
Definition: message.hpp:316
auto default_deserialize_message_type(message_id &msg_id, memory::const_block blk)
Default-deserializes the specified message id from a memory block.
Definition: serialize.hpp:266
@ message_id
The message type id has been verified.

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