#ifndef RFL_MSGPACK_READ_HPP_ #define RFL_MSGPACK_READ_HPP_ #include #include #include #include "../Processors.hpp" #include "../internal/wrap_in_rfl_array_t.hpp" #include "Parser.hpp" #include "Reader.hpp" namespace rfl { namespace msgpack { using InputObjectType = typename Reader::InputObjectType; using InputVarType = typename Reader::InputVarType; /// Parses an object from a MSGPACK var. template auto read(const InputVarType& _obj) { const auto r = Reader(); return Parser>::read(r, _obj); } /// Parses an object from MSGPACK using reflection. template Result> read(const char* _bytes, const size_t _size) { msgpack_zone mempool; msgpack_zone_init(&mempool, 2048); msgpack_object deserialized; msgpack_unpack(_bytes, _size, NULL, &mempool, &deserialized); auto r = read(deserialized); msgpack_zone_destroy(&mempool); return r; } /// Parses an object from MSGPACK using reflection. template auto read(const std::vector& _bytes) { return read(_bytes.data(), _bytes.size()); } /// Parses an object from a stream. template auto read(std::istream& _stream) { std::istreambuf_iterator begin(_stream), end; auto bytes = std::vector(begin, end); return read(bytes.data(), bytes.size()); } } // namespace msgpack } // namespace rfl #endif