123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- //
- // 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 <boost/version.hpp>
- #if BOOST_VERSION >= 106100
- #include "msgpack/versioning.hpp"
- #include "msgpack/create_object_visitor.hpp"
- #include "msgpack/x3_unpack_decl.hpp"
- #include "msgpack/x3_parse.hpp"
- namespace msgpack {
- /// @cond
- MSGPACK_API_VERSION_NAMESPACE(v2) {
- /// @endcond
- namespace detail {
- template <typename Iterator>
- inline void
- unpack_imp(Iterator&& begin, Iterator&& end,
- msgpack::zone& result_zone, msgpack::object& result, bool& referenced,
- unpack_reference_func f, void* user_data,
- unpack_limit const& limit)
- {
- create_object_visitor v(f, user_data, limit);
- v.set_zone(result_zone);
- referenced = false;
- v.set_referenced(referenced);
- if (!parse(std::forward<Iterator>(begin), std::forward<Iterator>(end), v)) {
- throw msgpack::parse_error("parse error");
- }
- referenced = v.referenced();
- result = v.data();
- }
- } // namespace detail
- template <typename Iterator>
- inline msgpack::object_handle unpack(
- Iterator&& begin, Iterator&& end,
- bool& referenced,
- unpack_reference_func f, void* user_data,
- unpack_limit const& limit)
- {
- msgpack::object obj;
- msgpack::unique_ptr<msgpack::zone> z(new msgpack::zone);
- referenced = false;
- detail::unpack_imp(
- std::forward<Iterator>(begin), std::forward<Iterator>(end), *z, obj, referenced, f, user_data, limit);
- return msgpack::object_handle(obj, msgpack::move(z));
- }
- template <typename Iterator>
- inline msgpack::object_handle unpack(
- Iterator&& begin, Iterator&& end,
- unpack_reference_func f, void* user_data,
- unpack_limit const& limit)
- {
- bool referenced;
- return unpack(std::forward<Iterator>(begin), std::forward<Iterator>(end), referenced, f, user_data, limit);
- }
- template <typename Iterator>
- inline msgpack::object unpack(
- msgpack::zone& z,
- Iterator&& begin, Iterator&& end,
- bool& referenced,
- unpack_reference_func f, void* user_data,
- unpack_limit const& limit)
- {
- msgpack::object obj;
- referenced = false;
- detail::unpack_imp(
- std::forward<Iterator>(begin), std::forward<Iterator>(end), z, obj, referenced, f, user_data, limit);
- return obj;
- }
- template <typename Iterator>
- inline msgpack::object unpack(
- msgpack::zone& z,
- Iterator&& begin, Iterator&& end,
- unpack_reference_func f, void* user_data,
- unpack_limit const& limit)
- {
- bool referenced;
- return unpack(
- z, std::forward<Iterator>(begin), std::forward<Iterator>(end), referenced, f, user_data, limit);
- }
- /// @cond
- } // MSGPACK_API_VERSION_NAMESPACE(v2)
- /// @endcond
- } // namespace 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
|