summaryrefslogtreecommitdiffstats
path: root/third_party/msgpack/include/msgpack/v2/x3_parse.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/msgpack/include/msgpack/v2/x3_parse.hpp')
-rw-r--r--third_party/msgpack/include/msgpack/v2/x3_parse.hpp873
1 files changed, 873 insertions, 0 deletions
diff --git a/third_party/msgpack/include/msgpack/v2/x3_parse.hpp b/third_party/msgpack/include/msgpack/v2/x3_parse.hpp
new file mode 100644
index 0000000000..50a0db44c0
--- /dev/null
+++ b/third_party/msgpack/include/msgpack/v2/x3_parse.hpp
@@ -0,0 +1,873 @@
+//
+// 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_PARSE_HPP
+#define MSGPACK_V2_X3_PARSE_HPP
+
+#if defined(MSGPACK_USE_X3_PARSE)
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 106100
+
+#include "msgpack/versioning.hpp"
+#include "msgpack/x3_parse_decl.hpp"
+
+#if __GNUC__ >= 4
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#endif // __GNUC__ >= 4
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/spirit/home/x3.hpp>
+#include <boost/spirit/home/x3/binary.hpp>
+
+namespace msgpack {
+
+/// @cond
+MSGPACK_API_VERSION_NAMESPACE(v2) {
+/// @endcond
+
+namespace detail {
+
+namespace x3 = boost::spirit::x3;
+
+using x3::byte_;
+
+// byte range utility
+const auto byte_range = [](const std::uint8_t from, const std::uint8_t to) {
+ const auto check = [from, to](auto& ctx)
+ {
+ const std::uint8_t value = x3::_attr(ctx);
+ x3::_val(ctx) = value;
+ x3::_pass(ctx) = from <= value && value <= to;
+ };
+ return x3::byte_ [check];
+};
+
+// MessagePack rule
+const auto mp_positive_fixint = byte_range(0x00, 0x7f);
+const auto mp_fixmap = byte_range(0x80, 0x8f);
+const auto mp_fixarray = byte_range(0x90, 0x9f);
+const auto mp_fixstr = byte_range(0xa0, 0xbf);
+const auto mp_nil = x3::byte_(0xc0);
+const auto mp_false = x3::byte_(0xc2);
+const auto mp_true = x3::byte_(0xc3);
+const auto mp_bin8 = x3::byte_(0xc4);
+const auto mp_bin16 = x3::byte_(0xc5);
+const auto mp_bin32 = x3::byte_(0xc6);
+const auto mp_ext8 = x3::byte_(0xc7);
+const auto mp_ext16 = x3::byte_(0xc8);
+const auto mp_ext32 = x3::byte_(0xc9);
+const auto mp_float32 = x3::byte_(0xca);
+const auto mp_float64 = x3::byte_(0xcb);
+const auto mp_uint8 = x3::byte_(0xcc);
+const auto mp_uint16 = x3::byte_(0xcd);
+const auto mp_uint32 = x3::byte_(0xce);
+const auto mp_uint64 = x3::byte_(0xcf);
+const auto mp_int8 = x3::byte_(0xd0);
+const auto mp_int16 = x3::byte_(0xd1);
+const auto mp_int32 = x3::byte_(0xd2);
+const auto mp_int64 = x3::byte_(0xd3);
+const auto mp_fixext1 = x3::byte_(0xd4);
+const auto mp_fixext2 = x3::byte_(0xd5);
+const auto mp_fixext4 = x3::byte_(0xd6);
+const auto mp_fixext8 = x3::byte_(0xd7);
+const auto mp_fixext16 = x3::byte_(0xd8);
+const auto mp_str8 = x3::byte_(0xd9);
+const auto mp_str16 = x3::byte_(0xda);
+const auto mp_str32 = x3::byte_(0xdb);
+const auto mp_array16 = x3::byte_(0xdc);
+const auto mp_array32 = x3::byte_(0xdd);
+const auto mp_map16 = x3::byte_(0xde);
+const auto mp_map32 = x3::byte_(0xdf);
+const auto mp_negative_fixint = byte_range(0xe0, 0xff);
+
+const auto mp_d_uint8 = x3::byte_;
+const auto mp_d_uint16 = x3::big_word;
+const auto mp_d_uint32 = x3::big_dword;
+const auto mp_d_uint64 = x3::big_qword;
+
+const auto mp_d_int8 = x3::byte_;
+const auto mp_d_int16 = x3::big_word;
+const auto mp_d_int32 = x3::big_dword;
+const auto mp_d_int64 = x3::big_qword;
+
+x3::rule<class mp_object> const mp_object("mp_object");
+x3::rule<class array_items> const array_item("array_item");
+x3::rule<class map_items> const map_item("map_item");
+x3::rule<class kv> const kv("kv");
+
+struct tag_app_specific {};
+struct index_size {
+ enum struct type_t {
+ array,
+ map,
+ other
+ };
+ index_size(std::size_t size, type_t type = type_t::other):size(size), type(type) {}
+ std::size_t index = 0;
+ std::size_t size;
+ type_t type;
+};
+
+template <typename Visitor>
+struct app_specific {
+ template <typename Vis>
+ app_specific(Vis&& vis):vis(vis) {}
+ std::vector<index_size> index_sizes;
+ Visitor vis;
+};
+
+template <typename Visitor>
+app_specific<Visitor> make_app_specific(Visitor&& vis) {
+ return app_specific<Visitor>(std::forward<Visitor>(vis));
+}
+
+const auto more = [](auto &ctx) {
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ _pass(ctx) = app_specific.index_sizes.back().index++ < app_specific.index_sizes.back().size;
+};
+
+const auto done = [](auto &ctx) {
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ if (app_specific.index_sizes.back().index == app_specific.index_sizes.back().size + 1) {
+ _pass(ctx) = true;
+ switch (app_specific.index_sizes.back().type) {
+ case index_size::type_t::array:
+ app_specific.vis.end_array();
+ break;
+ case index_size::type_t::map:
+ app_specific.vis.end_map();
+ break;
+ case index_size::type_t::other:
+ break;
+ }
+ app_specific.index_sizes.pop_back();
+ }
+ else {
+ _pass(ctx) = false;
+ }
+};
+
+const auto mp_object_def =
+ // -----------------------------------------------
+ mp_nil [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.vis.visit_nil();
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_true [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.vis.visit_boolean(true);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_false [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.vis.visit_boolean(false);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_positive_fixint [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.vis.visit_positive_integer(_attr(ctx));
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_negative_fixint [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ std::int8_t val = _attr(ctx);
+ app_specific.vis.visit_negative_integer(val);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_uint8 >> mp_d_uint8 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.vis.visit_negative_integer(_attr(ctx));
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_uint16 >> mp_d_uint16 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.vis.visit_positive_integer(_attr(ctx));
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_uint32 >> mp_d_uint32 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.vis.visit_positive_integer(_attr(ctx));
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_uint64 >> mp_d_uint64 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.vis.visit_positive_integer(_attr(ctx));
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_int8 >> mp_d_int8 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ std::int8_t val = _attr(ctx);
+ app_specific.vis.visit_negative_integer(val);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_int16 >> mp_d_int16 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ std::int16_t val = _attr(ctx);
+ app_specific.vis.visit_negative_integer(val);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_int32 >> mp_d_int32 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ std::int32_t val = _attr(ctx);
+ app_specific.vis.visit_negative_integer(val);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_int64 >> mp_d_int64 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ std::int64_t val = _attr(ctx);
+ app_specific.vis.visit_negative_integer(val);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_float32 >> mp_d_uint32 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ union { uint32_t i; float f; } mem = { _attr(ctx) };
+ app_specific.vis.visit_float32(mem.f);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_float64 >> mp_d_uint64 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ union { uint64_t i; double f; } mem = { _attr(ctx) };
+#if defined(TARGET_OS_IPHONE)
+ // ok
+#elif defined(__arm__) && !(__ARM_EABI__) // arm-oabi
+ // https://github.com/msgpack/msgpack-perl/pull/1
+ mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL);
+#endif
+ app_specific.vis.visit_float64(mem.f);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_fixstr [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ std::size_t size = _attr(ctx) & 0b00011111;
+ app_specific.index_sizes.emplace_back(size);
+ }
+ )
+ ]
+ >>
+ x3::raw [
+ *(x3::eps [more] >> x3::char_)
+ >> x3::eps [done]
+ ][
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ auto const& str = _attr(ctx);
+ std::size_t size = std::distance(str.begin(), str.end());
+ app_specific.vis.visit_str(size ? &str.front() : nullptr, size);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_str8 >> mp_d_uint8 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.index_sizes.emplace_back(_attr(ctx));
+ }
+ )
+ ]
+ >>
+ x3::raw [
+ *(x3::eps [more] >> x3::char_)
+ >> x3::eps [done]
+ ][
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ auto const& str = _attr(ctx);
+ std::size_t size = std::distance(str.begin(), str.end());
+ app_specific.vis.visit_str(size ? &str.front() : nullptr, size);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_str16 >> mp_d_uint16 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.index_sizes.emplace_back(_attr(ctx));
+ }
+ )
+ ]
+ >>
+ x3::raw [
+ *(x3::eps [more] >> x3::char_)
+ >> x3::eps [done]
+ ][
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ auto const& str = _attr(ctx);
+ std::size_t size = std::distance(str.begin(), str.end());
+ app_specific.vis.visit_str(size ? &str.front() : nullptr, size);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_str32 >> mp_d_uint32 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.index_sizes.emplace_back(_attr(ctx));
+ }
+ )
+ ]
+ >>
+ x3::raw [
+ *(x3::eps [more] >> x3::char_)
+ >> x3::eps [done]
+ ][
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ auto const& str = _attr(ctx);
+ std::size_t size = std::distance(str.begin(), str.end());
+ app_specific.vis.visit_str(size ? &str.front() : nullptr, size);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_bin8 >> mp_d_uint8 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.index_sizes.emplace_back(_attr(ctx));
+ }
+ )
+ ]
+ >>
+ x3::raw [
+ *(x3::eps [more] >> x3::char_)
+ >> x3::eps [done]
+ ][
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ auto const& bin = _attr(ctx);
+ std::size_t size = std::distance(bin.begin(), bin.end());
+ app_specific.vis.visit_bin(size ? &bin.front() : nullptr, size);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_bin16 >> mp_d_uint16 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.index_sizes.emplace_back(_attr(ctx));
+ }
+ )
+ ]
+ >>
+ x3::raw [
+ *(x3::eps [more] >> x3::char_)
+ >> x3::eps [done]
+ ][
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ auto const& bin = _attr(ctx);
+ std::size_t size = std::distance(bin.begin(), bin.end());
+ app_specific.vis.visit_bin(size ? &bin.front() : nullptr, size);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_bin32 >> mp_d_uint32 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.index_sizes.emplace_back(_attr(ctx));
+ }
+ )
+ ]
+ >>
+ x3::raw [
+ *(x3::eps [more] >> x3::char_)
+ >> x3::eps [done]
+ ][
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ auto const& bin = _attr(ctx);
+ std::size_t size = std::distance(bin.begin(), bin.end());
+ app_specific.vis.visit_bin(size ? &bin.front() : nullptr, size);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_fixarray [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ std::size_t size = _attr(ctx) & 0b00001111;
+ app_specific.index_sizes.emplace_back(size, index_size::type_t::array);
+ app_specific.vis.start_array(size);
+ }
+ )
+ ]
+ >> *(x3::eps [more] >> array_item)
+ >> x3::eps [done]
+ |
+ // -----------------------------------------------
+ mp_array16 >> mp_d_uint16 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ std::size_t size = _attr(ctx);
+ app_specific.index_sizes.emplace_back(size, index_size::type_t::array);
+ app_specific.vis.start_array(size);
+ }
+ )
+ ]
+ >> *(x3::eps [more] >> array_item)
+ >> x3::eps [done]
+ |
+ // -----------------------------------------------
+ mp_array32 >> mp_d_uint32 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ std::size_t size = _attr(ctx);
+ app_specific.index_sizes.emplace_back(size, index_size::type_t::array);
+ app_specific.vis.start_array(size);
+ }
+ )
+ ]
+ >> *(x3::eps [more] >> array_item)
+ >> x3::eps [done]
+ |
+ // -----------------------------------------------
+ mp_fixmap [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ std::size_t size = _attr(ctx) & 0b00001111;
+ app_specific.index_sizes.emplace_back(size, index_size::type_t::map);
+ app_specific.vis.start_map(size);
+ }
+ )
+ ]
+ >> *(x3::eps [more] >> map_item)
+ >> x3::eps [done]
+ |
+ // -----------------------------------------------
+ mp_map16 >> mp_d_uint16 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ std::size_t size = _attr(ctx);
+ app_specific.index_sizes.emplace_back(size, index_size::type_t::map);
+ app_specific.vis.start_map(size);
+ }
+ )
+ ]
+ >> *(x3::eps [more] >> map_item)
+ >> x3::eps [done]
+ |
+ // -----------------------------------------------
+ mp_map32 >> mp_d_uint32 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ std::size_t size = _attr(ctx);
+ app_specific.index_sizes.emplace_back(size, index_size::type_t::map);
+ app_specific.vis.start_map(size);
+ }
+ )
+ ]
+ >> *(x3::eps [more] >> map_item)
+ >> x3::eps [done]
+ |
+ // -----------------------------------------------
+ mp_fixext1 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.index_sizes.emplace_back(1+1);
+ }
+ )
+ ]
+ >>
+ x3::raw [
+ *(x3::eps [more] >> x3::char_)
+ >> x3::eps [done]
+ ][
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ auto const& ext = _attr(ctx);
+ std::size_t size = std::distance(ext.begin(), ext.end());
+ app_specific.vis.visit_ext(size ? &ext.front() : nullptr, size);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_fixext2 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.index_sizes.emplace_back(2+1);
+ }
+ )
+ ]
+ >>
+ x3::raw [
+ *(x3::eps [more] >> x3::char_)
+ >> x3::eps [done]
+ ][
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ auto const& ext = _attr(ctx);
+ std::size_t size = std::distance(ext.begin(), ext.end());
+ app_specific.vis.visit_ext(size ? &ext.front() : nullptr, size);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_fixext4 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.index_sizes.emplace_back(4+1);
+ }
+ )
+ ]
+ >>
+ x3::raw [
+ *(x3::eps [more] >> x3::char_)
+ >> x3::eps [done]
+ ][
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ auto const& ext = _attr(ctx);
+ std::size_t size = std::distance(ext.begin(), ext.end());
+ app_specific.vis.visit_ext(size ? &ext.front() : nullptr, size);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_fixext8 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.index_sizes.emplace_back(8+1);
+ }
+ )
+ ]
+ >>
+ x3::raw [
+ *(x3::eps [more] >> x3::char_)
+ >> x3::eps [done]
+ ][
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ auto const& ext = _attr(ctx);
+ std::size_t size = std::distance(ext.begin(), ext.end());
+ app_specific.vis.visit_ext(size ? &ext.front() : nullptr, size);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_fixext16 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.index_sizes.emplace_back(16+1);
+ }
+ )
+ ]
+ >>
+ x3::raw [
+ *(x3::eps [more] >> x3::char_)
+ >> x3::eps [done]
+ ][
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ auto const& ext = _attr(ctx);
+ std::size_t size = std::distance(ext.begin(), ext.end());
+ app_specific.vis.visit_ext(size ? &ext.front() : nullptr, size);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_ext8 >> mp_d_uint8 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.index_sizes.emplace_back(_attr(ctx)+1);
+ }
+ )
+ ]
+ >>
+ x3::raw [
+ *(x3::eps [more] >> x3::char_)
+ >> x3::eps [done]
+ ][
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ auto const& ext = _attr(ctx);
+ std::size_t size = std::distance(ext.begin(), ext.end());
+ app_specific.vis.visit_ext(size ? &ext.front() : nullptr, size);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_ext16 >> mp_d_uint16 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.index_sizes.emplace_back(_attr(ctx)+1);
+ }
+ )
+ ]
+ >>
+ x3::raw [
+ *(x3::eps [more] >> x3::char_)
+ >> x3::eps [done]
+ ][
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ auto const& ext = _attr(ctx);
+ std::size_t size = std::distance(ext.begin(), ext.end());
+ app_specific.vis.visit_ext(size ? &ext.front() : nullptr, size);
+ }
+ )
+ ]
+ |
+ // -----------------------------------------------
+ mp_ext32 >> mp_d_uint32 [
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.index_sizes.emplace_back(_attr(ctx)+1);
+ }
+ )
+ ]
+ >>
+ x3::raw [
+ *(x3::eps [more] >> x3::char_)
+ >> x3::eps [done]
+ ][
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ auto const& ext = _attr(ctx);
+ std::size_t size = std::distance(ext.begin(), ext.end());
+ app_specific.vis.visit_ext(size ? &ext.front() : nullptr, size);
+ }
+ )
+ ];
+
+const auto array_item_def =
+ x3::eps[
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.vis.start_array_item();
+ _pass(ctx) = true;
+ }
+ )
+ ]
+ >>
+ mp_object
+ >>
+ x3::eps[
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.vis.end_array_item();
+ _pass(ctx) = true;
+ }
+ )
+ ];
+
+const auto map_item_def = kv;
+const auto kv_def =
+ x3::eps[
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.vis.start_map_key();
+ _pass(ctx) = true;
+ }
+ )
+ ]
+ >>
+ mp_object
+ >>
+ x3::eps[
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.vis.end_map_key();
+ _pass(ctx) = true;
+ }
+ )
+ ]
+ >>
+ x3::eps[
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.vis.start_map_value();
+ _pass(ctx) = true;
+ }
+ )
+ ]
+ >>
+ mp_object
+ >>
+ x3::eps[
+ (
+ [](auto& ctx){
+ auto& app_specific = x3::get<tag_app_specific>(ctx).get();
+ app_specific.vis.end_map_value();
+ _pass(ctx) = true;
+ }
+ )
+ ];
+
+BOOST_SPIRIT_DEFINE(
+ mp_object, array_item, map_item, kv
+);
+
+const auto rule = mp_object;
+
+} // namespace detail
+
+template <typename Iterator, typename Visitor>
+inline bool parse(Iterator&& begin, Iterator&& end, Visitor&& vis) {
+ auto data = detail::make_app_specific(std::forward<Visitor>(vis));
+ return detail::x3::parse(
+ std::forward<Iterator>(begin),
+ std::forward<Iterator>(end),
+ detail::x3::with<detail::tag_app_specific>(std::ref(data))[detail::rule]
+ );
+}
+
+/// @cond
+} // MSGPACK_API_VERSION_NAMESPACE(v2)
+/// @endcond
+
+} // namespace msgpack
+
+#if __GNUC__ >= 4
+#pragma GCC diagnostic pop
+#endif // __GNUC__ >= 4
+
+#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_PARSE_HPP