10#ifndef MSGPACK_V2_PARSE_HPP
11#define MSGPACK_V2_PARSE_HPP
13#if MSGPACK_DEFAULT_API_VERSION >= 2
31using v1::detail::fix_tag;
32using v1::detail::value;
33using v1::detail::load;
35template <
typename VisitorHolder>
57 return static_cast<uint32_t>(*p) & 0x1f;
64 template <
typename T,
typename StartVisitor,
typename EndVisitor>
75 off =
static_cast<std::size_t
>(m_current - m_start);
79 off =
static_cast<std::size_t
>(m_current - m_start);
83 if (
ret != PARSE_CONTINUE) {
84 off =
static_cast<std::size_t
>(m_current - m_start);
90 off =
static_cast<std::size_t
>(m_current - m_start);
94 if (
ret != PARSE_CONTINUE) {
95 off =
static_cast<std::size_t
>(m_current - m_start);
106 off =
static_cast<std::size_t
>(m_current - m_start);
110 if (
ret != PARSE_CONTINUE) {
111 off =
static_cast<std::size_t
>(m_current - m_start);
118 array_sv(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
119 bool operator()(uint32_t size)
const {
120 return m_visitor_holder.visitor().start_array(size);
124 VisitorHolder& m_visitor_holder;
127 array_ev(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
128 bool operator()()
const {
129 return m_visitor_holder.visitor().end_array();
132 VisitorHolder& m_visitor_holder;
135 map_sv(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
136 bool operator()(uint32_t size)
const {
137 return m_visitor_holder.visitor().start_map(size);
141 VisitorHolder& m_visitor_holder;
144 map_ev(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
145 bool operator()()
const {
146 return m_visitor_holder.visitor().end_map();
149 VisitorHolder& m_visitor_holder;
152 struct unpack_stack {
162 m_stack.push_back(stack_elem(type, rest));
176 while (!m_stack.empty()) {
177 stack_elem& e = m_stack.back();
181 if (--e.m_rest == 0) {
197 if (--e.m_rest == 0) {
211 bool empty()
const {
return m_stack.empty(); }
212 void clear() { m_stack.clear(); }
214 std::vector<stack_elem> m_stack;
218 char const* m_current;
223 unpack_stack m_stack;
226template <std::
size_t N>
227inline void check_ext_size(std::size_t ) {
235template <
typename VisitorHolder>
241 m_current = data +
off;
242 const char*
const pe = data +
len;
245 if(m_current ==
pe) {
246 off =
static_cast<std::size_t
>(m_current - m_start);
253 int selector = *
reinterpret_cast<const unsigned char*
>(m_current);
258 if (
upr != PARSE_CONTINUE)
return upr;
263 if (
upr != PARSE_CONTINUE)
return upr;
296 m_cs = next_cs(m_current);
299 m_trail =
static_cast<uint32_t>(*m_current) & 0x1f;
303 if (
upr != PARSE_CONTINUE)
return upr;
311 if (
ret != PARSE_CONTINUE)
return ret;
314 if (
ret != PARSE_CONTINUE)
return ret;
318 if (
upr != PARSE_CONTINUE)
return upr;
322 if (
upr != PARSE_CONTINUE)
return upr;
326 if (
upr != PARSE_CONTINUE)
return upr;
328 off =
static_cast<std::size_t
>(m_current - m_start);
339 if(
static_cast<std::size_t
>(
pe - m_current) < m_trail) {
340 off =
static_cast<std::size_t
>(m_current - m_start);
344 m_current += m_trail - 1;
353 if (
upr != PARSE_CONTINUE)
return upr;
358#if defined(TARGET_OS_IPHONE)
360#elif defined(__arm__) && !(__ARM_EABI__)
362 mem.i = (
mem.i & 0xFFFFFFFFUL) << 32UL | (
mem.i >> 32UL);
366 if (
upr != PARSE_CONTINUE)
return upr;
373 if (
upr != PARSE_CONTINUE)
return upr;
380 if (
upr != PARSE_CONTINUE)
return upr;
387 if (
upr != PARSE_CONTINUE)
return upr;
394 if (
upr != PARSE_CONTINUE)
return upr;
401 if (
upr != PARSE_CONTINUE)
return upr;
408 if (
upr != PARSE_CONTINUE)
return upr;
415 if (
upr != PARSE_CONTINUE)
return upr;
422 if (
upr != PARSE_CONTINUE)
return upr;
427 if (
upr != PARSE_CONTINUE)
return upr;
432 if (
upr != PARSE_CONTINUE)
return upr;
437 if (
upr != PARSE_CONTINUE)
return upr;
442 if (
upr != PARSE_CONTINUE)
return upr;
447 if (
upr != PARSE_CONTINUE)
return upr;
456 if (
upr != PARSE_CONTINUE)
return upr;
470 if (
upr != PARSE_CONTINUE)
return upr;
484 if (
upr != PARSE_CONTINUE)
return upr;
498 if (
upr != PARSE_CONTINUE)
return upr;
512 if (
upr != PARSE_CONTINUE)
return upr;
526 if (
upr != PARSE_CONTINUE)
return upr;
540 if (
upr != PARSE_CONTINUE)
return upr;
554 if (
upr != PARSE_CONTINUE)
return upr;
570 if (
upr != PARSE_CONTINUE)
return upr;
580 if (
upr != PARSE_CONTINUE)
return upr;
585 if (
upr != PARSE_CONTINUE)
return upr;
590 if (
upr != PARSE_CONTINUE)
return upr;
594 if (
ret != PARSE_CONTINUE)
return ret;
599 if (
ret != PARSE_CONTINUE)
return ret;
603 if (
ret != PARSE_CONTINUE)
return ret;
607 if (
ret != PARSE_CONTINUE)
return ret;
610 off =
static_cast<std::size_t
>(m_current - m_start);
611 holder().visitor().parse_error(
static_cast<std::size_t
>(
n - m_start - 1),
static_cast<std::size_t
>(
n - m_start));
615 }
while(m_current !=
pe);
617 off =
static_cast<std::size_t
>(m_current - m_start);
626template <
typename VisitorHolder,
typename ReferencedBufferHook>
627class parser :
public detail::context<VisitorHolder> {
643#if !defined(MSGPACK_USE_CPP03)
676 std::size_t buffer_capacity()
const;
688 void buffer_consumed(std::size_t size);
707 std::size_t message_size()
const;
717 std::size_t parsed_size()
const;
726 char* nonparsed_buffer();
735 std::size_t nonparsed_size()
const;
745 void skip_nonparsed_buffer(std::size_t size);
752 void remove_nonparsed_buffer();
761 void expand_buffer(std::size_t size);
769 std::size_t m_parsed;
770 std::size_t m_initial_buffer_size;
773#if defined(MSGPACK_USE_CPP03)
784template <
typename VisitorHolder,
typename ReferencedBufferHook>
785inline parser<VisitorHolder, ReferencedBufferHook>::parser(
794 char* buffer =
static_cast<char*
>(::malloc(initial_buffer_size));
796 throw std::bad_alloc();
801 m_free = initial_buffer_size - m_used;
804 m_initial_buffer_size = initial_buffer_size;
806 detail::init_count(m_buffer);
809#if !defined(MSGPACK_USE_CPP03)
812template <
typename VisitorHolder,
typename ReferencedBufferHook>
813inline parser<VisitorHolder, ReferencedBufferHook>::parser(this_type&& other)
814 :context_type(std::move(other)),
815 m_buffer(other.m_buffer),
816 m_used(other.m_used),
817 m_free(other.m_free),
819 m_parsed(other.m_parsed),
820 m_initial_buffer_size(other.m_initial_buffer_size),
821 m_referenced_buffer_hook(other.m_referenced_buffer_hook) {
829template <
typename VisitorHolder,
typename ReferencedBufferHook>
830inline parser<VisitorHolder, ReferencedBufferHook>& parser<VisitorHolder, ReferencedBufferHook>::operator=(this_type&& other) {
832 new (
this) this_type(std::move(other));
839template <
typename VisitorHolder,
typename ReferencedBufferHook>
840inline parser<VisitorHolder, ReferencedBufferHook>::~parser()
843 if (m_buffer) detail::decr_count(m_buffer);
847template <
typename VisitorHolder,
typename ReferencedBufferHook>
848inline void parser<VisitorHolder, ReferencedBufferHook>::reserve_buffer(std::size_t size)
850 if(m_free >= size)
return;
854template <
typename VisitorHolder,
typename ReferencedBufferHook>
855inline void parser<VisitorHolder, ReferencedBufferHook>::expand_buffer(std::size_t size)
857 if(m_used == m_off && detail::get_count(m_buffer) == 1
858 && !
static_cast<VisitorHolder&
>(*this).visitor().referenced()) {
864 if(m_free >= size)
return;
868 std::size_t next_size = (m_used + m_free) * 2;
869 while(next_size < size + m_used) {
870 std::size_t tmp_next_size = next_size * 2;
871 if (tmp_next_size <= next_size) {
872 next_size =
size + m_used;
875 next_size = tmp_next_size;
878 char* tmp =
static_cast<char*
>(::realloc(m_buffer, next_size));
880 throw std::bad_alloc();
884 m_free = next_size - m_used;
887 std::size_t next_size = m_initial_buffer_size;
888 std::size_t not_parsed = m_used - m_off;
890 std::size_t tmp_next_size = next_size * 2;
891 if (tmp_next_size <= next_size) {
895 next_size = tmp_next_size;
898 char* tmp =
static_cast<char*
>(::malloc(next_size));
900 throw std::bad_alloc();
903 detail::init_count(tmp);
905 std::memcpy(tmp+
COUNTER_SIZE, m_buffer + m_off, not_parsed);
907 if(
static_cast<VisitorHolder&
>(*this).referenced()) {
909 m_referenced_buffer_hook(m_buffer);
915 static_cast<VisitorHolder&
>(*this).set_referenced(
false);
917 detail::decr_count(m_buffer);
922 m_free = next_size - m_used;
927template <
typename VisitorHolder,
typename ReferencedBufferHook>
928inline char* parser<VisitorHolder, ReferencedBufferHook>::buffer()
930 return m_buffer + m_used;
933template <
typename VisitorHolder,
typename ReferencedBufferHook>
934inline std::size_t parser<VisitorHolder, ReferencedBufferHook>::buffer_capacity()
const
939template <
typename VisitorHolder,
typename ReferencedBufferHook>
940inline void parser<VisitorHolder, ReferencedBufferHook>::buffer_consumed(std::size_t size)
946template <
typename VisitorHolder,
typename ReferencedBufferHook>
947 inline bool parser<VisitorHolder, ReferencedBufferHook>::next()
953template <
typename VisitorHolder,
typename ReferencedBufferHook>
954inline parse_return parser<VisitorHolder, ReferencedBufferHook>::execute_imp()
956 std::size_t off = m_off;
957 parse_return ret = context_type::execute(m_buffer, m_used, m_off);
959 m_parsed += m_off - off;
964template <
typename VisitorHolder,
typename ReferencedBufferHook>
965inline void parser<VisitorHolder, ReferencedBufferHook>::reset()
967 context_type::init();
972template <
typename VisitorHolder,
typename ReferencedBufferHook>
973inline std::size_t parser<VisitorHolder, ReferencedBufferHook>::message_size()
const
975 return m_parsed - m_off + m_used;
978template <
typename VisitorHolder,
typename ReferencedBufferHook>
979inline std::size_t parser<VisitorHolder, ReferencedBufferHook>::parsed_size()
const
984template <
typename VisitorHolder,
typename ReferencedBufferHook>
985inline char* parser<VisitorHolder, ReferencedBufferHook>::nonparsed_buffer()
987 return m_buffer + m_off;
990template <
typename VisitorHolder,
typename ReferencedBufferHook>
991inline std::size_t parser<VisitorHolder, ReferencedBufferHook>::nonparsed_size()
const
993 return m_used - m_off;
996template <
typename VisitorHolder,
typename ReferencedBufferHook>
997inline void parser<VisitorHolder, ReferencedBufferHook>::skip_nonparsed_buffer(std::size_t size)
1002template <
typename VisitorHolder,
typename ReferencedBufferHook>
1003inline void parser<VisitorHolder, ReferencedBufferHook>::remove_nonparsed_buffer()
1008template <
typename Visitor>
1009inline bool parse(
const char* data,
size_t len,
size_t& off, Visitor& v) {
1014template <
typename Visitor>
1015inline bool parse(
const char* data,
size_t len, Visitor& v) {
1016 std::size_t off = 0;
1022template <
typename Visitor>
1023struct parse_helper : detail::context<parse_helper<Visitor> > {
1024 parse_helper(Visitor& v):m_visitor(v) {}
1025 parse_return execute(
const char* data, std::size_t len, std::size_t& off) {
1026 return detail::context<parse_helper<Visitor> >::execute(data, len, off);
1028 Visitor& visitor()
const {
return m_visitor; }
1032template <
typename Visitor>
1034parse_imp(
const char* data,
size_t len,
size_t& off, Visitor& v) {
1035 std::size_t noff = off;
1039 v.insufficient_bytes(noff, noff);
1042 detail::parse_helper<Visitor> h(v);
1047 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
void convert(T &v, msgpack::object const &o)
Definition object.hpp:1178
bool parse(const char *data, size_t len, size_t &off, Visitor &v)
Unpack msgpack formatted data via a visitor.
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_UNPACKER_INIT_BUFFER_SIZE
Definition unpack_decl.hpp:43
#define MSGPACK_UNPACKER_RESERVE_SIZE
Definition unpack_decl.hpp:47
const size_t COUNTER_SIZE
Definition unpack_decl.hpp:40
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition versioning.hpp:66