diff options
Diffstat (limited to 'third_party/msgpack/include/msgpack/v2/x3_unpack.hpp')
-rw-r--r-- | third_party/msgpack/include/msgpack/v2/x3_unpack.hpp | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/third_party/msgpack/include/msgpack/v2/x3_unpack.hpp b/third_party/msgpack/include/msgpack/v2/x3_unpack.hpp new file mode 100644 index 0000000000..54ca98ea89 --- /dev/null +++ b/third_party/msgpack/include/msgpack/v2/x3_unpack.hpp @@ -0,0 +1,120 @@ +// +// 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 |