30 std::span<const std::byte> payload;
31 std::size_t consumed = 0;
32 std::uint8_t kind = 0;
33 [[nodiscard]]
bool complete() const noexcept {
return consumed != 0; }
38concept Framer =
requires(F& f, std::span<const std::byte> in) {
39 { f.next(in) }
noexcept -> std::same_as<FrameView>;
46 { d.decode(frame, rx_ts, sink) }
noexcept -> std::same_as<fastmm::venues::ParseStatus>;
53 { e.encode(cmd, out) }
noexcept -> std::same_as<std::size_t>;
63 { s.on_frame(frame) }
noexcept -> std::same_as<bool>;
64 { s.on_timer(now_ns) }
noexcept;
65 { s.state() }
noexcept -> std::same_as<SessionState>;
74template <
class T,
bool big_endian>
76 unsigned char raw[
sizeof(T)];
77 [[nodiscard]] FASTMM_FORCE_INLINE T get() const noexcept {
79 std::memcpy(&v, raw,
sizeof(T));
80 return big_endian ? swap(v) : v;
82 FASTMM_FORCE_INLINE
void set(T v)
noexcept {
83 const T w = big_endian ? swap(v) : v;
84 std::memcpy(raw, &w,
sizeof(T));
88 [[nodiscard]]
static T swap(T v)
noexcept {
91 return static_cast<T
>(__builtin_bswap16(
static_cast<std::uint16_t
>(v)));
93 return static_cast<T
>(__builtin_bswap32(
static_cast<std::uint32_t
>(v)));
95 return static_cast<T
>(__builtin_bswap64(
static_cast<std::uint64_t
>(v)));
101using be16_t = detail::EndianField<std::uint16_t, true>;
102using be32_t = detail::EndianField<std::uint32_t, true>;
103using be64_t = detail::EndianField<std::uint64_t, true>;
104using le16_t = detail::EndianField<std::uint16_t, false>;
105using le32_t = detail::EndianField<std::uint32_t, false>;
106using le64_t = detail::EndianField<std::uint64_t, false>;
110static_assert(std::is_trivially_copyable_v<be64_t> && std::is_standard_layout_v<be64_t>);