18#ifndef TEEUI_MSG_FORMATTING_H_
19#define TEEUI_MSG_FORMATTING_H_
33template <
typename... fields>
class Message {};
35template <
size_t... idx,
typename... T>
37 std::tuple<T...>&& t) {
38 return {std::move(std::get<idx>(t))...};
41template <
typename... T>
42std::tuple<std::remove_reference_t<T>&&...>
tuple_move(std::tuple<T...>&& t) {
46template <
typename... T>
47std::tuple<std::remove_reference_t<T>&&...>
tuple_move(std::tuple<T...>& t) {
51void zero(
volatile uint8_t* begin,
const volatile uint8_t* end);
57 "StreamState must be instantiated with 1 byte sized type, e.g., uint8_t or const uint8_t.");
59 template <
size_t size>
73 operator bool()
const {
return pos_ !=
nullptr; }
76 template <
typename U = T>
80 auto offset = (((
pos + 11UL) & ~7UL) - 4UL) -
pos;
81 if (*
this += offset +
sizeof(
size)) {
84 *
reinterpret_cast<uint32_t*
>(
pos_ -
sizeof(
size)) =
size;
90 template <
typename U = T>
94 auto offset = (((
pos + 11UL) & ~7UL) - 4UL) -
pos;
95 if (*
this += offset +
sizeof(uint32_t)) {
96 return *
reinterpret_cast<const uint32_t*
>(
pos_ -
sizeof(uint32_t));
112inline void zero(
const volatile uint8_t*,
const volatile uint8_t*) {}
136 if (in_ &&
size ==
sizeof(T))
137 result = *
reinterpret_cast<const T*
>(pos);
140 return {in_, result};
147template <
typename Head,
typename... Tail>
149 out =
write(out, head);
154 return {in, [&in]() -> Msg {
167template <
size_t first_idx,
size_t... idx,
typename HEAD,
typename... T>
168std::tuple<T&&...>
tuple_tail(std::index_sequence<first_idx, idx...>, std::tuple<HEAD, T...>&& t) {
169 return {std::move(std::get<idx>(t))...};
172template <
size_t first_idx,
size_t... idx,
typename HEAD,
typename... T>
173std::tuple<
const T&...>
tuple_tail(std::index_sequence<first_idx, idx...>,
174 const std::tuple<HEAD, T...>& t) {
175 return {std::get<idx>(t)...};
178template <
typename HEAD,
typename... Tail>
179std::tuple<Tail&&...>
tuple_tail(std::tuple<HEAD, Tail...>&& t) {
180 return tuple_tail(std::make_index_sequence<
sizeof...(Tail) + 1>(), std::move(t));
183template <
typename HEAD,
typename... Tail>
184std::tuple<
const Tail&...>
tuple_tail(
const std::tuple<HEAD, Tail...>& t) {
185 return tuple_tail(std::make_index_sequence<
sizeof...(Tail) + 1>(), t);
Definition: msg_formatting.h:33
Definition: msg_formatting.h:53
StreamState(T *buffer, size_t size)
Definition: msg_formatting.h:61
ptr_t pos() const
Definition: msg_formatting.h:74
void bad()
Definition: msg_formatting.h:101
StreamState & operator+=(size_t offset)
Definition: msg_formatting.h:63
StreamState()
Definition: msg_formatting.h:62
ptr_t end_
Definition: msg_formatting.h:105
std::enable_if< std::is_const< U >::value, uint32_t >::type extractFieldSize()
Definition: msg_formatting.h:91
T * ptr_t
Definition: msg_formatting.h:58
StreamState(T(&buffer)[size])
Definition: msg_formatting.h:60
ptr_t begin_
Definition: msg_formatting.h:104
bool insertFieldSize(typename std::enable_if<!std::is_const< U >::value, uint32_t >::type size)
Definition: msg_formatting.h:77
ptr_t pos_
Definition: msg_formatting.h:106
uint32_t size
Definition: io.h:2
std::vector< std::uint8_t > Message
Definition: tcp_socket.h:30
std::tuple< ReadStream, MsgVector< uint8_t > > read(Message< MsgVector< uint8_t > >, ReadStream in)
Definition: common_message_types.h:127
typename msg2tuple< T >::type msg2tuple_t
Definition: msg_formatting.h:165
std::tuple< std::remove_reference_t< T > &&... > tuple_move(std::tuple< T... > &&t)
Definition: msg_formatting.h:42
WriteStream write(WriteStream out, const MsgVector< uint8_t > &v)
Definition: common_message_types.h:130
std::tuple< T &&... > tuple_tail(std::index_sequence< first_idx, idx... >, std::tuple< HEAD, T... > &&t)
Definition: msg_formatting.h:168
std::tuple< ReadStream, T > readSimpleType(ReadStream in)
Definition: msg_formatting.h:133
void zero(volatile uint8_t *begin, const volatile uint8_t *end)
StreamState< const uint8_t > ReadStream
Definition: msg_formatting.h:110
std::tuple< std::remove_reference_t< T > &&... > tuple_move_helper(std::index_sequence< idx... >, std::tuple< T... > &&t)
Definition: msg_formatting.h:36
StreamState< uint8_t > WriteStream
Definition: msg_formatting.h:109
uint8_t type
Definition: pairing_connection.h:0
std::tuple< T... > type
Definition: msg_formatting.h:163
Definition: msg_formatting.h:161