/workspaces/astro/sol3-sdk/cpp/sol3/core/message_serializer.h Source File

Space-ng SDK: /workspaces/astro/sol3-sdk/cpp/sol3/core/message_serializer.h Source File
Space-ng SDK
message_serializer.h
Go to the documentation of this file.
1 // Copyright (c) Space-ng, inc. All rights reserved.
2 
3 #pragma once
4 
7 #include "sol3/core/msg/message_header.h"
8 
9 #include <type_traits>
10 
11 namespace sol3::core {
12 
16  public:
18 
21 
22  void setPort(MessagePort const& port);
23 
25  MessagePort const& port() const;
26 
32  msg::MessageHeaderT const& header() const;
33 
35  void addStamp(msg::Stamp const& stamp);
36 
38  flatbuffers::span<uint8_t const> headerSpan() const;
39 
43  flatbuffers::span<uint8_t const> payload_span, msg::Stamp stamp);
44 
45  private:
46  void validatePayloadIdentifier(
47  flatbuffers::span<uint8_t const> payload_span) const;
48  size_t finishHeaderForPayloadSize(size_t payload_size, msg::Stamp stamp);
49 
50  MessagePort port_;
51  flatbuffers::FlatBufferBuilder header_builder_;
52  msg::MessageHeaderT header_;
53 };
54 
58  public:
61 
63  MessagePort const& port() const { return header_serializer_.port(); }
64 
66  msg::MessageHeaderT const& header() const {
67  return header_serializer_.header();
68  }
69 
71  void addStamp(msg::Stamp const& stamp) { header_serializer_.addStamp(stamp); }
72 
74  flatbuffers::span<uint8_t const> headerSpan() const {
75  return header_serializer_.headerSpan();
76  }
77 
81  flatbuffers::span<uint8_t const> payload_span, msg::Stamp stamp) {
82  return header_serializer_.finishHeaderFromPayloadBuffer(
83  payload_span, stamp);
84  }
85 
87  flatbuffers::span<uint8_t const> payloadSpan() const;
88 
89  template <typename TTableType, typename TBuilderFunction>
90  size_t finishPayload(TBuilderFunction&& builder_function, msg::Stamp stamp) {
91  using NativeTableType = typename TTableType::NativeTableType;
92  static_assert(
93  std::is_invocable_r_v<
94  flatbuffers::Offset<TTableType>,
95  TBuilderFunction,
96  flatbuffers::FlatBufferBuilder&>,
97  "finishPayload requires a callable with signature "
98  "(flatbuffers::FlatBufferBuilder&) -> flatbuffers::Offset<TTableType>");
99  if (makeFileIdentifier<typename TTableType::NativeTableType>() !=
100  port().payloadType()) {
101  throw std::invalid_argument("Invalid payload type.");
102  }
103  payload_builder_.Clear();
104  // We want 64 bit alignment of our buffer.
105  payload_builder_.PreAlign<uint64_t>(sizeof(uint64_t));
106  payload_builder_.FinishSizePrefixed(
107  std::forward<TBuilderFunction>(builder_function)(payload_builder_),
108  NativeTableType::GetIdentifier());
110  }
111 
118  template <typename TNativeTableType>
119  size_t finishPayload(TNativeTableType const& payload, msg::Stamp stamp) {
120  using TableType = typename TNativeTableType::TableType;
121  return finishPayload<TableType>(
122  [&payload](flatbuffers::FlatBufferBuilder& builder) {
123  return TableType::Pack(builder, &payload);
124  },
125  stamp);
126  }
127 
128  private:
129  MessageHeaderSerializer header_serializer_;
130  flatbuffers::FlatBufferBuilder payload_builder_;
131 };
132 
133 } // namespace sol3::core
Definition: message_serializer.h:15
MessageHeaderSerializer(MessagePort port)
Initialize with the destination message port.
void setPort(MessagePort const &port)
msg::MessageHeaderT const & header() const
void addStamp(msg::Stamp const &stamp)
Append a timestamp to the header.
size_t finishHeaderFromPayloadBuffer(flatbuffers::span< uint8_t const > payload_span, msg::Stamp stamp)
flatbuffers::span< uint8_t const > headerSpan() const
Size-prefixed header span for the most recently finished message.
MessagePort const & port() const
Destination message port.
Definition: message_port.h:19
Definition: message_serializer.h:57
size_t finishPayload(TBuilderFunction &&builder_function, msg::Stamp stamp)
Definition: message_serializer.h:90
msg::MessageHeaderT const & header() const
A constant view of the message header.
Definition: message_serializer.h:66
flatbuffers::span< uint8_t const > headerSpan() const
Size-prefixed header span for the most recently finished message.
Definition: message_serializer.h:74
void addStamp(msg::Stamp const &stamp)
Append a timestamp to the header.
Definition: message_serializer.h:71
size_t finishPayload(TNativeTableType const &payload, msg::Stamp stamp)
Definition: message_serializer.h:119
MessagePort const & port() const
Destination message port.
Definition: message_serializer.h:63
size_t finishHeaderFromPayloadBuffer(flatbuffers::span< uint8_t const > payload_span, msg::Stamp stamp)
Definition: message_serializer.h:80
MessageSerializer(MessagePort port)
Initialize with the destination message port.
flatbuffers::span< uint8_t const > payloadSpan() const
Non-size-prefixed payload span for the most recently finished message.
Definition: any_message_input.h:15