MessagePack for C++
unpack_decl.hpp
Go to the documentation of this file.
1 //
2 // MessagePack for C++ deserializing routine
3 //
4 // Copyright (C) 2008-2016 FURUHASHI Sadayuki and 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_V1_UNPACK_DECL_HPP
11 #define MSGPACK_V1_UNPACK_DECL_HPP
12 
13 #include "msgpack/versioning.hpp"
14 #include "msgpack/unpack_define.h"
15 #include "msgpack/object.hpp"
16 #include "msgpack/zone.hpp"
17 #include "msgpack/cpp_config.hpp"
18 #include "msgpack/sysdep.h"
19 
20 #include <memory>
21 #include <stdexcept>
22 
23 #if !defined(MSGPACK_USE_CPP03)
24 #include <atomic>
25 #endif
26 
27 
28 #if defined(_MSC_VER)
29 // avoiding confliction std::max, std::min, and macro in windows.h
30 #ifndef NOMINMAX
31 #define NOMINMAX
32 #endif
33 #endif // defined(_MSC_VER)
34 
35 #ifdef _msgpack_atomic_counter_header
36 #include _msgpack_atomic_counter_header
37 #endif
38 
39 const size_t COUNTER_SIZE = sizeof(_msgpack_atomic_counter_t);
40 
41 #ifndef MSGPACK_UNPACKER_INIT_BUFFER_SIZE
42 #define MSGPACK_UNPACKER_INIT_BUFFER_SIZE (64*1024)
43 #endif
44 
45 #ifndef MSGPACK_UNPACKER_RESERVE_SIZE
46 #define MSGPACK_UNPACKER_RESERVE_SIZE (32*1024)
47 #endif
48 
49 
50 // backward compatibility
51 #ifndef MSGPACK_UNPACKER_DEFAULT_INITIAL_BUFFER_SIZE
52 #define MSGPACK_UNPACKER_DEFAULT_INITIAL_BUFFER_SIZE MSGPACK_UNPACKER_INIT_BUFFER_SIZE
53 #endif
54 
55 
56 namespace msgpack {
57 
61 
63 
73 typedef bool (*unpack_reference_func)(msgpack::type::object_type type, std::size_t size, void* user_data);
74 
75 struct unpack_error;
76 struct parse_error;
77 struct insufficient_bytes;
78 struct size_overflow;
79 struct array_size_overflow;
80 struct map_size_overflow;
81 struct str_size_overflow;
82 struct bin_size_overflow;
83 struct ext_size_overflow;
84 struct depth_size_overflow;
85 
86 class unpack_limit {
87 public:
89  std::size_t array = 0xffffffff,
90  std::size_t map = 0xffffffff,
91  std::size_t str = 0xffffffff,
92  std::size_t bin = 0xffffffff,
93  std::size_t ext = 0xffffffff,
94  std::size_t depth = 0xffffffff)
95  :array_(array),
96  map_(map),
97  str_(str),
98  bin_(bin),
99  ext_(ext),
100  depth_(depth) {}
101  std::size_t array() const { return array_; }
102  std::size_t map() const { return map_; }
103  std::size_t str() const { return str_; }
104  std::size_t bin() const { return bin_; }
105  std::size_t ext() const { return ext_; }
106  std::size_t depth() const { return depth_; }
107 
108 private:
109  std::size_t array_;
110  std::size_t map_;
111  std::size_t str_;
112  std::size_t bin_;
113  std::size_t ext_;
114  std::size_t depth_;
115 };
116 
117 namespace detail {
118 
119 class unpack_user;
120 
121 void unpack_uint8(uint8_t d, msgpack::object& o);
122 
123 void unpack_uint16(uint16_t d, msgpack::object& o);
124 
125 void unpack_uint32(uint32_t d, msgpack::object& o);
126 
127 void unpack_uint64(uint64_t d, msgpack::object& o);
128 
129 void unpack_int8(int8_t d, msgpack::object& o);
130 
131 void unpack_int16(int16_t d, msgpack::object& o);
132 
133 void unpack_int32(int32_t d, msgpack::object& o);
134 
135 void unpack_int64(int64_t d, msgpack::object& o);
136 
137 void unpack_float(float d, msgpack::object& o);
138 
139 void unpack_double(double d, msgpack::object& o);
140 
141 void unpack_nil(msgpack::object& o);
142 
144 
146 
147 struct unpack_array;
148 
150 
151 struct unpack_map;
152 
154 
155 void unpack_str(unpack_user& u, const char* p, uint32_t l, msgpack::object& o);
156 
157 void unpack_bin(unpack_user& u, const char* p, uint32_t l, msgpack::object& o);
158 
159 void unpack_ext(unpack_user& u, const char* p, std::size_t l, msgpack::object& o);
160 
161 class unpack_stack;
162 
163 void init_count(void* buffer);
164 
165 void decr_count(void* buffer);
166 
167 void incr_count(void* buffer);
168 
169 #if defined(MSGPACK_USE_CPP03)
170 
171 _msgpack_atomic_counter_t get_count(void* buffer);
172 
173 #else // defined(MSGPACK_USE_CPP03)
174 
175 std::atomic<unsigned int> const& get_count(void* buffer);
176 
177 #endif // defined(MSGPACK_USE_CPP03)
178 
179 struct fix_tag {
180  char f1[65]; // FIXME unique size is required. or use is_same meta function.
181 };
182 
183 template <typename T>
184 struct value;
185 
186 template <typename T>
187 typename msgpack::enable_if<sizeof(T) == sizeof(fix_tag)>::type load(uint32_t& dst, const char* n);
188 
189 template <typename T>
190 typename msgpack::enable_if<sizeof(T) == 1>::type load(T& dst, const char* n);
191 
192 template <typename T>
193 typename msgpack::enable_if<sizeof(T) == 2>::type load(T& dst, const char* n);
194 
195 template <typename T>
196 typename msgpack::enable_if<sizeof(T) == 4>::type load(T& dst, const char* n);
197 
198 template <typename T>
199 typename msgpack::enable_if<sizeof(T) == 8>::type load(T& dst, const char* n);
200 
201 class context;
202 
203 } // detail
204 
205 
207 
209 class unpacker;
210 
212 
225  const char* data, std::size_t len, std::size_t& off, bool& referenced,
226  unpack_reference_func f = nullptr, void* user_data = nullptr, unpack_limit const& limit = unpack_limit());
227 
229 
241  const char* data, std::size_t len, std::size_t& off,
242  unpack_reference_func f = nullptr, void* user_data = nullptr, unpack_limit const& limit = unpack_limit());
243 
245 
257  const char* data, std::size_t len, bool& referenced,
258  unpack_reference_func f = nullptr, void* user_data = nullptr, unpack_limit const& limit = unpack_limit());
259 
261 
272  const char* data, std::size_t len,
273  unpack_reference_func f = nullptr, void* user_data = nullptr, unpack_limit const& limit = unpack_limit());
274 
275 
277 
289 void unpack(
290  object_handle& result,
291  const char* data, std::size_t len, std::size_t& off, bool& referenced,
292  unpack_reference_func f = nullptr, void* user_data = nullptr, unpack_limit const& limit = unpack_limit());
293 
295 
306 void unpack(
307  object_handle& result,
308  const char* data, std::size_t len, std::size_t& off,
309  unpack_reference_func f = nullptr, void* user_data = nullptr, unpack_limit const& limit = unpack_limit());
310 
312 
323 void unpack(
324  object_handle& result,
325  const char* data, std::size_t len, bool& referenced,
326  unpack_reference_func f = nullptr, void* user_data = nullptr, unpack_limit const& limit = unpack_limit());
327 
329 
339 void unpack(
340  object_handle& result,
341  const char* data, std::size_t len,
342  unpack_reference_func f = nullptr, void* user_data = nullptr, unpack_limit const& limit = unpack_limit());
343 
345 
359  msgpack::zone& z,
360  const char* data, std::size_t len, std::size_t& off, bool& referenced,
361  unpack_reference_func f = nullptr, void* user_data = nullptr, unpack_limit const& limit = unpack_limit());
362 
364 
377  msgpack::zone& z,
378  const char* data, std::size_t len, std::size_t& off,
379  unpack_reference_func f = nullptr, void* user_data = nullptr, unpack_limit const& limit = unpack_limit());
380 
382 
395  msgpack::zone& z,
396  const char* data, std::size_t len, bool& referenced,
397  unpack_reference_func f = nullptr, void* user_data = nullptr, unpack_limit const& limit = unpack_limit());
398 
400 
412  msgpack::zone& z,
413  const char* data, std::size_t len,
414  unpack_reference_func f = nullptr, void* user_data = nullptr, unpack_limit const& limit = unpack_limit());
415 
416 
418 
430 void unpack(
431  object_handle* result,
432  const char* data, std::size_t len, std::size_t* off = nullptr, bool* referenced = nullptr,
433  unpack_reference_func f = nullptr, void* user_data = nullptr, unpack_limit const& limit = unpack_limit());
434 
435 
436 // for internal use
437 typedef enum {
442 } unpack_return;
443 
444 namespace detail {
445 
447 unpack_imp(const char* data, std::size_t len, std::size_t& off,
448  msgpack::zone& result_zone, msgpack::object& result, bool& referenced,
449  unpack_reference_func f, void* user_data,
450  unpack_limit const& limit);
451 
452 } // detail
453 
454 
456 } // MSGPACK_API_VERSION_NAMESPACE(v1)
458 
459 } // namespace msgpack
460 
461 #endif // MSGPACK_V1_UNPACK_DECL_HPP
unpack_return
Definition: unpack_decl.hpp:437
std::size_t array() const
Definition: unpack_decl.hpp:101
std::atomic< unsigned int > const & get_count(void *buffer)
Definition: unpack.hpp:345
void unpack_int8(int8_t d, msgpack::object &o)
Definition: unpack.hpp:170
void incr_count(void *buffer)
Definition: unpack.hpp:330
Definition: unpack_decl.hpp:86
Definition: unpack.hpp:96
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:1464
std::size_t ext() const
Definition: unpack_decl.hpp:105
Definition: unpack_decl.hpp:439
void unpack_ext(unpack_user &u, const char *p, std::size_t l, msgpack::object &o)
Definition: unpack.hpp:272
void unpack_uint32(uint32_t d, msgpack::object &o)
Definition: unpack.hpp:164
void unpack_str(unpack_user &u, const char *p, uint32_t l, msgpack::object &o)
Definition: unpack.hpp:240
Definition: unpack.hpp:42
std::size_t depth() const
Definition: unpack_decl.hpp:106
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:73
Definition: unpack.hpp:123
object_handle unpacked
Definition: unpack_decl.hpp:206
void unpack_int16(int16_t d, msgpack::object &o)
Definition: unpack.hpp:174
void unpack_bin(unpack_user &u, const char *p, uint32_t l, msgpack::object &o)
Definition: unpack.hpp:256
void unpack_uint8(uint8_t d, msgpack::object &o)
Definition: unpack.hpp:158
Definition: adaptor_base.hpp:15
Definition: unpack.hpp:51
Definition: unpack.hpp:114
unpack_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=nullptr, void *user_data=nullptr, unpack_limit const &limit=unpack_limit())
Definition: unpack.hpp:1420
Definition: cpp03_zone.hpp:22
void unpack_false(msgpack::object &o)
Definition: unpack.hpp:198
object_type
Definition: object_fwd_decl.hpp:28
unpack_limit(std::size_t array=0xffffffff, std::size_t map=0xffffffff, std::size_t str=0xffffffff, std::size_t bin=0xffffffff, std::size_t ext=0xffffffff, std::size_t depth=0xffffffff)
Definition: unpack_decl.hpp:88
Definition: unpack_decl.hpp:440
Definition: unpack_decl.hpp:438
Definition: unpack.hpp:69
Definition: unpack.hpp:385
void unpack_float(float d, msgpack::object &o)
Definition: unpack.hpp:186
Definition: unpack.hpp:105
void init_count(void *buffer)
Definition: unpack.hpp:308
void unpack_double(double d, msgpack::object &o)
Definition: unpack.hpp:189
void unpack_uint64(uint64_t d, msgpack::object &o)
Definition: unpack.hpp:167
Definition: unpack.hpp:60
msgpack::enable_if< sizeof(T)==sizeof(fix_tag)>::type load(uint32_t &dst, const char *n)
Definition: unpack.hpp:361
Definition: unpack.hpp:78
void unpack_int64(int64_t d, msgpack::object &o)
Definition: unpack.hpp:182
void unpack_uint16(uint16_t d, msgpack::object &o)
Definition: unpack.hpp:161
void unpack_true(msgpack::object &o)
Definition: unpack.hpp:195
std::size_t bin() const
Definition: unpack_decl.hpp:104
const size_t COUNTER_SIZE
Definition: unpack_decl.hpp:39
Definition: cpp_config_decl.hpp:52
Object class that corresponding to MessagePack format object.
Definition: object_fwd.hpp:75
Definition: unpack.hpp:87
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition: versioning.hpp:58
Definition: unpack_decl.hpp:441
void unpack_nil(msgpack::object &o)
Definition: unpack.hpp:192
std::size_t map() const
Definition: unpack_decl.hpp:102
void unpack_map_item(msgpack::object &c, msgpack::object const &k, msgpack::object const &v)
Definition: unpack.hpp:228
void decr_count(void *buffer)
Definition: unpack.hpp:317
Unpacking class for a stream deserialization.
Definition: unpack.hpp:929
Definition: unpack_decl.hpp:179
void unpack_int32(int32_t d, msgpack::object &o)
Definition: unpack.hpp:178
void unpack_array_item(msgpack::object &c, msgpack::object const &o)
Definition: unpack.hpp:210
Definition: unpack.hpp:352
std::size_t str() const
Definition: unpack_decl.hpp:103
The class holds object and zone.
Definition: object.hpp:43