Zero-copy TX: span_writer packer, static buffers, no vector returns
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
#include <array>
|
||||
#include <cstdint>
|
||||
#include <span>
|
||||
#include <string>
|
||||
#include <tuple>
|
||||
#include <vector>
|
||||
@@ -96,18 +97,27 @@ struct DecodedMessage {
|
||||
std::vector<uint8_t> payload;
|
||||
};
|
||||
|
||||
inline std::vector<uint8_t> pack_envelope(uint32_t message_id, const std::vector<uint8_t> &payload) {
|
||||
uint32_t checksum = halfsiphash::hash32(payload.data(), payload.size(), hash_key);
|
||||
msgpack::packer p;
|
||||
p.pack(Envelope{message_id, checksum, payload});
|
||||
return p.get_payload();
|
||||
inline size_t pack_envelope_into(span_writer &out, uint32_t message_id, const uint8_t *payload, size_t payload_len) {
|
||||
uint32_t checksum = halfsiphash::hash32(payload, payload_len, hash_key);
|
||||
uint8_t env_buf[512];
|
||||
span_writer env_body(env_buf, sizeof(env_buf));
|
||||
msgpack::packer env_p(env_body);
|
||||
env_p.pack_array(3);
|
||||
env_p.pack(message_id);
|
||||
env_p.pack(checksum);
|
||||
env_p.pack_bin(std::span<const uint8_t>{payload, payload_len});
|
||||
msgpack::packer outer(out);
|
||||
outer.pack_ext(Envelope::ext_id, env_body);
|
||||
return out.size();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline std::vector<uint8_t> encode_response(uint32_t message_id, const T &msg) {
|
||||
msgpack::packer inner;
|
||||
inline size_t encode_response_into(span_writer &out, uint32_t message_id, const T &msg) {
|
||||
uint8_t inner_buf[256];
|
||||
msgpack::packer inner(inner_buf, sizeof(inner_buf));
|
||||
inner.pack(msg);
|
||||
return pack_envelope(message_id, inner.get_payload());
|
||||
auto &pl = inner.get_payload();
|
||||
return pack_envelope_into(out, message_id, pl.data(), pl.size());
|
||||
}
|
||||
|
||||
inline msgpack::result<DecodedMessage> try_decode(const uint8_t *data, size_t len) {
|
||||
@@ -154,8 +164,6 @@ inline msgpack::result<T> decode_response(const uint8_t *data, size_t len) {
|
||||
return out;
|
||||
}
|
||||
|
||||
inline std::vector<uint8_t> encode_request(uint32_t message_id, const auto &msg) {
|
||||
msgpack::packer inner;
|
||||
inner.pack(msg);
|
||||
return pack_envelope(message_id, inner.get_payload());
|
||||
inline size_t encode_request_into(span_writer &out, uint32_t message_id, const auto &msg) {
|
||||
return encode_response_into(out, message_id, msg);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user