10#ifndef MSGPACK_V3_PARSE_HPP
11#define MSGPACK_V3_PARSE_HPP
13#if MSGPACK_DEFAULT_API_VERSION >= 2
28template <
typename VisitorHolder>
50 return static_cast<uint32_t>(*p) & 0x1f;
57 template <
typename T,
typename StartVisitor,
typename EndVisitor>
67 off =
static_cast<std::size_t
>(m_current - m_start);
71 off =
static_cast<std::size_t
>(m_current - m_start);
76 if (
ret != PARSE_CONTINUE) {
77 off =
static_cast<std::size_t
>(m_current - m_start);
83 off =
static_cast<std::size_t
>(m_current - m_start);
88 if (
ret != PARSE_CONTINUE) {
89 off =
static_cast<std::size_t
>(m_current - m_start);
99 off =
static_cast<std::size_t
>(m_current - m_start);
104 if (
ret != PARSE_CONTINUE) {
105 off =
static_cast<std::size_t
>(m_current - m_start);
112 array_sv(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
113 bool operator()(uint32_t size)
const {
114 return m_visitor_holder.visitor().start_array(size);
118 VisitorHolder& m_visitor_holder;
121 array_ev(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
122 bool operator()()
const {
123 return m_visitor_holder.visitor().end_array();
126 VisitorHolder& m_visitor_holder;
129 map_sv(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
130 bool operator()(uint32_t size)
const {
131 return m_visitor_holder.visitor().start_map(size);
135 VisitorHolder& m_visitor_holder;
138 map_ev(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
139 bool operator()()
const {
140 return m_visitor_holder.visitor().end_map();
143 VisitorHolder& m_visitor_holder;
146 struct unpack_stack {
156 m_stack.push_back(stack_elem(type, rest));
169 parse_return consume(VisitorHolder& visitor_holder,
char const*& current) {
170 while (!m_stack.empty()) {
171 stack_elem& e = m_stack.back();
174 if (!visitor_holder.visitor().end_array_item()) {
178 if (--e.m_rest == 0) {
180 if (!visitor_holder.visitor().end_array()) {
191 if (!visitor_holder.visitor().end_map_key()) {
199 if (!visitor_holder.visitor().end_map_value()) {
203 if (--e.m_rest == 0) {
205 if (!visitor_holder.visitor().end_map()) {
220 bool empty()
const {
return m_stack.empty(); }
221 void clear() { m_stack.clear(); }
223 std::vector<stack_elem> m_stack;
227 char const* m_current;
232 unpack_stack m_stack;
235template <std::
size_t N>
236inline void check_ext_size(std::size_t ) {
244template <
typename VisitorHolder>
250 m_current = data +
off;
251 const char*
const pe = data +
len;
254 if(m_current ==
pe) {
255 off =
static_cast<std::size_t
>(m_current - m_start);
262 int selector = *
reinterpret_cast<const unsigned char*
>(m_current);
267 if (
upr != PARSE_CONTINUE)
return upr;
272 if (
upr != PARSE_CONTINUE)
return upr;
305 m_cs = next_cs(m_current);
308 m_trail =
static_cast<uint32_t>(*m_current) & 0x1f;
312 if (
upr != PARSE_CONTINUE)
return upr;
320 if (
ret != PARSE_CONTINUE)
return ret;
323 if (
ret != PARSE_CONTINUE)
return ret;
327 if (
upr != PARSE_CONTINUE)
return upr;
331 if (
upr != PARSE_CONTINUE)
return upr;
335 if (
upr != PARSE_CONTINUE)
return upr;
337 off =
static_cast<std::size_t
>(m_current - m_start);
348 if(
static_cast<std::size_t
>(
pe - m_current) < m_trail) {
349 off =
static_cast<std::size_t
>(m_current - m_start);
353 m_current += m_trail - 1;
362 if (
upr != PARSE_CONTINUE)
return upr;
367#if defined(TARGET_OS_IPHONE)
369#elif defined(__arm__) && !(__ARM_EABI__)
371 mem.i = (
mem.i & 0xFFFFFFFFUL) << 32UL | (
mem.i >> 32UL);
375 if (
upr != PARSE_CONTINUE)
return upr;
382 if (
upr != PARSE_CONTINUE)
return upr;
389 if (
upr != PARSE_CONTINUE)
return upr;
396 if (
upr != PARSE_CONTINUE)
return upr;
403 if (
upr != PARSE_CONTINUE)
return upr;
410 if (
upr != PARSE_CONTINUE)
return upr;
417 if (
upr != PARSE_CONTINUE)
return upr;
424 if (
upr != PARSE_CONTINUE)
return upr;
431 if (
upr != PARSE_CONTINUE)
return upr;
436 if (
upr != PARSE_CONTINUE)
return upr;
441 if (
upr != PARSE_CONTINUE)
return upr;
446 if (
upr != PARSE_CONTINUE)
return upr;
451 if (
upr != PARSE_CONTINUE)
return upr;
456 if (
upr != PARSE_CONTINUE)
return upr;
465 if (
upr != PARSE_CONTINUE)
return upr;
479 if (
upr != PARSE_CONTINUE)
return upr;
493 if (
upr != PARSE_CONTINUE)
return upr;
507 if (
upr != PARSE_CONTINUE)
return upr;
521 if (
upr != PARSE_CONTINUE)
return upr;
535 if (
upr != PARSE_CONTINUE)
return upr;
549 if (
upr != PARSE_CONTINUE)
return upr;
563 if (
upr != PARSE_CONTINUE)
return upr;
579 if (
upr != PARSE_CONTINUE)
return upr;
589 if (
upr != PARSE_CONTINUE)
return upr;
594 if (
upr != PARSE_CONTINUE)
return upr;
599 if (
upr != PARSE_CONTINUE)
return upr;
603 if (
ret != PARSE_CONTINUE)
return ret;
608 if (
ret != PARSE_CONTINUE)
return ret;
612 if (
ret != PARSE_CONTINUE)
return ret;
616 if (
ret != PARSE_CONTINUE)
return ret;
619 off =
static_cast<std::size_t
>(m_current - m_start);
620 holder().visitor().parse_error(
static_cast<std::size_t
>(
n - m_start - 1),
static_cast<std::size_t
>(
n - m_start));
624 }
while(m_current !=
pe);
626 off =
static_cast<std::size_t
>(m_current - m_start);
630template <
typename Visitor>
631struct parse_helper : detail::context<parse_helper<Visitor> > {
634 return detail::context<parse_helper<Visitor> >::execute(data,
len,
off);
640template <
typename Visitor>
649 detail::parse_helper<Visitor>
h(
v);
#define MSGPACK_ASSERT
Definition assert.hpp:22
int execute(const char *data, std::size_t len, std::size_t &off)
Definition unpack.hpp:466
msgpack::object const & data() const
Definition unpack.hpp:334
context(unpack_reference_func f, void *user_data, unpack_limit const &limit)
Definition unpack.hpp:319
void init()
Definition unpack.hpp:326
parse_return parse_imp(const char *data, size_t len, size_t &off, Visitor &v)
std::size_t size(T const &t)
Definition size_equal_only.hpp:24
Definition adaptor_base.hpp:15
parse_return
Definition parse_return.hpp:23
@ PARSE_CONTINUE
Definition parse_return.hpp:26
@ PARSE_EXTRA_BYTES
Definition parse_return.hpp:25
@ PARSE_STOP_VISITOR
Definition parse_return.hpp:28
@ PARSE_SUCCESS
Definition parse_return.hpp:24
@ PARSE_PARSE_ERROR
Definition parse_return.hpp:27
void convert(T &v, msgpack::object const &o)
Definition object.hpp:1178
T type
Definition unpack.hpp:285
Definition unpack_exception.hpp:97
msgpack_container_type
Definition unpack_define.hpp:68
@ MSGPACK_CT_ARRAY_ITEM
Definition unpack_define.hpp:69
@ MSGPACK_CT_MAP_VALUE
Definition unpack_define.hpp:71
@ MSGPACK_CT_MAP_KEY
Definition unpack_define.hpp:70
#define MSGPACK_EMBED_STACK_SIZE
Definition unpack_define.hpp:16
@ MSGPACK_CS_EXT_32
Definition unpack_define.hpp:33
@ MSGPACK_CS_EXT_16
Definition unpack_define.hpp:32
@ MSGPACK_CS_STR_8
Definition unpack_define.hpp:52
@ MSGPACK_CS_STR_32
Definition unpack_define.hpp:54
@ MSGPACK_CS_DOUBLE
Definition unpack_define.hpp:36
@ MSGPACK_CS_FIXEXT_4
Definition unpack_define.hpp:48
@ MSGPACK_CS_UINT_32
Definition unpack_define.hpp:39
@ MSGPACK_CS_MAP_16
Definition unpack_define.hpp:57
@ MSGPACK_CS_BIN_32
Definition unpack_define.hpp:29
@ MSGPACK_CS_BIN_16
Definition unpack_define.hpp:28
@ MSGPACK_CS_UINT_64
Definition unpack_define.hpp:40
@ MSGPACK_CS_FLOAT
Definition unpack_define.hpp:35
@ MSGPACK_CS_ARRAY_32
Definition unpack_define.hpp:56
@ MSGPACK_CS_FIXEXT_1
Definition unpack_define.hpp:46
@ MSGPACK_CS_INT_8
Definition unpack_define.hpp:41
@ MSGPACK_CS_INT_32
Definition unpack_define.hpp:43
@ MSGPACK_ACS_BIN_VALUE
Definition unpack_define.hpp:63
@ MSGPACK_CS_ARRAY_16
Definition unpack_define.hpp:55
@ MSGPACK_CS_FIXEXT_16
Definition unpack_define.hpp:50
@ MSGPACK_CS_STR_16
Definition unpack_define.hpp:53
@ MSGPACK_ACS_STR_VALUE
Definition unpack_define.hpp:62
@ MSGPACK_CS_BIN_8
Definition unpack_define.hpp:27
@ MSGPACK_CS_INT_64
Definition unpack_define.hpp:44
@ MSGPACK_CS_FIXEXT_2
Definition unpack_define.hpp:47
@ MSGPACK_CS_HEADER
Definition unpack_define.hpp:21
@ MSGPACK_CS_FIXEXT_8
Definition unpack_define.hpp:49
@ MSGPACK_CS_MAP_32
Definition unpack_define.hpp:58
@ MSGPACK_ACS_EXT_VALUE
Definition unpack_define.hpp:64
@ MSGPACK_CS_EXT_8
Definition unpack_define.hpp:31
@ MSGPACK_CS_INT_16
Definition unpack_define.hpp:42
@ MSGPACK_CS_UINT_16
Definition unpack_define.hpp:38
@ MSGPACK_CS_UINT_8
Definition unpack_define.hpp:37
#define MSGPACK_NULLPTR
Definition cpp_config_decl.hpp:85
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition versioning.hpp:66