8#include "msgpack_impl/check_memory_span.hpp"
9#include "msgpack_impl/concepts.hpp"
10#include "msgpack_impl/func_traits.hpp"
11#include "msgpack_impl/msgpack_impl.hpp"
12#include "msgpack_impl/name_value_pair_macro.hpp"
13#include "msgpack_impl/schema_impl.hpp"
14#include "msgpack_impl/schema_name.hpp"
15#include "msgpack_impl/struct_map_impl.hpp"
25inline std::pair<uint8_t*, size_t> msgpack_encode_buffer(
auto&& obj)
28 msgpack::sbuffer buffer;
29 msgpack::pack(buffer, obj);
31 uint8_t* output = (uint8_t*)aligned_alloc(64, buffer.size());
32 memcpy(output, buffer.data(), buffer.size());
34 return { output, buffer.size() };
39template <
typename T>
constexpr auto param_tuple()
44 return typename decltype(get_func_traits<T>())::Args{};
49inline void msgpack_cbind_impl(
auto func,
50 const uint8_t* input_in,
53 size_t* output_len_out)
56 auto params = param_tuple<decltype(func)>();
62 msgpack::unpack((
const char*)input_in, input_len_in).get().convert(params);
68 auto [output, output_len] = msgpack_encode_buffer(std::apply(func, params));
72 *output_len_out = output_len;
76inline void msgpack_cbind_schema_impl(
auto func, uint8_t** output_out,
size_t* output_len_out)
80 auto cbind_obj = get_func_traits<decltype(func)>();
81 std::string schema = msgpack_schema_to_string(cbind_obj);
82 *output_out = (uint8_t*)aligned_alloc(64, schema.size() + 1);
83 memcpy(*output_out, schema.c_str(), schema.size() + 1);
84 *output_len_out = schema.size();
91#define CBIND_NOSCHEMA(cname, func) \
92 WASM_EXPORT void cname(const uint8_t* input_in, size_t input_len_in, uint8_t** output_out, size_t* output_len_out) \
94 msgpack_cbind_impl(func, input_in, input_len_in, output_out, output_len_out); \
102#define CBIND(cname, func) \
103 CBIND_NOSCHEMA(cname, func) \
104 WASM_EXPORT void cname##__schema(uint8_t** output_out, size_t* output_len_out) \
106 msgpack_cbind_schema_impl(func, output_out, output_len_out); \