10#ifndef MSGPACK_V2_UNPACK_HPP
11#define MSGPACK_V2_UNPACK_HPP
13#if MSGPACK_DEFAULT_API_VERSION >= 2
26struct zone_push_finalizer {
27 zone_push_finalizer(msgpack::zone& z):m_z(&z) {}
28 void set_zone(msgpack::zone& z) { m_z = &z; }
29 void operator()(
char* buffer) {
37 typedef parser<unpacker, zone_push_finalizer> parser_t;
42 unpack_limit
const& limit = unpack_limit())
43 :parser_t(m_finalizer, initial_buffer_size),
44 detail::create_object_visitor(f, user_data, limit),
45 m_z(new msgpack::zone),
48 set_referenced(
false);
51#if !defined(MSGPACK_USE_CPP03)
53 :parser_t(std::move(other)),
54 detail::create_object_visitor(std::move(other)),
55 m_z(std::move(other.m_z)),
56 m_finalizer(std::move(other.m_finalizer)) {
61 parser_t::set_referenced_buffer_hook(m_finalizer);
66 new (
this)
unpacker(std::move(other));
72 detail::create_object_visitor& visitor() {
return *
this; }
87 bool next(msgpack::object_handle& result,
bool& referenced);
101 bool next(msgpack::object_handle& result);
109 msgpack::unique_ptr<msgpack::zone> m_z;
110 zone_push_finalizer m_finalizer;
113inline bool unpacker::next(msgpack::object_handle& result,
bool& referenced) {
114 bool ret = parser_t::next();
122 result.
zone().reset();
123 result.
set(msgpack::object());
130 return next(result, referenced);
139 msgpack::zone* r =
new msgpack::zone;
140 msgpack::zone* old = m_z.release();
143 m_finalizer.set_zone(*m_z);
153inline bool unpacker::flush_zone()
161 set_referenced(
false);
169inline msgpack::object_handle
unpack(
170 const char* data, std::size_t len, std::size_t& off,
bool& referenced,
176 msgpack::unique_ptr<msgpack::zone> z(
new msgpack::zone);
178 std::size_t noff = off;
180 data, len, noff, *z, obj, referenced, f, user_data, limit);
185 return msgpack::object_handle(obj, msgpack::move(z));
188 return msgpack::object_handle(obj, msgpack::move(z));
192 return msgpack::object_handle();
195inline msgpack::object_handle
unpack(
196 const char* data, std::size_t len, std::size_t& off,
201 return msgpack::v2::unpack(data, len, off, referenced, f, user_data, limit);
204inline msgpack::object_handle
unpack(
205 const char* data, std::size_t len,
bool& referenced,
210 return msgpack::v2::unpack(data, len, off, referenced, f, user_data, limit);
213inline msgpack::object_handle
unpack(
214 const char* data, std::size_t len,
220 return msgpack::v2::unpack(data, len, off, referenced, f, user_data, limit);
224 msgpack::object_handle& result,
225 const char* data, std::size_t len, std::size_t& off,
bool& referenced,
230 msgpack::unique_ptr<msgpack::zone> z(
new msgpack::zone);
232 std::size_t noff = off;
234 data, len, noff, *z, obj, referenced, f, user_data, limit);
240 result.
zone() = msgpack::move(z);
245 result.
zone() = msgpack::move(z);
253 msgpack::object_handle& result,
254 const char* data, std::size_t len, std::size_t& off,
259 msgpack::v2::unpack(result, data, len, off, referenced, f, user_data, limit);
263 msgpack::object_handle& result,
264 const char* data, std::size_t len,
bool& referenced,
269 msgpack::v2::unpack(result, data, len, off, referenced, f, user_data, limit);
273 msgpack::object_handle& result,
274 const char* data, std::size_t len,
280 msgpack::v2::unpack(result, data, len, off, referenced, f, user_data, limit);
284inline msgpack::object
unpack(
286 const char* data, std::size_t len, std::size_t& off,
bool& referenced,
291 std::size_t noff = off;
294 data, len, noff, z, obj, referenced, f, user_data, limit);
309inline msgpack::object
unpack(
311 const char* data, std::size_t len, std::size_t& off,
316 return msgpack::v2::unpack(z, data, len, off, referenced, f, user_data, limit);
319inline msgpack::object
unpack(
321 const char* data, std::size_t len,
bool& referenced,
326 return msgpack::v2::unpack(z, data, len, off, referenced, f, user_data, limit);
329inline msgpack::object
unpack(
331 const char* data, std::size_t len,
337 return msgpack::v2::unpack(z, data, len, off, referenced, f, user_data, limit);
343unpack_imp(
const char* data, std::size_t len, std::size_t& off,
344 msgpack::zone& result_zone, msgpack::object& result,
bool& referenced,
346 unpack_limit
const& limit = unpack_limit())
349 v.set_zone(result_zone);
351 v.set_referenced(referenced);
353 referenced = v.referenced();
Definition create_object_visitor.hpp:27
bool referenced() const
Definition create_object_visitor.hpp:67
void set(msgpack::object const &obj)
Definition object.hpp:64
msgpack::unique_ptr< msgpack::zone > & zone()
Get unique_ptr reference of zone.
Definition object.hpp:90
Parsing class for a stream deserialization.
Definition parse_decl.hpp:32
Definition unpack_decl.hpp:87
Unpacking class for a stream deserialization.
Definition unpack.hpp:862
msgpack::zone * release_zone()
Definition unpack.hpp:1286
void reset_zone()
Definition unpack.hpp:1300
~unpacker()
Definition unpack.hpp:1118
msgpack::object const & data()
Definition unpack.hpp:1281
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())
Constructor.
Definition unpack.hpp:1063
void reset()
Definition unpack.hpp:1321
unpacker & operator=(unpacker &&other)
Definition unpack.hpp:1107
bool next(msgpack::object_handle *result)
Unpack one msgpack::object. [obsolete].
Definition unpack.hpp:1253
void clear()
Definition cpp03_zone.hpp:325
void push_finalizer(void(*func)(void *), void *data)
Definition cpp03_zone.hpp:314
Definition check_container_size.hpp:31
parse_return parse_imp(const char *data, size_t len, size_t &off, Visitor &v)
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:1361
void decr_count(void *buffer)
Definition unpack.hpp:250
void incr_count(void *buffer)
Definition unpack.hpp:263
object_type
Definition object_fwd_decl.hpp:27
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
parse_return
Definition parse_return.hpp:23
@ PARSE_EXTRA_BYTES
Definition parse_return.hpp:25
@ PARSE_SUCCESS
Definition parse_return.hpp:24
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:1405
#define MSGPACK_NULLPTR
Definition cpp_config_decl.hpp:85
#define MSGPACK_UNPACKER_INIT_BUFFER_SIZE
Definition unpack_decl.hpp:43
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition versioning.hpp:66