10 #ifndef MSGPACK_V3_PARSE_HPP
11 #define MSGPACK_V3_PARSE_HPP
13 #if MSGPACK_DEFAULT_API_VERSION >= 2
27 template <
typename VisitorHolder>
31 :m_trail(0), m_cs(MSGPACK_CS_HEADER)
37 m_cs = MSGPACK_CS_HEADER;
40 holder().visitor().init();
47 static uint32_t next_cs(T p)
49 return static_cast<uint32_t
>(*p) & 0x1f;
52 VisitorHolder& holder() {
53 return static_cast<VisitorHolder&
>(*this);
56 template <
typename T,
typename StartVisitor,
typename EndVisitor>
58 StartVisitor
const& sv,
63 load<T>(
size, load_pos);
66 off =
static_cast<std::size_t
>(m_current - m_start);
70 off =
static_cast<std::size_t
>(m_current - m_start);
76 off =
static_cast<std::size_t
>(m_current - m_start);
82 off =
static_cast<std::size_t
>(m_current - m_start);
85 parse_return ret = m_stack.push(holder(), sv.type(),
static_cast<uint32_t
>(
size));
88 off =
static_cast<std::size_t
>(m_current - m_start);
92 m_cs = MSGPACK_CS_HEADER;
96 parse_return after_visit_proc(
bool visit_result, std::size_t& off) {
98 off =
static_cast<std::size_t
>(m_current - m_start);
101 parse_return ret = m_stack.consume(holder(), m_current);
104 off =
static_cast<std::size_t
>(m_current - m_start);
106 m_cs = MSGPACK_CS_HEADER;
111 array_sv(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
112 bool operator()(uint32_t
size)
const {
113 return m_visitor_holder.visitor().start_array(
size);
115 msgpack_container_type type()
const {
return MSGPACK_CT_ARRAY_ITEM; }
117 VisitorHolder& m_visitor_holder;
120 array_ev(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
121 bool operator()()
const {
122 return m_visitor_holder.visitor().end_array();
125 VisitorHolder& m_visitor_holder;
128 map_sv(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
129 bool operator()(uint32_t
size)
const {
130 return m_visitor_holder.visitor().start_map(
size);
132 msgpack_container_type type()
const {
return MSGPACK_CT_MAP_KEY; }
134 VisitorHolder& m_visitor_holder;
137 map_ev(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
138 bool operator()()
const {
139 return m_visitor_holder.visitor().end_map();
142 VisitorHolder& m_visitor_holder;
145 struct unpack_stack {
147 stack_elem(msgpack_container_type type, uint32_t rest):m_type(type), m_rest(rest) {}
148 msgpack_container_type m_type;
152 m_stack.reserve(MSGPACK_EMBED_STACK_SIZE);
154 parse_return push(VisitorHolder& visitor_holder, msgpack_container_type type, uint32_t rest) {
155 m_stack.push_back(stack_elem(type, rest));
157 case MSGPACK_CT_ARRAY_ITEM:
159 case MSGPACK_CT_MAP_KEY:
161 case MSGPACK_CT_MAP_VALUE:
168 parse_return consume(VisitorHolder& visitor_holder,
char const*& current) {
169 while (!m_stack.empty()) {
170 stack_elem& e = m_stack.back();
172 case MSGPACK_CT_ARRAY_ITEM:
173 if (!visitor_holder.visitor().end_array_item()) {
177 if (--e.m_rest == 0) {
179 if (!visitor_holder.visitor().end_array()) {
189 case MSGPACK_CT_MAP_KEY:
190 if (!visitor_holder.visitor().end_map_key()) {
195 e.m_type = MSGPACK_CT_MAP_VALUE;
197 case MSGPACK_CT_MAP_VALUE:
198 if (!visitor_holder.visitor().end_map_value()) {
202 if (--e.m_rest == 0) {
204 if (!visitor_holder.visitor().end_map()) {
210 e.m_type = MSGPACK_CT_MAP_KEY;
219 bool empty()
const {
return m_stack.empty(); }
220 void clear() { m_stack.clear(); }
222 std::vector<stack_elem> m_stack;
226 char const* m_current;
230 uint32_t m_num_elements;
231 unpack_stack m_stack;
234 template <std::
size_t N>
235 inline void check_ext_size(std::size_t ) {
239 inline void check_ext_size<4>(std::size_t
size) {
243 template <
typename VisitorHolder>
249 m_current = data + off;
250 const char*
const pe = data + len;
253 if(m_current == pe) {
254 off =
static_cast<std::size_t
>(m_current - m_start);
257 bool fixed_trail_again =
false;
259 if (m_cs == MSGPACK_CS_HEADER) {
260 fixed_trail_again =
false;
261 int selector = *
reinterpret_cast<const unsigned char*
>(m_current);
262 if (0x00 <= selector && selector <= 0x7f) {
263 uint8_t tmp = *
reinterpret_cast<const uint8_t*
>(m_current);
264 bool visret = holder().visitor().visit_positive_integer(tmp);
267 }
else if(0xe0 <= selector && selector <= 0xff) {
268 int8_t tmp = *
reinterpret_cast<const int8_t*
>(m_current);
269 bool visret = holder().visitor().visit_negative_integer(tmp);
272 }
else if (0xc4 <= selector && selector <= 0xdf) {
273 const uint32_t trail[] = {
303 m_trail = trail[selector - 0xc4];
304 m_cs = next_cs(m_current);
305 fixed_trail_again =
true;
306 }
else if(0xa0 <= selector && selector <= 0xbf) {
307 m_trail =
static_cast<uint32_t
>(*m_current) & 0x1f;
309 bool visret = holder().visitor().visit_str(n,
static_cast<uint32_t
>(m_trail));
314 m_cs = MSGPACK_ACS_STR_VALUE;
315 fixed_trail_again =
true;
317 }
else if(0x90 <= selector && selector <= 0x9f) {
318 parse_return ret = start_aggregate<fix_tag>(array_sv(holder()), array_ev(holder()), m_current, off);
320 }
else if(0x80 <= selector && selector <= 0x8f) {
321 parse_return ret = start_aggregate<fix_tag>(map_sv(holder()), map_ev(holder()), m_current, off);
323 }
else if(selector == 0xc2) {
324 bool visret = holder().visitor().visit_boolean(
false);
327 }
else if(selector == 0xc3) {
328 bool visret = holder().visitor().visit_boolean(
true);
331 }
else if(selector == 0xc0) {
332 bool visret = holder().visitor().visit_nil();
336 off =
static_cast<std::size_t
>(m_current - m_start);
337 holder().visitor().parse_error(off - 1, off);
342 if (m_cs != MSGPACK_CS_HEADER || fixed_trail_again) {
343 if (fixed_trail_again) {
345 fixed_trail_again =
false;
347 if(
static_cast<std::size_t
>(pe - m_current) < m_trail) {
348 off =
static_cast<std::size_t
>(m_current - m_start);
352 m_current += m_trail - 1;
356 case MSGPACK_CS_FLOAT: {
357 union { uint32_t i;
float f; } mem;
358 load<uint32_t>(mem.i, n);
359 bool visret = holder().visitor().visit_float32(mem.f);
363 case MSGPACK_CS_DOUBLE: {
364 union { uint64_t i;
double f; } mem;
365 load<uint64_t>(mem.i, n);
366 #if defined(TARGET_OS_IPHONE)
368 #elif defined(__arm__) && !(__ARM_EABI__) // arm-oabi
370 mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL);
372 bool visret = holder().visitor().visit_float64(mem.f);
376 case MSGPACK_CS_UINT_8: {
378 load<uint8_t>(tmp, n);
379 bool visret = holder().visitor().visit_positive_integer(tmp);
383 case MSGPACK_CS_UINT_16: {
385 load<uint16_t>(tmp, n);
386 bool visret = holder().visitor().visit_positive_integer(tmp);
390 case MSGPACK_CS_UINT_32: {
392 load<uint32_t>(tmp, n);
393 bool visret = holder().visitor().visit_positive_integer(tmp);
397 case MSGPACK_CS_UINT_64: {
399 load<uint64_t>(tmp, n);
400 bool visret = holder().visitor().visit_positive_integer(tmp);
404 case MSGPACK_CS_INT_8: {
406 load<int8_t>(tmp, n);
407 bool visret = holder().visitor().visit_negative_integer(tmp);
411 case MSGPACK_CS_INT_16: {
413 load<int16_t>(tmp, n);
414 bool visret = holder().visitor().visit_negative_integer(tmp);
418 case MSGPACK_CS_INT_32: {
420 load<int32_t>(tmp, n);
421 bool visret = holder().visitor().visit_negative_integer(tmp);
425 case MSGPACK_CS_INT_64: {
427 load<int64_t>(tmp, n);
428 bool visret = holder().visitor().visit_negative_integer(tmp);
432 case MSGPACK_CS_FIXEXT_1: {
433 bool visret = holder().visitor().visit_ext(n, 1+1);
437 case MSGPACK_CS_FIXEXT_2: {
438 bool visret = holder().visitor().visit_ext(n, 2+1);
442 case MSGPACK_CS_FIXEXT_4: {
443 bool visret = holder().visitor().visit_ext(n, 4+1);
447 case MSGPACK_CS_FIXEXT_8: {
448 bool visret = holder().visitor().visit_ext(n, 8+1);
452 case MSGPACK_CS_FIXEXT_16: {
453 bool visret = holder().visitor().visit_ext(n, 16+1);
457 case MSGPACK_CS_STR_8: {
459 load<uint8_t>(tmp, n);
462 bool visret = holder().visitor().visit_str(n,
static_cast<uint32_t
>(m_trail));
467 m_cs = MSGPACK_ACS_STR_VALUE;
468 fixed_trail_again =
true;
471 case MSGPACK_CS_BIN_8: {
473 load<uint8_t>(tmp, n);
476 bool visret = holder().visitor().visit_bin(n,
static_cast<uint32_t
>(m_trail));
481 m_cs = MSGPACK_ACS_BIN_VALUE;
482 fixed_trail_again =
true;
485 case MSGPACK_CS_EXT_8: {
487 load<uint8_t>(tmp, n);
490 bool visret = holder().visitor().visit_ext(n,
static_cast<uint32_t
>(m_trail));
495 m_cs = MSGPACK_ACS_EXT_VALUE;
496 fixed_trail_again =
true;
499 case MSGPACK_CS_STR_16: {
501 load<uint16_t>(tmp, n);
504 bool visret = holder().visitor().visit_str(n,
static_cast<uint32_t
>(m_trail));
509 m_cs = MSGPACK_ACS_STR_VALUE;
510 fixed_trail_again =
true;
513 case MSGPACK_CS_BIN_16: {
515 load<uint16_t>(tmp, n);
518 bool visret = holder().visitor().visit_bin(n,
static_cast<uint32_t
>(m_trail));
523 m_cs = MSGPACK_ACS_BIN_VALUE;
524 fixed_trail_again =
true;
527 case MSGPACK_CS_EXT_16: {
529 load<uint16_t>(tmp, n);
532 bool visret = holder().visitor().visit_ext(n,
static_cast<uint32_t
>(m_trail));
537 m_cs = MSGPACK_ACS_EXT_VALUE;
538 fixed_trail_again =
true;
541 case MSGPACK_CS_STR_32: {
543 load<uint32_t>(tmp, n);
546 bool visret = holder().visitor().visit_str(n,
static_cast<uint32_t
>(m_trail));
551 m_cs = MSGPACK_ACS_STR_VALUE;
552 fixed_trail_again =
true;
555 case MSGPACK_CS_BIN_32: {
557 load<uint32_t>(tmp, n);
560 bool visret = holder().visitor().visit_bin(n,
static_cast<uint32_t
>(m_trail));
565 m_cs = MSGPACK_ACS_BIN_VALUE;
566 fixed_trail_again =
true;
569 case MSGPACK_CS_EXT_32: {
571 load<uint32_t>(tmp, n);
572 check_ext_size<sizeof(std::size_t)>(tmp);
576 bool visret = holder().visitor().visit_ext(n,
static_cast<uint32_t
>(m_trail));
581 m_cs = MSGPACK_ACS_EXT_VALUE;
582 fixed_trail_again =
true;
585 case MSGPACK_ACS_STR_VALUE: {
586 bool visret = holder().visitor().visit_str(n,
static_cast<uint32_t
>(m_trail));
590 case MSGPACK_ACS_BIN_VALUE: {
591 bool visret = holder().visitor().visit_bin(n,
static_cast<uint32_t
>(m_trail));
595 case MSGPACK_ACS_EXT_VALUE: {
596 bool visret = holder().visitor().visit_ext(n,
static_cast<uint32_t
>(m_trail));
600 case MSGPACK_CS_ARRAY_16: {
601 parse_return ret = start_aggregate<uint16_t>(array_sv(holder()), array_ev(holder()), n, off);
605 case MSGPACK_CS_ARRAY_32: {
606 parse_return ret = start_aggregate<uint32_t>(array_sv(holder()), array_ev(holder()), n, off);
609 case MSGPACK_CS_MAP_16: {
610 parse_return ret = start_aggregate<uint16_t>(map_sv(holder()), map_ev(holder()), n, off);
613 case MSGPACK_CS_MAP_32: {
614 parse_return ret = start_aggregate<uint32_t>(map_sv(holder()), map_ev(holder()), n, off);
618 off =
static_cast<std::size_t
>(m_current - m_start);
619 holder().visitor().parse_error(
static_cast<std::size_t
>(n - m_start - 1),
static_cast<std::size_t
>(n - m_start));
623 }
while(m_current != pe);
625 off =
static_cast<std::size_t
>(m_current - m_start);
629 template <
typename Visitor>
630 struct parse_helper : detail::context<parse_helper<Visitor> > {
631 parse_helper(Visitor& v):m_visitor(v) {}
632 parse_return execute(
const char* data, std::size_t len, std::size_t& off) {
633 return detail::context<parse_helper<Visitor> >::execute(data, len, off);
635 Visitor& visitor()
const {
return m_visitor; }
639 template <
typename Visitor>
641 parse_imp(
const char* data,
size_t len,
size_t& off, Visitor& v) {
642 std::size_t noff = off;
645 v.insufficient_bytes(noff, noff);
648 detail::parse_helper<Visitor> h(v);
653 v.insufficient_bytes(noff - 1, noff);
673 #endif // MSGPACK_DEFAULT_API_VERSION >= 2
675 #endif // MSGPACK_V3_PARSE_HPP