Go to the documentation of this file.
10 #ifndef MSGPACK_V1_OBJECT_HPP
11 #define MSGPACK_V1_OBJECT_HPP
100 #if defined(MSGPACK_USE_CPP03)
101 struct object_handle_ref {
112 m_obj(ref.m_oh->m_obj),
123 m_obj = ref.m_oh->m_obj;
128 operator object_handle_ref() {
129 return object_handle_ref(
this);
131 #endif // defined(MSGPACK_USE_CPP03)
140 template <std::
size_t N>
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) {
243 if (!v.visit_nil())
return;
246 if (!v.visit_boolean(m_current->
via.
boolean))
return;
249 if (!v.visit_positive_integer(m_current->
via.
u64))
return;
252 if (!v.visit_negative_integer(m_current->
via.
i64))
return;
255 if (!v.visit_float32(
static_cast<float>(m_current->
via.
f64)))
return;
258 if (!v.visit_float64(m_current->
via.
f64))
return;
267 msgpack::detail::check_container_size<sizeof(std::size_t)>(m_current->
via.
ext.
size);
274 if (start_collection) {
275 if (!v.start_array_item())
return;
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;
315 template <
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, *v);
356 m_packer.pack_ext_body(v,
size);
360 m_packer.pack_array(num_elements);
373 m_packer.pack_array(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 <<
'"').write(v,
size) <<
'"';
478 m_current_size.push_back(num_elements);
486 --m_current_size.back();
487 if (m_current_size.back() != 0) {
493 m_current_size.pop_back();
498 m_current_size.push_back(num_kv_pairs);
513 --m_current_size.back();
514 if (m_current_size.back() != 0) {
520 m_current_size.pop_back();
526 std::vector<uint32_t> m_current_size;
624 template <
typename T>
625 inline object::implicit_type::operator T() {
return obj.as<T>(); }
628 template <
typename Stream,
typename T>
638 template <
typename T,
typename Enabler>
646 template <
typename T,
typename Enabler>
647 template <
typename Stream>
654 template <
typename T,
typename Enabler>
674 template <
typename Stream>
685 object_with_zone_visitor vis(o);
689 struct object_with_zone_visitor {
691 :m_zone(owz.
zone), m_ptr(&owz) {
692 m_objs.push_back(&owz);
698 bool visit_boolean(
bool v) {
700 m_ptr->via.boolean = v;
703 bool visit_positive_integer(uint64_t v) {
708 bool visit_negative_integer(int64_t v) {
713 bool visit_float32(
float v) {
718 bool visit_float64(
double v) {
723 bool visit_str(
const char* v, uint32_t
size) {
725 m_ptr->via.str.size =
size;
727 m_ptr->via.str.ptr = ptr;
728 std::memcpy(ptr, v,
size);
731 bool visit_bin(
const char* v, uint32_t
size) {
733 m_ptr->via.bin.size =
size;
735 m_ptr->via.bin.ptr = ptr;
736 std::memcpy(ptr, v,
size);
739 bool visit_ext(
const char* v, uint32_t
size) {
744 m_ptr->via.ext.size =
size - 1;
747 m_ptr->via.ext.ptr = ptr;
748 std::memcpy(ptr, v,
size);
751 bool start_array(uint32_t num_elements) {
754 m_zone.allocate_align(
757 m_objs.push_back(elem(m_ptr->via.array.ptr));
760 bool start_array_item() {
761 m_ptr = m_objs.back().get_item();
764 bool end_array_item() {
765 ++m_objs.back().
as.obj;
772 bool start_map(uint32_t num_kv_pairs) {
776 m_ptr->via.map.size = num_kv_pairs;
777 m_objs.push_back(elem(m_ptr->via.map.ptr));
780 bool start_map_key() {
781 m_ptr = m_objs.back().get_key();
787 bool start_map_value() {
788 m_ptr = m_objs.back().get_val();
791 bool end_map_value() {
792 ++m_objs.back().as.kv;
824 std::vector<elem> m_objs;
837 o << static_cast<msgpack::object const&>(v);
846 template <
typename Type>
854 template <
typename Packer>
857 msgpack::operator<<(o, static_cast<const msgpack_type&>(*
this));
868 template <
typename Stream>
869 template <
typename T>
878 :m_ptr(&obj), m_result(result) {}
958 m_ptr = m_objs.back().get_item();
962 ++m_objs.back().as.obj;
975 m_objs.push_back(elem(m_ptr->
via.
map.
ptr));
979 m_ptr = m_objs.back().get_key();
986 m_ptr = m_objs.back().get_val();
990 ++m_objs.back().as.kv;
1022 std::vector<elem> m_objs;
1029 if(x.
type != y.
type) {
return false; }
1036 template <
typename T>
1045 {
return !(x == y); }
1047 template <
typename T>
1051 template <
typename T>
1053 {
return !(x == y); }
1055 template <
typename T>
1065 template <
typename T>
1077 template <
typename T, std::
size_t N>
1084 #if !defined(MSGPACK_DISABLE_LEGACY_CONVERT)
1085 template <
typename T>
1096 #endif // !defined(MSGPACK_DISABLE_LEGACY_CONVERT)
1098 template <
typename T>
1108 #if defined(MSGPACK_USE_CPP03)
1110 template <
typename T>
1118 #else // defined(MSGPACK_USE_CPP03)
1120 template <
typename T>
1121 inline typename std::enable_if<msgpack::has_as<T>::value, T>::type
object::as()
const {
1125 template <
typename T>
1126 inline typename std::enable_if<!msgpack::has_as<T>::value, T>::type
object::as()
const {
1132 #endif // defined(MSGPACK_USE_CPP03)
1139 template <
typename T>
1145 template <
typename T>
1152 template <
typename T>
1161 template <
typename T>
1174 std::memcpy(
this, &o,
sizeof(o));
1180 std::memcpy(
static_cast<void*
>(&o), &v,
sizeof(v));
1183 inline object::operator msgpack_object()
const
1187 std::memcpy(&obj,
this,
sizeof(obj));
1193 template <
typename T>
1200 template <
typename Stream,
typename T>
1207 template <
typename Stream,
typename T>
1213 template <
typename Stream>
1221 template <
typename Stream>
1224 return o << static_cast<msgpack::object>(v);
1240 #endif // MSGPACK_V1_OBJECT_HPP
msgpack::enable_if< !is_array< T >::value, msgpack::object const & >::type operator>>(msgpack::object const &o, T &v)
Definition: adaptor_base.hpp:57
Definition: object.hpp:396
const msgpack::unique_ptr< msgpack::zone > & zone() const
Get unique_ptr const reference of zone.
Definition: object.hpp:97
void msgpack_unpack(object const &o)
Definition: object.hpp:860
object()
Default constructor. The object is set to nil.
Definition: object.hpp:1134
bool end_map_value()
Definition: object.hpp:989
bool visit_str(const char *v, uint32_t size)
Definition: object.hpp:921
bool visit_float32(float v)
Definition: object.hpp:907
@ STR
Definition: object_fwd_decl.hpp:39
bool operator!=(const msgpack::object &x, const msgpack::object &y)
Definition: object.hpp:1044
bool visit_boolean(bool v)
Definition: object.hpp:886
bool end_array_item()
Definition: object.hpp:366
bool end_map_value()
Definition: object.hpp:592
const char * ptr
Definition: object_fwd.hpp:39
The class template that supports continuous packing.
Definition: adaptor_base_decl.hpp:24
bool start_map(uint32_t num_kv_pairs)
Definition: object.hpp:372
int64_t i64
Definition: object_fwd.hpp:79
object_handle()
Constructor that creates nil object and null zone.
Definition: object.hpp:47
bool visit_float64(double v)
Definition: object.hpp:914
define(const msgpack_type &v)
Definition: object.hpp:852
const char * ptr
Definition: object_fwd.hpp:46
static msgpack::packer< Stream > & pack(msgpack::packer< Stream > &o, const T &v)
Definition: object.hpp:630
bool start_map_key()
Definition: object.hpp:978
define()
Definition: object.hpp:851
Definition: object.hpp:876
bool start_map_value()
Definition: object.hpp:382
Definition: adaptor_base.hpp:43
std::size_t add_ext_type_size(std::size_t size)
Definition: object.hpp:141
Definition: adaptor_base.hpp:15
#define MSGPACK_ZONE_ALIGNOF(type)
Definition: cpp03_zone_decl.hpp:30
Definition: cpp_config_decl.hpp:71
bool start_map(uint32_t num_kv_pairs)
Definition: object.hpp:969
bool start_array(uint32_t num_elements)
Definition: object.hpp:359
bool end_map()
Definition: object.hpp:595
const char * ptr
Definition: object_fwd.hpp:34
Definition: cpp_config_decl.hpp:56
Definition: adaptor_base.hpp:27
bool end_map()
Definition: object.hpp:993
bool start_map_key()
Definition: object.hpp:502
aligned_zone_size_visitor(std::size_t s)
Definition: object.hpp:530
bool end_array_item()
Definition: object.hpp:571
define< Type > define_type
Definition: object.hpp:850
bool visit_boolean(bool)
Definition: object.hpp:535
@ BIN
Definition: object_fwd_decl.hpp:40
bool visit_str(const char *v, uint32_t size)
Definition: object.hpp:424
bool start_array_item()
Definition: object.hpp:568
object_parser(msgpack::object const &obj)
Definition: object.hpp:236
bool visit_positive_integer(uint64_t v)
Definition: object.hpp:408
msgpack::unique_ptr< msgpack::zone > & zone()
Get unique_ptr reference of zone.
Definition: object.hpp:90
uint32_t size
Definition: object_fwd.hpp:38
bool operator==(const msgpack::object &x, const msgpack::object &y)
Definition: object.hpp:1027
msgpack::object key
Definition: object.hpp:31
bool visit_bin(const char *v, uint32_t size)
Definition: object.hpp:930
bool end_array()
Definition: object.hpp:492
msgpack::object const & operator()(msgpack::object const &o, msgpack::object &v) const
Definition: object.hpp:666
bool end_array()
Definition: object.hpp:574
@ FLOAT32
Definition: object_fwd_decl.hpp:33
msgpack::packer< Stream > & operator()(msgpack::packer< Stream > &o, msgpack::object const &v) const
Definition: object.hpp:675
bool start_array_item()
Definition: object.hpp:482
Definition: object.hpp:151
void set(msgpack::object const &obj)
Definition: object.hpp:64
uint32_t size
Definition: object_fwd.hpp:45
bool start_map(uint32_t num_kv_pairs)
Definition: object.hpp:497
Definition: object.hpp:629
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition: versioning.hpp:58
Definition: object.hpp:316
@ BOOLEAN
Definition: object_fwd_decl.hpp:30
union_type via
Definition: object_fwd.hpp:93
bool end_map_key()
Definition: object.hpp:982
with_zone(msgpack::zone &z)
Definition: object.hpp:36
Definition: cpp03_zone.hpp:22
bool visit_ext(const char *, uint32_t size)
Definition: object.hpp:558
bool visit_str(const char *v, uint32_t size)
Definition: object.hpp:344
object & operator=(const T &v)
Definition: object.hpp:1146
msgpack::object * ptr
Definition: object_fwd.hpp:24
void convert(T &v, msgpack::object const &o)
Definition: object.hpp:1194
void pack(msgpack::packer< Stream > &o, const T &v)
Definition: object.hpp:1201
bool visit_nil()
Definition: object.hpp:532
Type msgpack_type
Definition: object.hpp:849
void pack_copy(msgpack::packer< Stream > &o, T v)
Definition: object.hpp:1208
bool visit_nil()
Definition: object.hpp:879
object_equal_visitor(msgpack::object const &obj, bool &result)
Definition: object.hpp:877
bool visit_nil()
Definition: object.hpp:399
msgpack::object_map map
Definition: object_fwd.hpp:86
bool visit_bin(const char *v, uint32_t size)
Definition: object.hpp:469
bool visit_ext(const char *v, uint32_t size)
Definition: object.hpp:939
Definition: object_fwd_decl.hpp:62
bool end_map_key()
Definition: object.hpp:586
bool visit_float64(double v)
Definition: object.hpp:420
std::size_t add_ext_type_size< 4 >(std::size_t size)
Definition: object.hpp:146
Definition: adaptor_base.hpp:38
std::size_t aligned_size(std::size_t size, std::size_t align)
Definition: cpp03_zone.hpp:344
bool visit_positive_integer(uint64_t)
Definition: object.hpp:538
@ FLOAT64
Definition: object_fwd_decl.hpp:34
bool end_map_value()
Definition: object.hpp:385
bool visit_nil()
Definition: object.hpp:319
bool visit_boolean(bool v)
Definition: object.hpp:403
bool end_array()
Definition: object.hpp:369
std::size_t size(T const &t)
Definition: size_equal_only.hpp:24
bool start_array(uint32_t num_elements)
Definition: object.hpp:948
bool end_array()
Definition: object.hpp:965
#define MSGPACK_NULLPTR
Definition: cpp_config_decl.hpp:35
msgpack::enable_if< !is_array< T >::value, msgpack::packer< Stream > & >::type operator<<(msgpack::packer< Stream > &o, T const &v)
Definition: adaptor_base.hpp:72
bool end_map_key()
Definition: object.hpp:379
void msgpack_pack(Packer &o) const
Definition: object.hpp:855
uint32_t size
Definition: object_fwd.hpp:23
bool visit_positive_integer(uint64_t v)
Definition: object.hpp:893
bool start_array(uint32_t num_elements)
Definition: object.hpp:477
@ NEGATIVE_INTEGER
Definition: object_fwd_decl.hpp:32
msgpack::object_array array
Definition: object_fwd.hpp:85
bool end_map_key()
Definition: object.hpp:505
@ ARRAY
Definition: object_fwd_decl.hpp:41
bool end_array_item()
Definition: object.hpp:485
bool visit_negative_integer(int64_t)
Definition: object.hpp:541
bool visit_bin(const char *v, uint32_t size)
Definition: object.hpp:349
void parse(Visitor &v)
Definition: object.hpp:238
Definition: object.hpp:30
bool visit_negative_integer(int64_t v)
Definition: object.hpp:900
msgpack::object_ext ext
Definition: object_fwd.hpp:89
packer< Stream > & pack(const T &v)
Packing function template.
bool visit_str(const char *, uint32_t size)
Definition: object.hpp:550
uint32_t size
Definition: object_fwd.hpp:33
@ NIL
Definition: object_fwd_decl.hpp:29
The class holds object and zone.
Definition: object.hpp:44
bool visit_float64(double v)
Definition: object.hpp:340
uint64_t u64
Definition: object_fwd.hpp:78
bool visit_float32(float v)
Definition: object.hpp:416
bool visit_boolean(bool v)
Definition: object.hpp:323
msgpack::object_bin bin
Definition: object_fwd.hpp:88
const msgpack::object & get() const
Get object reference.
Definition: object.hpp:71
bool visit_positive_integer(uint64_t v)
Definition: object.hpp:328
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
@ EXT
Definition: object_fwd_decl.hpp:43
Definition: object_fwd.hpp:238
object_handle clone(msgpack::object const &obj)
clone object
Definition: object.hpp:617
bool start_map_key()
Definition: object.hpp:583
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:1071
Definition: object_fwd.hpp:236
Definition: object.hpp:529
uint32_t size
Definition: object_fwd.hpp:28
bool visit_bin(const char *, uint32_t size)
Definition: object.hpp:554
Definition: adaptor_base.hpp:32
implicit_type convert() const
Definition: object.hpp:1060
bool end_array_item()
Definition: object.hpp:961
bool boolean
Definition: object_fwd.hpp:77
double f64
Definition: object_fwd.hpp:84
msgpack::object val
Definition: object.hpp:32
bool end_map()
Definition: object.hpp:388
void operator()(msgpack::object::with_zone &o, msgpack::object::with_zone const &v) const
Definition: object.hpp:834
msgpack::packer< Stream > & operator()(msgpack::packer< Stream > &o, T const &v) const
Definition: object.hpp:650
bool start_map_key()
Definition: object.hpp:376
std::enable_if< msgpack::has_as< T >::value, T >::type as() const
Get value as T.
Definition: object.hpp:1121
msgpack::object const & operator()(msgpack::object const &o, T &v) const
Definition: object.hpp:641
object_pack_visitor(msgpack::packer< Stream > &pk)
Definition: object.hpp:317
Definition: cpp_config_decl.hpp:81
bool visit_negative_integer(int64_t v)
Definition: object.hpp:412
bool start_map_value()
Definition: object.hpp:589
bool visit_float64(double)
Definition: object.hpp:547
bool is_nil() const
Cheking nil.
Definition: object_fwd.hpp:99
bool start_array_item()
Definition: object.hpp:363
bool start_map_value()
Definition: object.hpp:985
void operator()(msgpack::object::with_zone &o, msgpack::object const &v) const
Definition: object.hpp:684
Object class that corresponding to MessagePack format object.
Definition: object_fwd.hpp:75
std::size_t aligned_zone_size(msgpack::object const &obj)
Definition: object.hpp:602
bool visit_ext(const char *, uint32_t)
Definition: object.hpp:473
const msgpack::object * operator->() const
Definition: object.hpp:83
bool end_map()
Definition: object.hpp:519
bool start_array_item()
Definition: object.hpp:957
msgpack::object_kv * ptr
Definition: object_fwd.hpp:29
bool visit_negative_integer(int64_t v)
Definition: object.hpp:332
msgpack::zone & zone
Definition: object.hpp:37
bool visit_float32(float v)
Definition: object.hpp:336
Definition: object.hpp:847
bool start_array(uint32_t num_elements)
Definition: object.hpp:562
Definition: object.hpp:35
bool convert_if_not_nil(T &v) const
Convert the object if not nil.
Definition: object.hpp:1099
msgpack::type::object_type type
Definition: object_fwd.hpp:92
@ POSITIVE_INTEGER
Definition: object_fwd_decl.hpp:31
const msgpack::object & operator*() const
Definition: object.hpp:77
msgpack::object_str str
Definition: object_fwd.hpp:87
bool start_map(uint32_t num_kv_pairs)
Definition: object.hpp:577
object_stringize_visitor(std::ostream &os)
Definition: object.hpp:397
bool visit_ext(const char *v, uint32_t size)
Definition: object.hpp:354
@ MAP
Definition: object_fwd_decl.hpp:42
bool visit_float32(float)
Definition: object.hpp:544
bool start_map_value()
Definition: object.hpp:509
#define MSGPACK_USE_CPP03
Definition: cpp_config_decl.hpp:21
bool end_map_value()
Definition: object.hpp:512
void operator()(msgpack::object::with_zone &o, T const &v) const
Definition: object.hpp:657