10#ifndef MSGPACK_V3_PARSE_HPP
11#define MSGPACK_V3_PARSE_HPP
13#if MSGPACK_DEFAULT_API_VERSION >= 2
28template <
typename VisitorHolder>
41 holder().visitor().init();
48 static uint32_t next_cs(T p)
50 return static_cast<uint32_t
>(*p) & 0x1f;
53 VisitorHolder& holder() {
54 return static_cast<VisitorHolder&
>(*this);
57 template <
typename T,
typename StartVisitor,
typename EndVisitor>
59 StartVisitor
const& sv,
64 load<T>(size, load_pos);
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);
86 parse_return ret = m_stack.push(holder(), sv.type(),
static_cast<uint32_t
>(
size));
88 if (ret != PARSE_CONTINUE) {
89 off =
static_cast<std::size_t
>(m_current - m_start);
97 parse_return after_visit_proc(
bool visit_result, std::size_t& off) {
99 off =
static_cast<std::size_t
>(m_current - m_start);
102 parse_return ret = m_stack.consume(holder(), m_current);
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;
231 uint32_t m_num_elements;
232 unpack_stack m_stack;
235template <std::
size_t N>
236inline void check_ext_size(std::size_t ) {
240inline void check_ext_size<4>(std::size_t size) {
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);
258 bool fixed_trail_again =
false;
261 fixed_trail_again =
false;
262 int selector = *
reinterpret_cast<const unsigned char*
>(m_current);
263 if (0x00 <= selector && selector <= 0x7f) {
264 uint8_t tmp = *
reinterpret_cast<const uint8_t*
>(m_current);
265 bool visret = holder().visitor().visit_positive_integer(tmp);
267 if (upr != PARSE_CONTINUE)
return upr;
268 }
else if(0xe0 <= selector && selector <= 0xff) {
269 int8_t tmp = *
reinterpret_cast<const int8_t*
>(m_current);
270 bool visret = holder().visitor().visit_negative_integer(tmp);
272 if (upr != PARSE_CONTINUE)
return upr;
273 }
else if (0xc4 <= selector && selector <= 0xdf) {
274 const uint32_t trail[] = {
304 m_trail = trail[selector - 0xc4];
305 m_cs = next_cs(m_current);
306 fixed_trail_again =
true;
307 }
else if(0xa0 <= selector && selector <= 0xbf) {
308 m_trail =
static_cast<uint32_t
>(*m_current) & 0x1f;
310 bool visret = holder().visitor().visit_str(n,
static_cast<uint32_t
>(m_trail));
312 if (upr != PARSE_CONTINUE)
return upr;
316 fixed_trail_again =
true;
318 }
else if(0x90 <= selector && selector <= 0x9f) {
319 parse_return ret = start_aggregate<fix_tag>(array_sv(holder()), array_ev(holder()), m_current, off);
320 if (ret != PARSE_CONTINUE)
return ret;
321 }
else if(0x80 <= selector && selector <= 0x8f) {
322 parse_return ret = start_aggregate<fix_tag>(map_sv(holder()), map_ev(holder()), m_current, off);
323 if (ret != PARSE_CONTINUE)
return ret;
324 }
else if(selector == 0xc2) {
325 bool visret = holder().visitor().visit_boolean(
false);
327 if (upr != PARSE_CONTINUE)
return upr;
328 }
else if(selector == 0xc3) {
329 bool visret = holder().visitor().visit_boolean(
true);
331 if (upr != PARSE_CONTINUE)
return upr;
332 }
else if(selector == 0xc0) {
333 bool visret = holder().visitor().visit_nil();
335 if (upr != PARSE_CONTINUE)
return upr;
337 off =
static_cast<std::size_t
>(m_current - m_start);
338 holder().visitor().parse_error(off - 1, off);
344 if (fixed_trail_again) {
346 fixed_trail_again =
false;
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;
358 union { uint32_t i;
float f; } mem;
359 load<uint32_t>(mem.i, n);
360 bool visret = holder().visitor().visit_float32(mem.f);
362 if (upr != PARSE_CONTINUE)
return upr;
365 union { uint64_t i;
double f; } mem;
366 load<uint64_t>(mem.i, n);
367#if defined(TARGET_OS_IPHONE)
369#elif defined(__arm__) && !(__ARM_EABI__)
371 mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL);
373 bool visret = holder().visitor().visit_float64(mem.f);
375 if (upr != PARSE_CONTINUE)
return upr;
379 load<uint8_t>(tmp, n);
380 bool visret = holder().visitor().visit_positive_integer(tmp);
382 if (upr != PARSE_CONTINUE)
return upr;
386 load<uint16_t>(tmp, n);
387 bool visret = holder().visitor().visit_positive_integer(tmp);
389 if (upr != PARSE_CONTINUE)
return upr;
393 load<uint32_t>(tmp, n);
394 bool visret = holder().visitor().visit_positive_integer(tmp);
396 if (upr != PARSE_CONTINUE)
return upr;
400 load<uint64_t>(tmp, n);
401 bool visret = holder().visitor().visit_positive_integer(tmp);
403 if (upr != PARSE_CONTINUE)
return upr;
407 load<int8_t>(tmp, n);
408 bool visret = holder().visitor().visit_negative_integer(tmp);
410 if (upr != PARSE_CONTINUE)
return upr;
414 load<int16_t>(tmp, n);
415 bool visret = holder().visitor().visit_negative_integer(tmp);
417 if (upr != PARSE_CONTINUE)
return upr;
421 load<int32_t>(tmp, n);
422 bool visret = holder().visitor().visit_negative_integer(tmp);
424 if (upr != PARSE_CONTINUE)
return upr;
428 load<int64_t>(tmp, n);
429 bool visret = holder().visitor().visit_negative_integer(tmp);
431 if (upr != PARSE_CONTINUE)
return upr;
434 bool visret = holder().visitor().visit_ext(n, 1+1);
436 if (upr != PARSE_CONTINUE)
return upr;
439 bool visret = holder().visitor().visit_ext(n, 2+1);
441 if (upr != PARSE_CONTINUE)
return upr;
444 bool visret = holder().visitor().visit_ext(n, 4+1);
446 if (upr != PARSE_CONTINUE)
return upr;
449 bool visret = holder().visitor().visit_ext(n, 8+1);
451 if (upr != PARSE_CONTINUE)
return upr;
454 bool visret = holder().visitor().visit_ext(n, 16+1);
456 if (upr != PARSE_CONTINUE)
return upr;
460 load<uint8_t>(tmp, n);
463 bool visret = holder().visitor().visit_str(n,
static_cast<uint32_t
>(m_trail));
465 if (upr != PARSE_CONTINUE)
return upr;
469 fixed_trail_again =
true;
474 load<uint8_t>(tmp, n);
477 bool visret = holder().visitor().visit_bin(n,
static_cast<uint32_t
>(m_trail));
479 if (upr != PARSE_CONTINUE)
return upr;
483 fixed_trail_again =
true;
488 load<uint8_t>(tmp, n);
491 bool visret = holder().visitor().visit_ext(n,
static_cast<uint32_t
>(m_trail));
493 if (upr != PARSE_CONTINUE)
return upr;
497 fixed_trail_again =
true;
502 load<uint16_t>(tmp, n);
505 bool visret = holder().visitor().visit_str(n,
static_cast<uint32_t
>(m_trail));
507 if (upr != PARSE_CONTINUE)
return upr;
511 fixed_trail_again =
true;
516 load<uint16_t>(tmp, n);
519 bool visret = holder().visitor().visit_bin(n,
static_cast<uint32_t
>(m_trail));
521 if (upr != PARSE_CONTINUE)
return upr;
525 fixed_trail_again =
true;
530 load<uint16_t>(tmp, n);
533 bool visret = holder().visitor().visit_ext(n,
static_cast<uint32_t
>(m_trail));
535 if (upr != PARSE_CONTINUE)
return upr;
539 fixed_trail_again =
true;
544 load<uint32_t>(tmp, n);
547 bool visret = holder().visitor().visit_str(n,
static_cast<uint32_t
>(m_trail));
549 if (upr != PARSE_CONTINUE)
return upr;
553 fixed_trail_again =
true;
558 load<uint32_t>(tmp, n);
561 bool visret = holder().visitor().visit_bin(n,
static_cast<uint32_t
>(m_trail));
563 if (upr != PARSE_CONTINUE)
return upr;
567 fixed_trail_again =
true;
572 load<uint32_t>(tmp, n);
573 check_ext_size<sizeof(std::size_t)>(tmp);
577 bool visret = holder().visitor().visit_ext(n,
static_cast<uint32_t
>(m_trail));
579 if (upr != PARSE_CONTINUE)
return upr;
583 fixed_trail_again =
true;
587 bool visret = holder().visitor().visit_str(n,
static_cast<uint32_t
>(m_trail));
589 if (upr != PARSE_CONTINUE)
return upr;
592 bool visret = holder().visitor().visit_bin(n,
static_cast<uint32_t
>(m_trail));
594 if (upr != PARSE_CONTINUE)
return upr;
597 bool visret = holder().visitor().visit_ext(n,
static_cast<uint32_t
>(m_trail));
599 if (upr != PARSE_CONTINUE)
return upr;
602 parse_return ret = start_aggregate<uint16_t>(array_sv(holder()), array_ev(holder()), n, off);
603 if (ret != PARSE_CONTINUE)
return ret;
607 parse_return ret = start_aggregate<uint32_t>(array_sv(holder()), array_ev(holder()), n, off);
608 if (ret != PARSE_CONTINUE)
return ret;
611 parse_return ret = start_aggregate<uint16_t>(map_sv(holder()), map_ev(holder()), n, off);
612 if (ret != PARSE_CONTINUE)
return ret;
615 parse_return ret = start_aggregate<uint32_t>(map_sv(holder()), map_ev(holder()), n, off);
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> > {
632 parse_helper(Visitor& v):m_visitor(v) {}
633 parse_return execute(
const char* data, std::size_t len, std::size_t& off) {
634 return detail::context<parse_helper<Visitor> >::execute(data, len, off);
636 Visitor& visitor()
const {
return m_visitor; }
640template <
typename Visitor>
642parse_imp(
const char* data,
size_t len,
size_t& off, Visitor& v) {
643 std::size_t noff = off;
646 v.insufficient_bytes(noff, noff);
649 detail::parse_helper<Visitor> h(v);
654 v.insufficient_bytes(noff - 1, noff);
#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
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