summaryrefslogtreecommitdiffstats
path: root/third_party/msgpack/include/msgpack/v2/x3_unpack.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/msgpack/include/msgpack/v2/x3_unpack.hpp')
-rw-r--r--third_party/msgpack/include/msgpack/v2/x3_unpack.hpp120
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