10#ifndef MSGPACK_V1_OBJECT_HPP
11#define MSGPACK_V1_OBJECT_HPP
57 msgpack::unique_ptr<msgpack::zone> z
59 msgpack::unique_ptr<msgpack::zone>&& z
62 m_obj(obj), m_zone(
msgpack::move(z)) { }
90 msgpack::unique_ptr<msgpack::zone>&
zone()
97 const msgpack::unique_ptr<msgpack::zone>&
zone()
const
100#if defined(MSGPACK_USE_CPP03)
101 struct object_handle_ref {
108 m_zone(
msgpack::move(other.m_zone)) {
112 m_obj(ref.m_oh->m_obj),
113 m_zone(
msgpack::move(ref.m_oh->m_zone)) {
118 m_zone = msgpack::move(other.m_zone);
123 m_obj = ref.m_oh->m_obj;
124 m_zone = msgpack::move(ref.m_oh->m_zone);
128 operator object_handle_ref() {
129 return object_handle_ref(
this);
135 msgpack::unique_ptr<msgpack::zone> m_zone;
140template <std::
size_t N>
141inline std::size_t add_ext_type_size(std::size_t size) {
146inline std::size_t add_ext_type_size<4>(std::size_t size) {
147 return size == 0xffffffff ? size : size + 1;
160 : rest(r), is_map(
false), is_key(
false) {
165 : rest(r), is_map(
true), is_key(
true) {
172 return as.kv_ptr->key;
175 return as.kv_ptr->val;
183 template <
typename Visitor>
184 next_ret next(Visitor& v) {
187 if (!v.end_map())
return abort;
190 if (!v.end_array())
return abort;
197 if (!v.end_map_key())
return abort;
198 if (!v.start_map_value())
return abort;
202 if (!v.end_map_value())
return abort;
205 if (!v.end_map())
return abort;
208 if (!v.start_map_key())
return abort;
214 if (!v.end_array_item())
return abort;
217 if (!v.end_array())
return abort;
220 if (!v.start_array_item())
return abort;
237 template <
typename Visitor>
240 bool start_collection =
false;
241 switch(m_current->
type) {
242 case msgpack::type::NIL:
243 if (!v.visit_nil())
return;
245 case msgpack::type::BOOLEAN:
246 if (!v.visit_boolean(m_current->
via.
boolean))
return;
248 case msgpack::type::POSITIVE_INTEGER:
249 if (!v.visit_positive_integer(m_current->
via.
u64))
return;
251 case msgpack::type::NEGATIVE_INTEGER:
252 if (!v.visit_negative_integer(m_current->
via.
i64))
return;
254 case msgpack::type::FLOAT32:
255 if (!v.visit_float32(
static_cast<float>(m_current->
via.
f64)))
return;
257 case msgpack::type::FLOAT64:
258 if (!v.visit_float64(m_current->
via.
f64))
return;
260 case msgpack::type::STR:
263 case msgpack::type::BIN:
266 case msgpack::type::EXT:
267 msgpack::detail::check_container_size<sizeof(std::size_t)>(m_current->
via.
ext.
size);
270 case msgpack::type::ARRAY:
274 if (start_collection) {
275 if (!v.start_array_item())
return;
278 case msgpack::type::MAP:
279 if (!v.start_map(m_current->
via.
map.
size))
return;
281 start_collection = m_current->
via.
map.
size != 0;
282 if (start_collection) {
283 if (!v.start_map_key())
return;
290 if (m_ctx.empty())
return;
291 if (!start_collection) {
293 next_ret r = m_ctx.back().next(v);
296 if (m_ctx.empty())
return;
298 else if (r == cont) {
307 m_current = &m_ctx.back().get();
312 std::vector<elem> m_ctx;
315template <
typename Stream>
324 if (v) m_packer.pack_true();
325 else m_packer.pack_false();
329 m_packer.pack_uint64(v);
333 m_packer.pack_int64(v);
337 m_packer.pack_float(v);
341 m_packer.pack_double(v);
345 m_packer.pack_str(size);
346 m_packer.pack_str_body(v, size);
350 m_packer.pack_bin(size);
351 m_packer.pack_bin_body(v, size);
355 m_packer.pack_ext(size - 1,
static_cast<int8_t
>(*v));
356 m_packer.pack_ext_body(v + 1, size - 1);
360 m_packer.pack_array(num_elements);
373 m_packer.pack_map(num_kv_pairs);
404 if (v) m_os <<
"true";
405 else m_os <<
"false";
426 for (uint32_t i = 0; i < size; ++i) {
454 unsigned int code =
static_cast<unsigned int>(c);
455 if (code < 0x20 || code == 0x7f) {
456 std::ios::fmtflags flags(m_os.flags());
457 m_os <<
"\\u" << std::hex << std::setw(4) << std::setfill(
'0') << (code & 0xff);
470 m_os <<
"\"BIN(size:" << size <<
")\"";
475 m_os <<
"\"EXT(size:0)\"";
478 m_os <<
"\"EXT(type:" <<
static_cast<int>(v[0]) <<
",size:" << size - 1 <<
")\"";
483 m_current_size.push_back(num_elements);
491 --m_current_size.back();
492 if (m_current_size.back() != 0) {
498 m_current_size.pop_back();
503 m_current_size.push_back(num_kv_pairs);
518 --m_current_size.back();
519 if (m_current_size.back() != 0) {
525 m_current_size.pop_back();
531 std::vector<uint32_t> m_current_size;
630inline object::implicit_type::operator T() {
return obj.as<T>(); }
633template <
typename Stream,
typename T>
634struct packer_serializer {
643template <
typename T,
typename Enabler>
651template <
typename T,
typename Enabler>
652template <
typename Stream>
656 return msgpack::detail::packer_serializer<Stream, T>::pack(o, v);
659template <
typename T,
typename Enabler>
679 template <
typename Stream>
690 object_with_zone_visitor vis(o);
694 struct object_with_zone_visitor {
696 :m_zone(owz.
zone), m_ptr(&owz) {
697 m_objs.push_back(&owz);
700 m_ptr->type = msgpack::type::NIL;
703 bool visit_boolean(
bool v) {
704 m_ptr->type = msgpack::type::BOOLEAN;
705 m_ptr->via.boolean = v;
708 bool visit_positive_integer(uint64_t v) {
713 bool visit_negative_integer(int64_t v) {
718 bool visit_float32(
float v) {
723 bool visit_float64(
double v) {
728 bool visit_str(
const char* v, uint32_t size) {
730 m_ptr->via.str.size =
size;
732 m_ptr->via.str.ptr = ptr;
733 std::memcpy(ptr, v, size);
736 bool visit_bin(
const char* v, uint32_t size) {
738 m_ptr->via.bin.size =
size;
740 m_ptr->via.bin.ptr = ptr;
741 std::memcpy(ptr, v, size);
744 bool visit_ext(
const char* v, uint32_t size) {
749 m_ptr->via.ext.size =
size - 1;
752 m_ptr->via.ext.ptr = ptr;
753 std::memcpy(ptr, v, size);
756 bool start_array(uint32_t num_elements) {
759 m_zone.allocate_align(
762 m_objs.push_back(elem(m_ptr->via.array.ptr));
765 bool start_array_item() {
766 m_ptr = m_objs.back().get_item();
769 bool end_array_item() {
770 ++m_objs.back().
as.obj;
777 bool start_map(uint32_t num_kv_pairs) {
781 m_ptr->via.map.size = num_kv_pairs;
782 m_objs.push_back(elem(m_ptr->via.map.ptr));
785 bool start_map_key() {
786 m_ptr = m_objs.back().get_key();
792 bool start_map_value() {
793 m_ptr = m_objs.back().get_val();
796 bool end_map_value() {
797 ++m_objs.back().as.kv;
829 std::vector<elem> m_objs;
842 o << static_cast<msgpack::object const&>(v);
851template <
typename Type>
859 template <
typename Packer>
862 msgpack::operator<<(o, static_cast<const msgpack_type&>(*
this));
873template <
typename Stream>
883 :m_ptr(&obj), m_result(result) {}
885 if (m_ptr->
type != msgpack::type::NIL) {
892 if (m_ptr->
type != msgpack::type::BOOLEAN || m_ptr->
via.
boolean != v) {
899 if (m_ptr->
type != msgpack::type::POSITIVE_INTEGER || m_ptr->
via.
u64 != v) {
906 if (m_ptr->
type != msgpack::type::NEGATIVE_INTEGER || m_ptr->
via.
i64 != v) {
913 if (m_ptr->
type != msgpack::type::FLOAT32 || m_ptr->
via.
f64 != v) {
920 if (m_ptr->
type != msgpack::type::FLOAT64 || m_ptr->
via.
f64 != v) {
927 if (m_ptr->
type != msgpack::type::STR ||
929 std::memcmp(m_ptr->
via.
str.
ptr, v, size) != 0) {
936 if (m_ptr->
type != msgpack::type::BIN ||
938 std::memcmp(m_ptr->
via.
bin.
ptr, v, size) != 0) {
945 if (m_ptr->
type != msgpack::type::EXT ||
947 std::memcmp(m_ptr->
via.
ext.
ptr, v, size) != 0) {
954 if (m_ptr->
type != msgpack::type::ARRAY ||
963 m_ptr = m_objs.back().get_item();
967 ++m_objs.back().as.obj;
975 if (m_ptr->
type != msgpack::type::MAP ||
980 m_objs.push_back(elem(m_ptr->
via.
map.
ptr));
984 m_ptr = m_objs.back().get_key();
991 m_ptr = m_objs.back().get_val();
995 ++m_objs.back().as.kv;
1027 std::vector<elem> m_objs;
1034 if(x.
type != y.
type) {
return false; }
1041template <
typename T>
1050{
return !(x == y); }
1052template <
typename T>
1056template <
typename T>
1058{
return !(x == y); }
1060template <
typename T>
1070template <
typename T>
1072typename msgpack::enable_if<
1073 !msgpack::is_array<T>::value && !msgpack::is_pointer<T>::value,
1082template <
typename T, std::
size_t N>
1089#if !defined(MSGPACK_DISABLE_LEGACY_CONVERT)
1090template <
typename T>
1092typename msgpack::enable_if<
1093 msgpack::is_pointer<T>::value,
1103template <
typename T>
1113#if defined(MSGPACK_USE_CPP03)
1115template <
typename T>
1125template <
typename T>
1126inline typename std::enable_if<msgpack::has_as<T>::value, T>::type
object::as()
const {
1130template <
typename T>
1131inline typename std::enable_if<!msgpack::has_as<T>::value, T>::type
object::as()
const {
1141 type = msgpack::type::NIL;
1144template <
typename T>
1150template <
typename T>
1157template <
typename T>
1166template <
typename T>
1177template <
typename T>
1184template <
typename Stream,
typename T>
1191template <
typename Stream,
typename T>
1197template <
typename Stream>
1200 object_pack_visitor<Stream> vis(o);
1205template <
typename Stream>
1208 return o << static_cast<msgpack::object>(v);
Definition object.hpp:852
define()
Definition object.hpp:856
define(const msgpack_type &v)
Definition object.hpp:857
void msgpack_pack(Packer &o) const
Definition object.hpp:860
void msgpack_unpack(object const &o)
Definition object.hpp:865
define< Type > define_type
Definition object.hpp:855
Type msgpack_type
Definition object.hpp:854
The class holds object and zone.
Definition object.hpp:44
object_handle(msgpack::object const &obj, msgpack::unique_ptr< msgpack::zone > &&z)
Constructor that creates an object_handle holding object obj and zone z.
Definition object.hpp:54
const msgpack::object & operator*() const
Definition object.hpp:77
const msgpack::object * operator->() const
Definition object.hpp:83
const msgpack::unique_ptr< msgpack::zone > & zone() const
Get unique_ptr const reference of zone.
Definition object.hpp:97
void set(msgpack::object const &obj)
Definition object.hpp:64
const msgpack::object & get() const
Get object reference.
Definition object.hpp:71
object_handle()
Constructor that creates nil object and null zone.
Definition object.hpp:47
msgpack::unique_ptr< msgpack::zone > & zone()
Get unique_ptr reference of zone.
Definition object.hpp:90
Definition object.hpp:151
void parse(Visitor &v)
Definition object.hpp:238
object_parser(msgpack::object const &obj)
Definition object.hpp:236
The class template that supports continuous packing.
Definition pack.hpp:33
packer< Stream > & pack(const T &v)
Packing function template.
Definition object_fwd.hpp:231
Definition cpp03_zone.hpp:30
#define MSGPACK_USE_CPP03
Definition cpp_version.hpp:9
std::size_t size(T const &t)
Definition size_equal_only.hpp:24
@ EXT
Definition object_fwd_decl.hpp:42
@ FLOAT64
Definition object_fwd_decl.hpp:33
@ MAP
Definition object_fwd_decl.hpp:41
@ 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
void pack(msgpack::packer< Stream > &o, const T &v)
Definition object.hpp:1185
std::size_t aligned_size(std::size_t size, std::size_t align)
Definition cpp03_zone.hpp:353
void pack_copy(msgpack::packer< Stream > &o, T v)
Definition object.hpp:1192
object_handle clone(msgpack::object const &obj)
clone object
Definition object.hpp:622
std::size_t aligned_zone_size(msgpack::object const &obj)
Definition object.hpp:607
msgpack::enable_if<!is_array< T >::value, msgpack::packer< Stream > & >::type operator<<(msgpack::packer< Stream > &o, T const &v)
Definition adaptor_base.hpp:72
msgpack::enable_if<!is_array< T >::value, msgpack::objectconst & >::type operator>>(msgpack::object const &o, T &v)
Definition adaptor_base.hpp:57
void convert(T &v, msgpack::object const &o)
Definition object.hpp:1178
Definition object_fwd_decl.hpp:61
msgpack::object const & operator()(msgpack::object const &o, msgpack::object &v) const
Definition object.hpp:671
Definition adaptor_base.hpp:27
msgpack::object const & operator()(msgpack::object const &o, T &v) const
Definition object.hpp:646
void operator()(msgpack::object::with_zone &o, msgpack::object const &v) const
Definition object.hpp:689
void operator()(msgpack::object::with_zone &o, msgpack::object::with_zone const &v) const
Definition object.hpp:839
Definition adaptor_base.hpp:43
void operator()(msgpack::object::with_zone &o, T const &v) const
Definition object.hpp:662
Definition adaptor_base.hpp:38
msgpack::packer< Stream > & operator()(msgpack::packer< Stream > &o, msgpack::object const &v) const
Definition object.hpp:680
Definition adaptor_base.hpp:32
msgpack::packer< Stream > & operator()(msgpack::packer< Stream > &o, T const &v) const
Definition object.hpp:655
Definition object.hpp:534
bool visit_nil()
Definition object.hpp:537
bool start_map(uint32_t num_kv_pairs)
Definition object.hpp:582
bool end_map()
Definition object.hpp:600
bool visit_ext(const char *, uint32_t size)
Definition object.hpp:563
bool start_map_key()
Definition object.hpp:588
bool start_map_value()
Definition object.hpp:594
bool visit_bin(const char *, uint32_t size)
Definition object.hpp:559
bool visit_float32(float)
Definition object.hpp:549
bool end_array()
Definition object.hpp:579
aligned_zone_size_visitor(std::size_t &s)
Definition object.hpp:535
bool start_array(uint32_t num_elements)
Definition object.hpp:567
bool visit_boolean(bool)
Definition object.hpp:540
bool start_array_item()
Definition object.hpp:573
bool visit_negative_integer(int64_t)
Definition object.hpp:546
bool visit_str(const char *, uint32_t size)
Definition object.hpp:555
bool end_array_item()
Definition object.hpp:576
bool end_map_key()
Definition object.hpp:591
bool end_map_value()
Definition object.hpp:597
bool visit_float64(double)
Definition object.hpp:552
bool visit_positive_integer(uint64_t)
Definition object.hpp:543
Definition object_fwd.hpp:233
with_zone(msgpack::zone &z)
Definition object.hpp:36
msgpack::zone & zone
Definition object.hpp:37
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
Definition object.hpp:881
bool start_map_key()
Definition object.hpp:983
bool visit_ext(const char *v, uint32_t size)
Definition object.hpp:944
bool end_array_item()
Definition object.hpp:966
bool visit_str(const char *v, uint32_t size)
Definition object.hpp:926
bool visit_boolean(bool v)
Definition object.hpp:891
bool visit_bin(const char *v, uint32_t size)
Definition object.hpp:935
bool start_map_value()
Definition object.hpp:990
bool start_array_item()
Definition object.hpp:962
bool visit_nil()
Definition object.hpp:884
bool visit_negative_integer(int64_t v)
Definition object.hpp:905
bool visit_positive_integer(uint64_t v)
Definition object.hpp:898
bool end_map_value()
Definition object.hpp:994
bool visit_float64(double v)
Definition object.hpp:919
bool start_map(uint32_t num_kv_pairs)
Definition object.hpp:974
bool start_array(uint32_t num_elements)
Definition object.hpp:953
bool visit_float32(float v)
Definition object.hpp:912
object_equal_visitor(msgpack::object const &obj, bool &result)
Definition object.hpp:882
bool end_map_key()
Definition object.hpp:987
bool end_array()
Definition object.hpp:970
bool end_map()
Definition object.hpp:998
const char * ptr
Definition object_fwd.hpp:46
uint32_t size
Definition object_fwd.hpp:45
msgpack::object val
Definition object.hpp:32
msgpack::object key
Definition object.hpp:31
uint32_t size
Definition object_fwd.hpp:28
msgpack::object_kv * ptr
Definition object_fwd.hpp:29
Definition object.hpp:316
bool start_map_value()
Definition object.hpp:382
object_pack_visitor(msgpack::packer< Stream > &pk)
Definition object.hpp:317
bool visit_float32(float v)
Definition object.hpp:336
bool start_array_item()
Definition object.hpp:363
bool visit_float64(double v)
Definition object.hpp:340
bool end_map_key()
Definition object.hpp:379
bool end_map()
Definition object.hpp:388
bool end_map_value()
Definition object.hpp:385
bool visit_boolean(bool v)
Definition object.hpp:323
bool end_array()
Definition object.hpp:369
bool visit_negative_integer(int64_t v)
Definition object.hpp:332
bool start_map(uint32_t num_kv_pairs)
Definition object.hpp:372
bool start_map_key()
Definition object.hpp:376
bool end_array_item()
Definition object.hpp:366
bool visit_bin(const char *v, uint32_t size)
Definition object.hpp:349
bool start_array(uint32_t num_elements)
Definition object.hpp:359
bool visit_positive_integer(uint64_t v)
Definition object.hpp:328
bool visit_ext(const char *v, uint32_t size)
Definition object.hpp:354
bool visit_nil()
Definition object.hpp:319
bool visit_str(const char *v, uint32_t size)
Definition object.hpp:344
const char * ptr
Definition object_fwd.hpp:34
uint32_t size
Definition object_fwd.hpp:33
Definition object.hpp:396
bool end_map_value()
Definition object.hpp:517
bool start_array(uint32_t num_elements)
Definition object.hpp:482
bool start_map_value()
Definition object.hpp:514
bool visit_bin(const char *, uint32_t size)
Definition object.hpp:469
bool visit_str(const char *v, uint32_t size)
Definition object.hpp:424
bool end_array()
Definition object.hpp:497
bool start_map(uint32_t num_kv_pairs)
Definition object.hpp:502
bool visit_boolean(bool v)
Definition object.hpp:403
bool visit_negative_integer(int64_t v)
Definition object.hpp:412
bool visit_float32(float v)
Definition object.hpp:416
object_stringize_visitor(std::ostream &os)
Definition object.hpp:397
bool end_array_item()
Definition object.hpp:490
bool start_map_key()
Definition object.hpp:507
bool end_map()
Definition object.hpp:524
bool visit_float64(double v)
Definition object.hpp:420
bool visit_ext(const char *v, uint32_t size)
Definition object.hpp:473
bool end_map_key()
Definition object.hpp:510
bool visit_positive_integer(uint64_t v)
Definition object.hpp:408
bool start_array_item()
Definition object.hpp:487
bool visit_nil()
Definition object.hpp:399
Object class that corresponding to MessagePack format object.
Definition object_fwd.hpp:75
msgpack::enable_if<!msgpack::is_array< T >::value &&!msgpack::is_pointer< T >::value, T & >::type convert(T &v) const
Convert the object.
Definition object.hpp:1076
object()
Default constructor. The object is set to nil.
Definition object.hpp:1139
std::enable_if< msgpack::has_as< T >::value, T >::type as() const
Get value as T.
Definition object.hpp:1126
implicit_type convert() const
Definition object.hpp:1065
union_type via
Definition object_fwd.hpp:93
bool convert_if_not_nil(T &v) const
Convert the object if not nil.
Definition object.hpp:1104
msgpack::type::object_type type
Definition object_fwd.hpp:92
bool is_nil() const
Cheking nil.
Definition object_fwd.hpp:99
object & operator=(const T &v)
Definition object.hpp:1151
bool boolean
Definition object_fwd.hpp:77
msgpack::object_array array
Definition object_fwd.hpp:85
msgpack::object_ext ext
Definition object_fwd.hpp:89
msgpack::object_str str
Definition object_fwd.hpp:87
uint64_t u64
Definition object_fwd.hpp:78
int64_t i64
Definition object_fwd.hpp:79
msgpack::object_bin bin
Definition object_fwd.hpp:88
double f64
Definition object_fwd.hpp:84
msgpack::object_map map
Definition object_fwd.hpp:86
#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