// // MessagePack for C++ deserializing routine // // Copyright (C) 2017 KONDO Takatoshi // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #ifndef MSGPACK_V2_X3_UNPACK_HPP #define MSGPACK_V2_X3_UNPACK_HPP #if defined(MSGPACK_USE_X3_PARSE) #include #if BOOST_VERSION >= 106100 #include "rpc/msgpack/versioning.hpp" #include "rpc/msgpack/v2/create_object_visitor.hpp" #include "rpc/msgpack/v2/x3_parse.hpp" namespace clmdep_msgpack { /// @cond MSGPACK_API_VERSION_NAMESPACE(v2) { /// @endcond namespace detail { template inline void unpack_imp(Iterator&& begin, Iterator&& end, clmdep_msgpack::zone& result_zone, clmdep_msgpack::object& result, bool& referenced, unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit()) { create_object_visitor v(f, user_data, limit); v.set_zone(result_zone); referenced = false; v.set_referenced(referenced); if (!parse(std::forward(begin), std::forward(end), v)) { throw clmdep_msgpack::parse_error("parse error"); } referenced = v.referenced(); result = v.data(); } } // namespace detail template inline clmdep_msgpack::object_handle unpack( Iterator&& begin, Iterator&& end, bool& referenced, unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit()) { clmdep_msgpack::object obj; clmdep_msgpack::unique_ptr z(new clmdep_msgpack::zone); referenced = false; detail::unpack_imp( std::forward(begin), std::forward(end), *z, obj, referenced, f, user_data, limit); return clmdep_msgpack::object_handle(obj, clmdep_msgpack::move(z)); } template inline clmdep_msgpack::object_handle unpack( Iterator&& begin, Iterator&& end, unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit()) { bool referenced; return unpack(std::forward(begin), std::forward(end), referenced, f, user_data, limit); } template inline clmdep_msgpack::object unpack( clmdep_msgpack::zone& z, Iterator&& begin, Iterator&& end, bool& referenced, unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit()) { clmdep_msgpack::object obj; referenced = false; detail::unpack_imp( std::forward(begin), std::forward(end), z, obj, referenced, f, user_data, limit); return obj; } template inline clmdep_msgpack::object unpack( clmdep_msgpack::zone& z, Iterator&& begin, Iterator&& end, unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit()) { bool referenced; return unpack( z, std::forward(begin), std::forward(end), referenced, f, user_data, limit); } /// @cond } // MSGPACK_API_VERSION_NAMESPACE(v2) /// @endcond } // namespace clmdep_msgpack #else // BOOST_VERSION >= 106100 #error Boost 1.61.0 or later is required to use x3 parse #endif // BOOST_VERSION >= 106100 #endif // defined(MSGPACK_USE_X3_PARSE) #endif // MSGPACK_V2_X3_UNPACK_HPP