MessagePack for C++
Loading...
Searching...
No Matches
create_object_visitor.hpp
Go to the documentation of this file.
1//
2// MessagePack for C++ deserializing routine
3//
4// Copyright (C) 2017 KONDO Takatoshi
5//
6// Distributed under the Boost Software License, Version 1.0.
7// (See accompanying file LICENSE_1_0.txt or copy at
8// http://www.boost.org/LICENSE_1_0.txt)
9//
10#ifndef MSGPACK_V2_CREATE_OBJECT_VISITOR_HPP
11#define MSGPACK_V2_CREATE_OBJECT_VISITOR_HPP
12
17#include "msgpack/assert.hpp"
18
19namespace msgpack {
20
24
25namespace detail {
26
27class create_object_visitor : public msgpack::v2::null_visitor {
28public:
30 :m_func(f), m_user_data(user_data), m_limit(limit) {
32 m_stack.push_back(&m_obj);
33 }
34
35#if !defined(MSGPACK_USE_CPP03)
37 :m_func(other.m_func),
39 m_limit(std::move(other.m_limit)),
40 m_stack(std::move(other.m_stack)),
41 m_zone(other.m_zone),
43 other.m_zone = MSGPACK_NULLPTR;
44 m_stack[0] = &m_obj;
45 }
47 if (this != &other) {
49 new (this) create_object_visitor(std::move(other));
50 }
51 return *this;
52 }
53#endif // !defined(MSGPACK_USE_CPP03)
54
55 void init() {
56 m_stack.resize(1);
58 m_stack[0] = &m_obj;
59 }
60 msgpack::object const& data() const
61 {
62 return m_obj;
63 }
64 msgpack::zone const& zone() const { return *m_zone; }
65 msgpack::zone& zone() { return *m_zone; }
67 bool referenced() const { return m_referenced; }
69 // visit functions
70 bool visit_nil() {
71 msgpack::object* obj = m_stack.back();
73 return true;
74 }
75 bool visit_boolean(bool v) {
76 msgpack::object* obj = m_stack.back();
78 obj->via.boolean = v;
79 return true;
80 }
81 bool visit_positive_integer(uint64_t v) {
82 msgpack::object* obj = m_stack.back();
84 obj->via.u64 = v;
85 return true;
86 }
87 bool visit_negative_integer(int64_t v) {
88 msgpack::object* obj = m_stack.back();
89 if(v >= 0) {
91 obj->via.u64 = static_cast<uint64_t>(v);
92 }
93 else {
95 obj->via.i64 = v;
96 }
97 return true;
98 }
99 bool visit_float32(float v) {
100 msgpack::object* obj = m_stack.back();
102 obj->via.f64 = v;
103 return true;
104 }
105 bool visit_float64(double v) {
106 msgpack::object* obj = m_stack.back();
108 obj->via.f64 = v;
109 return true;
110 }
111 bool visit_str(const char* v, uint32_t size) {
112 MSGPACK_ASSERT(v || size == 0);
113 if (size > m_limit.str()) throw msgpack::str_size_overflow("str size overflow");
114 msgpack::object* obj = m_stack.back();
116 if (m_func && m_func(obj->type, size, m_user_data)) {
117 obj->via.str.ptr = v;
118 obj->via.str.size = size;
119 set_referenced(true);
120 }
121 else {
122 if (v) {
123 char* tmp = static_cast<char*>(zone().allocate_align(size, MSGPACK_ZONE_ALIGNOF(char)));
124 std::memcpy(tmp, v, size);
125 obj->via.str.ptr = tmp;
126 obj->via.str.size = size;
127 }
128 else {
129 obj->via.str.ptr = MSGPACK_NULLPTR;
130 obj->via.str.size = 0;
131 }
132 }
133 return true;
134 }
135 bool visit_bin(const char* v, uint32_t size) {
136 MSGPACK_ASSERT(v || size == 0);
137 if (size > m_limit.bin()) throw msgpack::bin_size_overflow("bin size overflow");
138 msgpack::object* obj = m_stack.back();
140 if (m_func && m_func(obj->type, size, m_user_data)) {
141 obj->via.bin.ptr = v;
142 obj->via.bin.size = size;
143 set_referenced(true);
144 }
145 else {
146 if (v) {
147 char* tmp = static_cast<char*>(zone().allocate_align(size, MSGPACK_ZONE_ALIGNOF(char)));
148 std::memcpy(tmp, v, size);
149 obj->via.bin.ptr = tmp;
150 obj->via.bin.size = size;
151 }
152 else {
153 obj->via.bin.ptr = MSGPACK_NULLPTR;
154 obj->via.bin.size = 0;
155 }
156 }
157 return true;
158 }
159 bool visit_ext(const char* v, std::size_t size) {
160 MSGPACK_ASSERT(v || size == 0);
161 if (size > m_limit.ext()) throw msgpack::ext_size_overflow("ext size overflow");
162 msgpack::object* obj = m_stack.back();
164 if (m_func && m_func(obj->type, size, m_user_data)) {
165 obj->via.ext.ptr = v;
166 obj->via.ext.size = static_cast<uint32_t>(size - 1);
167 set_referenced(true);
168 }
169 else {
170 if (v) {
171 char* tmp = static_cast<char*>(zone().allocate_align(size, MSGPACK_ZONE_ALIGNOF(char)));
172 std::memcpy(tmp, v, size);
173 obj->via.ext.ptr = tmp;
174 obj->via.ext.size = static_cast<uint32_t>(size - 1);
175 }
176 else {
177 obj->via.ext.ptr = MSGPACK_NULLPTR;
178 obj->via.ext.size = 0;
179 }
180 }
181 return true;
182 }
183 bool start_array(uint32_t num_elements) {
184 if (num_elements > m_limit.array()) throw msgpack::array_size_overflow("array size overflow");
185 if (m_stack.size() > m_limit.depth()) throw msgpack::depth_size_overflow("depth size overflow");
186 msgpack::object* obj = m_stack.back();
188 obj->via.array.size = num_elements;
189 if (num_elements == 0) {
191 }
192 else {
193
194#if SIZE_MAX == UINT_MAX
195 if (num_elements > SIZE_MAX/sizeof(msgpack::object))
196 throw msgpack::array_size_overflow("array size overflow");
197#endif // SIZE_MAX == UINT_MAX
198
199 size_t size = num_elements*sizeof(msgpack::object);
200 obj->via.array.ptr =
201 static_cast<msgpack::object*>(m_zone->allocate_align(size, MSGPACK_ZONE_ALIGNOF(msgpack::object)));
202 }
203 m_stack.push_back(obj->via.array.ptr);
204 return true;
205 }
207 return true;
208 }
210 ++m_stack.back();
211 return true;
212 }
213 bool end_array() {
214 m_stack.pop_back();
215 return true;
216 }
217 bool start_map(uint32_t num_kv_pairs) {
218 if (num_kv_pairs > m_limit.map()) throw msgpack::map_size_overflow("map size overflow");
219 if (m_stack.size() > m_limit.depth()) throw msgpack::depth_size_overflow("depth size overflow");
220 msgpack::object* obj = m_stack.back();
222 obj->via.map.size = num_kv_pairs;
223 if (num_kv_pairs == 0) {
224 obj->via.map.ptr = MSGPACK_NULLPTR;
225 }
226 else {
227
228#if SIZE_MAX == UINT_MAX
229 if (num_kv_pairs > SIZE_MAX/sizeof(msgpack::object_kv))
230 throw msgpack::map_size_overflow("map size overflow");
231#endif // SIZE_MAX == UINT_MAX
232 size_t size = num_kv_pairs*sizeof(msgpack::object_kv);
233 obj->via.map.ptr =
234 static_cast<msgpack::object_kv*>(m_zone->allocate_align(size, MSGPACK_ZONE_ALIGNOF(msgpack::object_kv)));
235 }
236 m_stack.push_back(reinterpret_cast<msgpack::object*>(obj->via.map.ptr));
237 return true;
238 }
240 return true;
241 }
242 bool end_map_key() {
243 ++m_stack.back();
244 return true;
245 }
247 return true;
248 }
250 ++m_stack.back();
251 return true;
252 }
253 bool end_map() {
254 m_stack.pop_back();
255 return true;
256 }
257 void parse_error(size_t /*parsed_offset*/, size_t /*error_offset*/) {
258 throw msgpack::parse_error("parse error");
259 }
260 void insufficient_bytes(size_t /*parsed_offset*/, size_t /*error_offset*/) {
261 throw msgpack::insufficient_bytes("insufficient bytes");
262 }
263private:
264public:
269 std::vector<msgpack::object*> m_stack;
272};
273
274} // detail
275
277} // MSGPACK_API_VERSION_NAMESPACE(v2)
279
280} // namespace msgpack
281
282#endif // MSGPACK_V2_CREATE_OBJECT_VISITOR_HPP
#define MSGPACK_ASSERT
Definition assert.hpp:22
bool visit_float64(double v)
Definition create_object_visitor.hpp:105
bool end_array()
Definition create_object_visitor.hpp:213
bool end_map()
Definition create_object_visitor.hpp:253
std::vector< msgpack::object * > m_stack
Definition create_object_visitor.hpp:269
bool visit_positive_integer(uint64_t v)
Definition create_object_visitor.hpp:81
bool visit_negative_integer(int64_t v)
Definition create_object_visitor.hpp:87
void set_referenced(bool referenced)
Definition create_object_visitor.hpp:68
bool m_referenced
Definition create_object_visitor.hpp:271
msgpack::object m_obj
Definition create_object_visitor.hpp:268
void insufficient_bytes(size_t, size_t)
Definition create_object_visitor.hpp:260
bool end_array_item()
Definition create_object_visitor.hpp:209
void init()
Definition create_object_visitor.hpp:55
bool end_map_value()
Definition create_object_visitor.hpp:249
void set_zone(msgpack::zone &zone)
Definition create_object_visitor.hpp:66
bool start_map_key()
Definition create_object_visitor.hpp:239
create_object_visitor & operator=(create_object_visitor &&other)
Definition create_object_visitor.hpp:46
bool visit_str(const char *v, uint32_t size)
Definition create_object_visitor.hpp:111
unpack_limit m_limit
Definition create_object_visitor.hpp:267
bool visit_nil()
Definition create_object_visitor.hpp:70
msgpack::zone * m_zone
Definition create_object_visitor.hpp:270
bool end_map_key()
Definition create_object_visitor.hpp:242
bool referenced() const
Definition create_object_visitor.hpp:67
bool start_array_item()
Definition create_object_visitor.hpp:206
bool start_array(uint32_t num_elements)
Definition create_object_visitor.hpp:183
msgpack::zone & zone()
Definition create_object_visitor.hpp:65
bool visit_float32(float v)
Definition create_object_visitor.hpp:99
unpack_reference_func m_func
Definition create_object_visitor.hpp:265
bool visit_ext(const char *v, std::size_t size)
Definition create_object_visitor.hpp:159
create_object_visitor(create_object_visitor &&other)
Definition create_object_visitor.hpp:36
bool visit_boolean(bool v)
Definition create_object_visitor.hpp:75
msgpack::zone const & zone() const
Definition create_object_visitor.hpp:64
bool visit_bin(const char *v, uint32_t size)
Definition create_object_visitor.hpp:135
bool start_map_value()
Definition create_object_visitor.hpp:246
create_object_visitor(unpack_reference_func f, void *user_data, unpack_limit const &limit)
Definition create_object_visitor.hpp:29
void parse_error(size_t, size_t)
Definition create_object_visitor.hpp:257
bool start_map(uint32_t num_kv_pairs)
Definition create_object_visitor.hpp:217
void * m_user_data
Definition create_object_visitor.hpp:266
msgpack::object const & data() const
Definition create_object_visitor.hpp:60
Definition unpack_decl.hpp:87
Definition cpp03_zone.hpp:30
void * allocate_align(size_t size, size_t align=MSGPACK_ZONE_ALIGN)
Definition cpp03_zone.hpp:255
Definition check_container_size.hpp:31
@ EXT
Definition object_fwd_decl.hpp:42
@ FLOAT64
Definition object_fwd_decl.hpp:33
@ BOOLEAN
Definition object_fwd_decl.hpp:29
@ MAP
Definition object_fwd_decl.hpp:41
@ NIL
Definition object_fwd_decl.hpp:28
@ STR
Definition object_fwd_decl.hpp:38
@ ARRAY
Definition object_fwd_decl.hpp:40
@ BIN
Definition object_fwd_decl.hpp:39
@ POSITIVE_INTEGER
Definition object_fwd_decl.hpp:30
@ NEGATIVE_INTEGER
Definition object_fwd_decl.hpp:31
@ FLOAT32
Definition object_fwd_decl.hpp:32
Definition adaptor_base.hpp:15
bool(* unpack_reference_func)(msgpack::type::object_type type, std::size_t size, void *user_data)
The type of reference or copy judging function.
Definition unpack_decl.hpp:74
Definition unpack_exception.hpp:61
Definition unpack_exception.hpp:88
Definition unpack_exception.hpp:106
Definition unpack_exception.hpp:97
Definition unpack_exception.hpp:43
Definition unpack_exception.hpp:70
uint32_t size
Definition object_fwd.hpp:23
msgpack::object * ptr
Definition object_fwd.hpp:24
uint32_t size
Definition object_fwd.hpp:38
const char * ptr
Definition object_fwd.hpp:39
const char * ptr
Definition object_fwd.hpp:46
uint32_t size
Definition object_fwd.hpp:45
Definition object.hpp:30
uint32_t size
Definition object_fwd.hpp:28
msgpack::object_kv * ptr
Definition object_fwd.hpp:29
const char * ptr
Definition object_fwd.hpp:34
uint32_t size
Definition object_fwd.hpp:33
Object class that corresponding to MessagePack format object.
Definition object_fwd.hpp:77
union_type via
Definition object_fwd.hpp:95
msgpack::type::object_type type
Definition object_fwd.hpp:94
Definition unpack_exception.hpp:34
Definition unpack_exception.hpp:79
bool boolean
Definition object_fwd.hpp:79
msgpack::object_array array
Definition object_fwd.hpp:87
msgpack::object_ext ext
Definition object_fwd.hpp:91
msgpack::object_str str
Definition object_fwd.hpp:89
uint64_t u64
Definition object_fwd.hpp:80
int64_t i64
Definition object_fwd.hpp:81
msgpack::object_bin bin
Definition object_fwd.hpp:90
double f64
Definition object_fwd.hpp:86
msgpack::object_map map
Definition object_fwd.hpp:88
#define MSGPACK_EMBED_STACK_SIZE
Definition unpack_define.hpp:16
#define MSGPACK_NULLPTR
Definition cpp_config_decl.hpp:85
#define MSGPACK_ZONE_ALIGNOF(type)
Definition cpp03_zone_decl.hpp:30
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition versioning.hpp:66