31 uint8_t* scratch_buf =
nullptr,
32 size_t scratch_size = 0)
36 msgpack::pack(
buffer, obj);
39 if (scratch_buf !=
nullptr &&
buffer.size() <= scratch_size) {
41 return { scratch_buf,
buffer.size() };
45 uint8_t* output =
static_cast<uint8_t*
>(aligned_alloc(64,
buffer.size()));
47 return { output,
buffer.size() };
56 const uint8_t* input_in,
59 size_t* output_len_out)
61 using FuncTraits =
decltype(get_func_traits<decltype(func)>());
63 typename FuncTraits::Args params;
66 msgpack::unpack(
reinterpret_cast<const char*
>(input_in), input_len_in).get().convert(params);
69 uint8_t* scratch_buf = *output_out;
70 size_t scratch_size = *output_len_out;
74 auto [output, output_len] =
msgpack_encode_buffer(FuncTraits::apply(func, params), scratch_buf, scratch_size);
80 *output_len_out = output_len;
88 auto cbind_obj = get_func_traits<decltype(func)>();
90 *output_out =
static_cast<uint8_t*
>(aligned_alloc(64, schema.size() + 1));
91 memcpy(*output_out, schema.c_str(), schema.size() + 1);
92 *output_len_out = schema.size();
99#define CBIND_NOSCHEMA(cname, func) \
100 WASM_EXPORT void cname(const uint8_t* input_in, size_t input_len_in, uint8_t** output_out, size_t* output_len_out) \
102 msgpack_cbind_impl(func, input_in, input_len_in, output_out, output_len_out); \
110#define CBIND(cname, func) \
111 CBIND_NOSCHEMA(cname, func) \
112 WASM_EXPORT void cname##__schema(uint8_t** output_out, size_t* output_len_out) \
114 msgpack_cbind_schema_impl(func, output_out, output_len_out); \
std::unique_ptr< uint8_t[]> buffer
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.