#ifndef REST_RPC_CODEC_H_ #define REST_RPC_CODEC_H_ #include namespace rest_rpc { namespace rpc_service { using buffer_type = msgpack::sbuffer; struct msgpack_codec { const static size_t init_size = 2 * 1024; template static buffer_type pack_args(Args&&... args) { buffer_type buffer(init_size); msgpack::pack(buffer, std::forward_as_tuple(std::forward(args)...)); return buffer; } template::value>::type> static std::string pack_args_str(Arg arg, Args&&... args) { buffer_type buffer(init_size); msgpack::pack(buffer, std::forward_as_tuple((int)arg, std::forward(args)...)); return std::string(buffer.data(), buffer.size()); } template buffer_type pack(T&& t) const { buffer_type buffer; msgpack::pack(buffer, std::forward(t)); return buffer; } template T unpack(char const* data, size_t length) { try { msgpack::unpack(&msg_, data, length); return msg_.get().as(); } catch (...) { throw std::invalid_argument("unpack failed: Args not match!"); } } private: msgpack::unpacked msg_; }; } // namespace rpc_service } // namespace rest_rpc #endif // REST_RPC_CODEC_H_