10 #ifndef MSGPACK_V2_PARSE_HPP 11 #define MSGPACK_V2_PARSE_HPP 24 template <
typename VisitorHolder>
28 :m_trail(0), m_cs(MSGPACK_CS_HEADER)
34 m_cs = MSGPACK_CS_HEADER;
37 holder().visitor().init();
44 static uint32_t next_cs(T p)
46 return static_cast<uint32_t
>(*p) & 0x1f;
49 VisitorHolder& holder() {
50 return static_cast<VisitorHolder&
>(*this);
53 template <
typename T,
typename StartVisitor,
typename EndVisitor>
55 StartVisitor
const& sv,
60 load<T>(
size, load_pos);
64 off = m_current - m_start;
68 off = m_current - m_start;
73 off = m_current - m_start;
79 off = m_current - m_start;
82 parse_return ret = m_stack.push(holder(), sv.type(),
static_cast<uint32_t
>(
size));
84 off = m_current - m_start;
88 m_cs = MSGPACK_CS_HEADER;
92 parse_return after_visit_proc(
bool visit_result, std::size_t& off) {
95 off = m_current - m_start;
100 off = m_current - m_start;
102 m_cs = MSGPACK_CS_HEADER;
107 array_sv(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
108 bool operator()(uint32_t
size)
const {
109 return m_visitor_holder.visitor().start_array(size);
111 msgpack_container_type type()
const {
return MSGPACK_CT_ARRAY_ITEM; }
113 VisitorHolder& m_visitor_holder;
116 array_ev(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
117 bool operator()()
const {
118 return m_visitor_holder.visitor().end_array();
121 VisitorHolder& m_visitor_holder;
124 map_sv(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
125 bool operator()(uint32_t
size)
const {
126 return m_visitor_holder.visitor().start_map(size);
128 msgpack_container_type type()
const {
return MSGPACK_CT_MAP_KEY; }
130 VisitorHolder& m_visitor_holder;
133 map_ev(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
134 bool operator()()
const {
135 return m_visitor_holder.visitor().end_map();
138 VisitorHolder& m_visitor_holder;
143 stack_elem(msgpack_container_type type, uint32_t rest):m_type(type), m_rest(rest) {}
148 m_stack.reserve(MSGPACK_EMBED_STACK_SIZE);
150 parse_return push(VisitorHolder& visitor_holder, msgpack_container_type type, uint32_t rest) {
153 case MSGPACK_CT_ARRAY_ITEM:
155 case MSGPACK_CT_MAP_KEY:
157 case MSGPACK_CT_MAP_VALUE:
165 while (!m_stack.empty()) {
168 case MSGPACK_CT_ARRAY_ITEM:
179 case MSGPACK_CT_MAP_KEY:
182 e.
m_type = MSGPACK_CT_MAP_VALUE;
184 case MSGPACK_CT_MAP_VALUE:
191 e.
m_type = MSGPACK_CT_MAP_KEY;
200 bool empty()
const {
return m_stack.empty(); }
201 void clear() { m_stack.clear(); }
203 std::vector<stack_elem> m_stack;
207 char const* m_current;
211 uint32_t m_num_elements;
212 unpack_stack m_stack;
215 template <std::
size_t N>
224 template <
typename VisitorHolder>
230 m_current = data + off;
231 const char*
const pe = data + len;
236 if(m_current == pe) {
237 off = m_current - m_start;
240 bool fixed_trail_again =
false;
242 if (m_cs == MSGPACK_CS_HEADER) {
243 fixed_trail_again =
false;
244 int selector = *
reinterpret_cast<const unsigned char*
>(m_current);
245 if (0x00 <= selector && selector <= 0x7f) {
246 uint8_t tmp = *
reinterpret_cast<const uint8_t*
>(m_current);
247 bool visret = holder().visitor().visit_positive_integer(tmp);
250 }
else if(0xe0 <= selector && selector <= 0xff) {
251 int8_t tmp = *
reinterpret_cast<const int8_t*
>(m_current);
252 bool visret = holder().visitor().visit_negative_integer(tmp);
255 }
else if (0xc4 <= selector && selector <= 0xdf) {
256 const uint32_t trail[] = {
286 m_trail = trail[selector - 0xc4];
287 m_cs = next_cs(m_current);
288 fixed_trail_again =
true;
289 }
else if(0xa0 <= selector && selector <= 0xbf) {
290 m_trail =
static_cast<uint32_t
>(*m_current) & 0x1f;
292 bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail));
297 m_cs = MSGPACK_ACS_STR_VALUE;
298 fixed_trail_again =
true;
300 }
else if(0x90 <= selector && selector <= 0x9f) {
301 parse_return ret = start_aggregate<fix_tag>(array_sv(holder()), array_ev(holder()), m_current, off);
303 }
else if(0x80 <= selector && selector <= 0x8f) {
304 parse_return ret = start_aggregate<fix_tag>(map_sv(holder()), map_ev(holder()), m_current, off);
306 }
else if(selector == 0xc2) {
307 bool visret = holder().visitor().visit_boolean(
false);
310 }
else if(selector == 0xc3) {
311 bool visret = holder().visitor().visit_boolean(
true);
314 }
else if(selector == 0xc0) {
315 bool visret = holder().visitor().visit_nil();
319 off = m_current - m_start;
320 holder().visitor().parse_error(off - 1, off);
325 if (m_cs != MSGPACK_CS_HEADER || fixed_trail_again) {
326 if (fixed_trail_again) {
328 fixed_trail_again =
false;
330 if(static_cast<std::size_t>(pe - m_current) < m_trail) {
331 off = m_current - m_start;
335 m_current += m_trail - 1;
339 case MSGPACK_CS_FLOAT: {
340 union { uint32_t i;
float f; } mem;
341 load<uint32_t>(mem.i, n);
342 bool visret = holder().visitor().visit_float(mem.f);
346 case MSGPACK_CS_DOUBLE: {
347 union { uint64_t i;
double f; } mem;
348 load<uint64_t>(mem.i, n);
349 #if defined(TARGET_OS_IPHONE) 351 #elif defined(__arm__) && !(__ARM_EABI__) // arm-oabi 353 mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL);
355 bool visret = holder().visitor().visit_float(mem.f);
359 case MSGPACK_CS_UINT_8: {
361 load<uint8_t>(tmp, n);
362 bool visret = holder().visitor().visit_positive_integer(tmp);
366 case MSGPACK_CS_UINT_16: {
368 load<uint16_t>(tmp, n);
369 bool visret = holder().visitor().visit_positive_integer(tmp);
373 case MSGPACK_CS_UINT_32: {
375 load<uint32_t>(tmp, n);
376 bool visret = holder().visitor().visit_positive_integer(tmp);
380 case MSGPACK_CS_UINT_64: {
382 load<uint64_t>(tmp, n);
383 bool visret = holder().visitor().visit_positive_integer(tmp);
387 case MSGPACK_CS_INT_8: {
389 load<int8_t>(tmp, n);
390 bool visret = holder().visitor().visit_negative_integer(tmp);
394 case MSGPACK_CS_INT_16: {
396 load<int16_t>(tmp, n);
397 bool visret = holder().visitor().visit_negative_integer(tmp);
401 case MSGPACK_CS_INT_32: {
403 load<int32_t>(tmp, n);
404 bool visret = holder().visitor().visit_negative_integer(tmp);
408 case MSGPACK_CS_INT_64: {
410 load<int64_t>(tmp, n);
411 bool visret = holder().visitor().visit_negative_integer(tmp);
415 case MSGPACK_CS_FIXEXT_1: {
416 bool visret = holder().visitor().visit_ext(n, 1+1);
420 case MSGPACK_CS_FIXEXT_2: {
421 bool visret = holder().visitor().visit_ext(n, 2+1);
425 case MSGPACK_CS_FIXEXT_4: {
426 bool visret = holder().visitor().visit_ext(n, 4+1);
430 case MSGPACK_CS_FIXEXT_8: {
431 bool visret = holder().visitor().visit_ext(n, 8+1);
435 case MSGPACK_CS_FIXEXT_16: {
436 bool visret = holder().visitor().visit_ext(n, 16+1);
440 case MSGPACK_CS_STR_8: {
442 load<uint8_t>(tmp, n);
445 bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail));
450 m_cs = MSGPACK_ACS_STR_VALUE;
451 fixed_trail_again =
true;
454 case MSGPACK_CS_BIN_8: {
456 load<uint8_t>(tmp, n);
459 bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail));
464 m_cs = MSGPACK_ACS_BIN_VALUE;
465 fixed_trail_again =
true;
468 case MSGPACK_CS_EXT_8: {
470 load<uint8_t>(tmp, n);
473 bool visret = holder().visitor().visit_ext(n, static_cast<uint32_t>(m_trail));
478 m_cs = MSGPACK_ACS_EXT_VALUE;
479 fixed_trail_again =
true;
482 case MSGPACK_CS_STR_16: {
484 load<uint16_t>(tmp, n);
487 bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail));
492 m_cs = MSGPACK_ACS_STR_VALUE;
493 fixed_trail_again =
true;
496 case MSGPACK_CS_BIN_16: {
498 load<uint16_t>(tmp, n);
501 bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail));
506 m_cs = MSGPACK_ACS_BIN_VALUE;
507 fixed_trail_again =
true;
510 case MSGPACK_CS_EXT_16: {
512 load<uint16_t>(tmp, n);
515 bool visret = holder().visitor().visit_ext(n, static_cast<uint32_t>(m_trail));
520 m_cs = MSGPACK_ACS_EXT_VALUE;
521 fixed_trail_again =
true;
524 case MSGPACK_CS_STR_32: {
526 load<uint32_t>(tmp, n);
529 bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail));
534 m_cs = MSGPACK_ACS_STR_VALUE;
535 fixed_trail_again =
true;
538 case MSGPACK_CS_BIN_32: {
540 load<uint32_t>(tmp, n);
543 bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail));
548 m_cs = MSGPACK_ACS_BIN_VALUE;
549 fixed_trail_again =
true;
552 case MSGPACK_CS_EXT_32: {
554 load<uint32_t>(tmp, n);
555 check_ext_size<sizeof(std::size_t)>(tmp);
559 bool visret = holder().visitor().visit_ext(n, static_cast<uint32_t>(m_trail));
564 m_cs = MSGPACK_ACS_EXT_VALUE;
565 fixed_trail_again =
true;
568 case MSGPACK_ACS_STR_VALUE: {
569 bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail));
573 case MSGPACK_ACS_BIN_VALUE: {
574 bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail));
578 case MSGPACK_ACS_EXT_VALUE: {
579 bool visret = holder().visitor().visit_ext(n, static_cast<uint32_t>(m_trail));
583 case MSGPACK_CS_ARRAY_16: {
584 parse_return ret = start_aggregate<uint16_t>(array_sv(holder()), array_ev(holder()), n, off);
588 case MSGPACK_CS_ARRAY_32: {
589 parse_return ret = start_aggregate<uint32_t>(array_sv(holder()), array_ev(holder()), n, off);
592 case MSGPACK_CS_MAP_16: {
593 parse_return ret = start_aggregate<uint16_t>(map_sv(holder()), map_ev(holder()), n, off);
596 case MSGPACK_CS_MAP_32: {
597 parse_return ret = start_aggregate<uint32_t>(map_sv(holder()), map_ev(holder()), n, off);
601 off = m_current - m_start;
602 holder().visitor().parse_error(n - m_start - 1, n - m_start);
606 }
while(m_current != pe);
608 off = m_current - m_start;
617 template <
typename VisitorHolder,
typename ReferencedBufferHook>
631 parser(ReferencedBufferHook& hook,
634 #if !defined(MSGPACK_USE_CPP03) 635 parser(this_type&& other);
636 this_type& operator=(this_type&& other);
637 #endif // !defined(MSGPACK_USE_CPP03) 667 std::size_t buffer_capacity()
const;
679 void buffer_consumed(std::size_t
size);
698 std::size_t message_size()
const;
708 std::size_t parsed_size()
const;
717 char* nonparsed_buffer();
726 std::size_t nonparsed_size()
const;
736 void skip_nonparsed_buffer(std::size_t size);
743 void remove_nonparsed_buffer();
752 void expand_buffer(std::size_t size);
760 std::size_t m_parsed;
761 std::size_t m_initial_buffer_size;
762 ReferencedBufferHook& m_referenced_buffer_hook;
764 #if defined(MSGPACK_USE_CPP03) 767 this_type& operator=(
const this_type&);
768 #else // defined(MSGPACK_USE_CPP03) 770 parser(
const this_type&) =
delete;
771 this_type& operator=(
const this_type&) =
delete;
772 #endif // defined(MSGPACK_USE_CPP03) 775 template <
typename VisitorHolder,
typename ReferencedBufferHook>
777 ReferencedBufferHook& hook,
778 std::size_t initial_buffer_size)
779 :m_referenced_buffer_hook(hook)
785 char* buffer =
static_cast<char*
>(::malloc(initial_buffer_size));
787 throw std::bad_alloc();
792 m_free = initial_buffer_size - m_used;
795 m_initial_buffer_size = initial_buffer_size;
800 #if !defined(MSGPACK_USE_CPP03) 803 template <
typename VisitorHolder,
typename ReferencedBufferHook>
806 m_buffer(other.m_buffer),
807 m_used(other.m_used),
808 m_free(other.m_free),
810 m_parsed(other.m_parsed),
811 m_initial_buffer_size(other.m_initial_buffer_size),
812 m_referenced_buffer_hook(other.m_referenced_buffer_hook) {
820 template <
typename VisitorHolder,
typename ReferencedBufferHook>
827 #endif // !defined(MSGPACK_USE_CPP03) 830 template <
typename VisitorHolder,
typename ReferencedBufferHook>
838 template <
typename VisitorHolder,
typename ReferencedBufferHook>
841 if(m_free >= size)
return;
845 template <
typename VisitorHolder,
typename ReferencedBufferHook>
849 && !static_cast<VisitorHolder&>(*this).visitor().referenced()) {
855 if(m_free >= size)
return;
859 std::size_t next_size = (m_used + m_free) * 2;
860 while(next_size < size + m_used) {
861 std::size_t tmp_next_size = next_size * 2;
862 if (tmp_next_size <= next_size) {
863 next_size = size + m_used;
866 next_size = tmp_next_size;
869 char* tmp =
static_cast<char*
>(::realloc(m_buffer, next_size));
871 throw std::bad_alloc();
875 m_free = next_size - m_used;
878 std::size_t next_size = m_initial_buffer_size;
879 std::size_t not_parsed = m_used - m_off;
881 std::size_t tmp_next_size = next_size * 2;
882 if (tmp_next_size <= next_size) {
886 next_size = tmp_next_size;
889 char* tmp =
static_cast<char*
>(::malloc(next_size));
891 throw std::bad_alloc();
896 std::memcpy(tmp+
COUNTER_SIZE, m_buffer + m_off, not_parsed);
898 if(static_cast<VisitorHolder&>(*this).referenced()) {
900 m_referenced_buffer_hook(m_buffer);
906 static_cast<VisitorHolder&
>(*this).set_referenced(
false);
913 m_free = next_size - m_used;
918 template <
typename VisitorHolder,
typename ReferencedBufferHook>
921 return m_buffer + m_used;
924 template <
typename VisitorHolder,
typename ReferencedBufferHook>
930 template <
typename VisitorHolder,
typename ReferencedBufferHook>
937 template <
typename VisitorHolder,
typename ReferencedBufferHook>
944 template <
typename VisitorHolder,
typename ReferencedBufferHook>
947 std::size_t off = m_off;
948 parse_return ret = context_type::execute(m_buffer, m_used, m_off);
950 m_parsed += m_off - off;
955 template <
typename VisitorHolder,
typename ReferencedBufferHook>
958 context_type::init();
963 template <
typename VisitorHolder,
typename ReferencedBufferHook>
966 return m_parsed - m_off + m_used;
969 template <
typename VisitorHolder,
typename ReferencedBufferHook>
975 template <
typename VisitorHolder,
typename ReferencedBufferHook>
978 return m_buffer + m_off;
981 template <
typename VisitorHolder,
typename ReferencedBufferHook>
984 return m_used - m_off;
987 template <
typename VisitorHolder,
typename ReferencedBufferHook>
993 template <
typename VisitorHolder,
typename ReferencedBufferHook>
999 template <
typename Visitor>
1000 inline bool parse(
const char* data,
size_t len,
size_t& off, Visitor& v) {
1005 template <
typename Visitor>
1006 inline bool parse(
const char* data,
size_t len, Visitor& v) {
1007 std::size_t off = 0;
1008 return parse(data, len, off, v);
1013 template <
typename Visitor>
1023 template <
typename Visitor>
1025 parse_imp(
const char* data,
size_t len,
size_t& off, Visitor& v) {
1026 std::size_t noff = off;
1030 v.insufficient_bytes(noff, noff);
1038 v.insufficient_bytes(noff - 1, noff);
1061 #endif // MSGPACK_V2_PARSE_HPP parser(ReferencedBufferHook &hook, std::size_t initial_buffer_size=MSGPACK_UNPACKER_INIT_BUFFER_SIZE)
Constructor.
Definition: parse.hpp:776
context()
Definition: parse.hpp:27
void check_ext_size(std::size_t)
Definition: parse.hpp:216
#define MSGPACK_UNPACKER_INIT_BUFFER_SIZE
Definition: unpack_decl.hpp:43
parse_return
Definition: parse_return.hpp:23
msgpack_container_type m_type
Definition: parse.hpp:144
void init()
Definition: parse.hpp:32
Definition: parse_return.hpp:27
stack_elem(msgpack_container_type type, uint32_t rest)
Definition: parse.hpp:143
T type
Definition: unpack.hpp:271
Definition: adaptor_base.hpp:15
Definition: unpack_exception.hpp:97
Definition: parse.hpp:142
Definition: parse.hpp:1014
int execute(const char *data, std::size_t len, std::size_t &off)
Definition: unpack.hpp:452
void check_ext_size< 4 >(std::size_t size)
Definition: parse.hpp:220
Visitor & visitor() const
Definition: parse.hpp:1019
Definition: unpack.hpp:303
char * get_raw_buffer()
Definition: parse.hpp:748
void init_count(void *buffer)
Definition: unpack.hpp:226
bool parse(const char *data, size_t len, Visitor &v)
Unpack msgpack formatted data via a visitor.
Definition: parse.hpp:1006
Definition: parse_return.hpp:26
std::size_t size(T const &t)
Definition: size_equal_only.hpp:24
const size_t COUNTER_SIZE
Definition: unpack_decl.hpp:40
Definition: parse_return.hpp:28
std::atomic< unsigned int > const & get_count(void *buffer)
Definition: unpack.hpp:263
Object class that corresponding to MessagePack format object.
Definition: object_fwd.hpp:75
Definition: unpack.hpp:207
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition: versioning.hpp:58
Definition: parse_return.hpp:24
parse_return parse_imp(const char *data, size_t len, size_t &off, Visitor &v)
Definition: parse.hpp:1025
Definition: parse_return.hpp:25
msgpack::object const & data() const
Definition: unpack.hpp:320
void decr_count(void *buffer)
Definition: unpack.hpp:235
uint32_t m_rest
Definition: parse.hpp:145
#define MSGPACK_NULLPTR
Definition: cpp_config_decl.hpp:35
parse_return execute(const char *data, std::size_t len, std::size_t &off)
Definition: parse.hpp:1016
parse_helper(Visitor &v)
Definition: parse.hpp:1015
Parsing class for a stream deserialization.
Definition: parse.hpp:618
Visitor & m_visitor
Definition: parse.hpp:1020
#define MSGPACK_UNPACKER_RESERVE_SIZE
Definition: unpack_decl.hpp:47