MessagePack for C++
unpack.hpp
Go to the documentation of this file.
1 //
2 // MessagePack for C++ deserializing routine
3 //
4 // Copyright (C) 2016 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_UNPACK_HPP
11 #define MSGPACK_V2_UNPACK_HPP
12 
13 #include "msgpack/unpack_decl.hpp"
15 #include "msgpack/v2/parse.hpp"
16 
17 namespace msgpack {
18 
22 
25  void set_zone(msgpack::zone& z) { m_z = &z; }
26  void operator()(char* buffer) {
28  }
30 };
31 
32 class unpacker : public parser<unpacker, zone_push_finalizer>,
35 public:
36  unpacker(unpack_reference_func f = &unpacker::default_reference_func,
37  void* user_data = MSGPACK_NULLPTR,
38  std::size_t initial_buffer_size = MSGPACK_UNPACKER_INIT_BUFFER_SIZE,
39  unpack_limit const& limit = unpack_limit())
40  :parser_t(m_finalizer, initial_buffer_size),
41  detail::create_object_visitor(f, user_data, limit),
42  m_z(new msgpack::zone),
43  m_finalizer(*m_z) {
44  set_zone(*m_z);
45  set_referenced(false);
46  }
47 
50 
63  bool next(msgpack::object_handle& result, bool& referenced);
64 
66 
77  bool next(msgpack::object_handle& result);
78  msgpack::zone* release_zone();
79  void reset_zone();
80  bool flush_zone();
81 private:
82  static bool default_reference_func(msgpack::type::object_type /*type*/, std::size_t /*len*/, void*) {
83  return true;
84  }
86  zone_push_finalizer m_finalizer;
87 };
88 
89 inline bool unpacker::next(msgpack::object_handle& result, bool& referenced) {
90  bool ret = parser_t::next();
91  if (ret) {
93  result.zone().reset( release_zone() );
94  result.set(data());
95  reset();
96  }
97  else {
98  result.zone().reset();
99  result.set(msgpack::object());
100  }
101  return ret;
102 }
103 
104 inline bool unpacker::next(msgpack::object_handle& result) {
105  bool referenced;
106  return next(result, referenced);
107 }
108 
110 {
111  if(!flush_zone()) {
112  return MSGPACK_NULLPTR;
113  }
114 
115  msgpack::zone* r = new msgpack::zone;
116  msgpack::zone* old = m_z.release();
117  m_z.reset(r);
118  set_zone(*m_z);
119  m_finalizer.set_zone(*m_z);
120 
121  return old;
122 }
123 
124 inline void unpacker::reset_zone()
125 {
126  m_z->clear();
127 }
128 
129 inline bool unpacker::flush_zone()
130 {
131  if(referenced()) {
132  try {
133  m_z->push_finalizer(&detail::decr_count, get_raw_buffer());
134  } catch (...) {
135  return false;
136  }
137  set_referenced(false);
138 
139  detail::incr_count(get_raw_buffer());
140  }
141 
142  return true;
143 }
144 
146  const char* data, std::size_t len, std::size_t& off, bool& referenced,
147  unpack_reference_func f, void* user_data,
148  unpack_limit const& limit
149 )
150 {
151  msgpack::object obj;
153  referenced = false;
154  std::size_t noff = off;
156  data, len, noff, *z, obj, referenced, f, user_data, limit);
157 
158  switch(ret) {
159  case PARSE_SUCCESS:
160  off = noff;
161  return msgpack::object_handle(obj, msgpack::move(z));
162  case PARSE_EXTRA_BYTES:
163  off = noff;
164  return msgpack::object_handle(obj, msgpack::move(z));
165  default:
166  break;
167  }
168  return msgpack::object_handle();
169 }
170 
172  const char* data, std::size_t len, std::size_t& off,
173  unpack_reference_func f, void* user_data,
174  unpack_limit const& limit)
175 {
176  bool referenced;
177  return msgpack::v2::unpack(data, len, off, referenced, f, user_data, limit);
178 }
179 
181  const char* data, std::size_t len, bool& referenced,
182  unpack_reference_func f, void* user_data,
183  unpack_limit const& limit)
184 {
185  std::size_t off = 0;
186  return msgpack::v2::unpack(data, len, off, referenced, f, user_data, limit);
187 }
188 
190  const char* data, std::size_t len,
191  unpack_reference_func f, void* user_data,
192  unpack_limit const& limit)
193 {
194  bool referenced;
195  std::size_t off = 0;
196  return msgpack::v2::unpack(data, len, off, referenced, f, user_data, limit);
197 }
198 
199 inline void unpack(
200  msgpack::object_handle& result,
201  const char* data, std::size_t len, std::size_t& off, bool& referenced,
202  unpack_reference_func f, void* user_data,
203  unpack_limit const& limit)
204 {
205  msgpack::object obj;
207  referenced = false;
208  std::size_t noff = off;
210  data, len, noff, *z, obj, referenced, f, user_data, limit);
211 
212  switch(ret) {
213  case PARSE_SUCCESS:
214  off = noff;
215  result.set(obj);
216  result.zone() = msgpack::move(z);
217  return;
218  case PARSE_EXTRA_BYTES:
219  off = noff;
220  result.set(obj);
221  result.zone() = msgpack::move(z);
222  return;
223  default:
224  return;
225  }
226 }
227 
228 inline void unpack(
229  msgpack::object_handle& result,
230  const char* data, std::size_t len, std::size_t& off,
231  msgpack::v2::unpack_reference_func f, void* user_data,
232  unpack_limit const& limit)
233 {
234  bool referenced;
235  msgpack::v2::unpack(result, data, len, off, referenced, f, user_data, limit);
236 }
237 
238 inline void unpack(
239  msgpack::object_handle& result,
240  const char* data, std::size_t len, bool& referenced,
241  unpack_reference_func f, void* user_data,
242  unpack_limit const& limit)
243 {
244  std::size_t off = 0;
245  msgpack::v2::unpack(result, data, len, off, referenced, f, user_data, limit);
246 }
247 
248 inline void unpack(
249  msgpack::object_handle& result,
250  const char* data, std::size_t len,
251  unpack_reference_func f, void* user_data,
252  unpack_limit const& limit)
253 {
254  bool referenced;
255  std::size_t off = 0;
256  msgpack::v2::unpack(result, data, len, off, referenced, f, user_data, limit);
257 }
258 
259 
260 inline msgpack::object unpack(
261  msgpack::zone& z,
262  const char* data, std::size_t len, std::size_t& off, bool& referenced,
263  unpack_reference_func f, void* user_data,
264  unpack_limit const& limit)
265 {
266  msgpack::object obj;
267  std::size_t noff = off;
268  referenced = false;
270  data, len, noff, z, obj, referenced, f, user_data, limit);
271 
272  switch(ret) {
273  case PARSE_SUCCESS:
274  off = noff;
275  return obj;
276  case PARSE_EXTRA_BYTES:
277  off = noff;
278  return obj;
279  default:
280  break;
281  }
282  return obj;
283 }
284 
285 inline msgpack::object unpack(
286  msgpack::zone& z,
287  const char* data, std::size_t len, std::size_t& off,
288  unpack_reference_func f, void* user_data,
289  unpack_limit const& limit)
290 {
291  bool referenced;
292  return msgpack::v2::unpack(z, data, len, off, referenced, f, user_data, limit);
293 }
294 
295 inline msgpack::object unpack(
296  msgpack::zone& z,
297  const char* data, std::size_t len, bool& referenced,
298  unpack_reference_func f, void* user_data,
299  unpack_limit const& limit)
300 {
301  std::size_t off = 0;
302  return msgpack::v2::unpack(z, data, len, off, referenced, f, user_data, limit);
303 }
304 
305 inline msgpack::object unpack(
306  msgpack::zone& z,
307  const char* data, std::size_t len,
308  unpack_reference_func f, void* user_data,
309  unpack_limit const& limit)
310 {
311  bool referenced;
312  std::size_t off = 0;
313  return msgpack::v2::unpack(z, data, len, off, referenced, f, user_data, limit);
314 }
315 
316 namespace detail {
317 
318 inline parse_return
319 unpack_imp(const char* data, std::size_t len, std::size_t& off,
320  msgpack::zone& result_zone, msgpack::object& result, bool& referenced,
322  unpack_limit const& limit = unpack_limit())
323 {
324  create_object_visitor v(f, user_data, limit);
325  v.set_zone(result_zone);
326  referenced = false;
327  v.set_referenced(referenced);
328  parse_return ret = parse_imp(data, len, off, v);
329  referenced = v.referenced();
330  result = v.data();
331  return ret;
332 }
333 
334 } // namespace detail
335 
336 
338 } // MSGPACK_API_VERSION_NAMESPACE(v2)
340 
341 } // namespace msgpack
342 
343 
344 #endif // MSGPACK_V2_UNPACK_HPP
bool next()
Unpack one msgpack::object.
Definition: parse.hpp:938
void incr_count(void *buffer)
Definition: unpack.hpp:248
Definition: unpack_decl.hpp:87
void set_zone(msgpack::zone &z)
Definition: unpack.hpp:25
msgpack::zone * m_z
Definition: unpack.hpp:29
#define MSGPACK_UNPACKER_INIT_BUFFER_SIZE
Definition: unpack_decl.hpp:43
parse_return
Definition: parse_return.hpp:23
parse_return unpack_imp(const char *data, std::size_t len, std::size_t &off, msgpack::zone &result_zone, msgpack::object &result, bool &referenced, unpack_reference_func f=MSGPACK_NULLPTR, void *user_data=MSGPACK_NULLPTR, unpack_limit const &limit=unpack_limit())
Definition: unpack.hpp:1339
void unpack(msgpack::object_handle &result, const char *data, std::size_t len, std::size_t &off, msgpack::v2::unpack_reference_func f, void *user_data, unpack_limit const &limit)
Definition: unpack.hpp:228
void set(msgpack::object const &obj)
Definition: object.hpp:63
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
detail::create_object_visitor & visitor()
Definition: unpack.hpp:48
void operator()(char *buffer)
Definition: unpack.hpp:26
bool referenced() const
Definition: create_object_visitor.hpp:63
Definition: adaptor_base.hpp:15
Definition: cpp03_zone.hpp:22
unpacker(unpack_reference_func f=&unpacker::default_reference_func, void *user_data=MSGPACK_NULLPTR, std::size_t initial_buffer_size=MSGPACK_UNPACKER_INIT_BUFFER_SIZE, unpack_limit const &limit=unpack_limit())
Definition: unpack.hpp:36
Definition: unpack.hpp:23
object_type
Definition: object_fwd_decl.hpp:28
void push_finalizer(void(*func)(void *), void *data)
Definition: cpp03_zone.hpp:294
void reset_zone()
Definition: unpack.hpp:1278
msgpack::zone * release_zone()
Definition: unpack.hpp:1264
void clear()
Definition: cpp03_zone.hpp:305
msgpack::object_handle unpack(const char *data, std::size_t len, std::size_t &off, bool &referenced, unpack_reference_func f, void *user_data, unpack_limit const &limit)
Unpack msgpack::object from a buffer.
Definition: unpack.hpp:1383
Object class that corresponding to MessagePack format object.
Definition: object_fwd.hpp:75
#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::unique_ptr< msgpack::zone > & zone()
Get unique_ptr reference of zone.
Definition: object.hpp:77
zone_push_finalizer(msgpack::zone &z)
Definition: unpack.hpp:24
void decr_count(void *buffer)
Definition: unpack.hpp:235
Unpacking class for a stream deserialization.
Definition: unpack.hpp:847
#define MSGPACK_NULLPTR
Definition: cpp_config_decl.hpp:35
T & move(T &t)
Definition: create_object_visitor.hpp:25
Parsing class for a stream deserialization.
Definition: parse.hpp:618
The class holds object and zone.
Definition: object.hpp:43