29 uint8_t* scratch_buf =
nullptr,
30 size_t scratch_size = 0)
34 msgpack::pack(
buffer, obj);
37 if (scratch_buf !=
nullptr &&
buffer.size() <= scratch_size) {
39 return { scratch_buf,
buffer.size() };
43 uint8_t* output =
static_cast<uint8_t*
>(aligned_alloc(64,
buffer.size()));
45 return { output,
buffer.size() };
54 const uint8_t* input_in,
57 size_t* output_len_out)
59 using FuncTraits =
decltype(get_func_traits<decltype(func)>());
61 typename FuncTraits::Args params;
64 msgpack::unpack(
reinterpret_cast<const char*
>(input_in), input_len_in).get().convert(params);
67 uint8_t* scratch_buf = *output_out;
68 size_t scratch_size = *output_len_out;
72 auto [output, output_len] =
msgpack_encode_buffer(FuncTraits::apply(func, params), scratch_buf, scratch_size);
78 *output_len_out = output_len;
86 auto cbind_obj = get_func_traits<decltype(func)>();
88 *output_out =
static_cast<uint8_t*
>(aligned_alloc(64, schema.size() + 1));
89 memcpy(*output_out, schema.c_str(), schema.size() + 1);
90 *output_len_out = schema.size();
97#define CBIND_NOSCHEMA(cname, func) \
98 WASM_EXPORT void cname(const uint8_t* input_in, size_t input_len_in, uint8_t** output_out, size_t* output_len_out) \
100 msgpack_cbind_impl(func, input_in, input_len_in, output_out, output_len_out); \
108#define CBIND(cname, func) \
109 CBIND_NOSCHEMA(cname, func) \
110 WASM_EXPORT void cname##__schema(uint8_t** output_out, size_t* output_len_out) \
112 msgpack_cbind_schema_impl(func, output_out, output_len_out); \
uint8_t buffer[RANDOM_BUFFER_SIZE]
void msgpack_cbind_impl(const auto &func, const uint8_t *input_in, size_t input_len_in, uint8_t **output_out, size_t *output_len_out)
void msgpack_cbind_schema_impl(auto func, uint8_t **output_out, size_t *output_len_out)
std::pair< uint8_t *, size_t > msgpack_encode_buffer(auto &&obj, uint8_t *scratch_buf=nullptr, size_t scratch_size=0)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::string msgpack_schema_to_string(const auto &obj)
Print's an object's derived msgpack schema as a string.