MessagePack for C++
object.hpp
Go to the documentation of this file.
1 //
2 // MessagePack for C++ static resolution routine
3 //
4 // Copyright (C) 2008-2014 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_OBJECT_HPP
11 #define MSGPACK_V1_OBJECT_HPP
12 
13 #include "msgpack/object_decl.hpp"
14 
15 #include <cstring>
16 #include <stdexcept>
17 #include <typeinfo>
18 #include <limits>
19 #include <ostream>
20 #include <typeinfo>
21 #include <iomanip>
22 
23 namespace msgpack {
24 
28 
29 struct object_kv {
32 };
33 
37 private:
38  with_zone();
39 };
40 
41 
44 public:
47 
49 
54  msgpack::object const& obj,
55 #if defined(MSGPACK_USE_CPP03)
57 #else // defined(MSGPACK_USE_CPP03)
59 #endif // defined(MSGPACK_USE_CPP03)
60  ) :
61  m_obj(obj), m_zone(msgpack::move(z)) { }
62 
63  // obsolete
64  void set(msgpack::object const& obj)
65  { m_obj = obj; }
66 
68 
71  const msgpack::object& get() const
72  { return m_obj; }
73 
75 
79  { return m_zone; }
80 
82 
86  { return m_zone; }
87 
88 #if defined(MSGPACK_USE_CPP03)
89  struct object_handle_ref {
90  object_handle_ref(object_handle* oh):m_oh(oh) {}
91  object_handle* m_oh;
92  };
93 
95  m_obj(other.m_obj),
96  m_zone(msgpack::move(other.m_zone)) {
97  }
98 
99  object_handle(object_handle_ref ref):
100  m_obj(ref.m_oh->m_obj),
101  m_zone(msgpack::move(ref.m_oh->m_zone)) {
102  }
103 
104  object_handle& operator=(object_handle& other) {
105  m_obj = other.m_obj;
106  m_zone = msgpack::move(other.m_zone);
107  return *this;
108  }
109 
110  object_handle& operator=(object_handle_ref ref) {
111  m_obj = ref.m_oh->m_obj;
112  m_zone = msgpack::move(ref.m_oh->m_zone);
113  return *this;
114  }
115 
116  operator object_handle_ref() {
117  return object_handle_ref(this);
118  }
119 #endif // defined(MSGPACK_USE_CPP03)
120 
121 private:
122  msgpack::object m_obj;
124 };
125 
126 namespace detail {
127 
128 template <std::size_t N>
129 inline std::size_t add_ext_type_size(std::size_t size) {
130  return size + 1;
131 }
132 
133 template <>
134 inline std::size_t add_ext_type_size<4>(std::size_t size) {
135  return size == 0xffffffff ? size : size + 1;
136 }
137 
138 } // namespace detail
139 
140 inline std::size_t aligned_zone_size(msgpack::object const& obj) {
141  std::size_t s = 0;
142  switch (obj.type) {
144  s += sizeof(msgpack::object) * obj.via.array.size;
145  for (uint32_t i = 0; i < obj.via.array.size; ++i) {
147  }
148  break;
149  case msgpack::type::MAP:
150  s += sizeof(msgpack::object_kv) * obj.via.map.size;
151  for (uint32_t i = 0; i < obj.via.map.size; ++i) {
154  }
155  break;
156  case msgpack::type::EXT:
158  detail::add_ext_type_size<sizeof(std::size_t)>(obj.via.ext.size));
159  break;
160  case msgpack::type::STR:
161  s += msgpack::aligned_size(obj.via.str.size);
162  break;
163  case msgpack::type::BIN:
164  s += msgpack::aligned_size(obj.via.bin.size);
165  break;
166  default:
167  break;
168  }
169  return s;
170 }
171 
173 
180 inline object_handle clone(msgpack::object const& obj) {
181  std::size_t size = msgpack::aligned_zone_size(obj);
182  msgpack::unique_ptr<msgpack::zone> z(size == 0 ? nullptr : new msgpack::zone(size));
183  msgpack::object newobj = z.get() ? msgpack::object(obj, *z) : obj;
184  return object_handle(newobj, msgpack::move(z));
185 }
186 
187 template <typename T>
188 inline object::implicit_type::operator T() { return obj.as<T>(); }
189 
190 namespace detail {
191 template <typename Stream, typename T>
194  v.msgpack_pack(o);
195  return o;
196  }
197 };
198 } // namespace detail
199 
200 // Adaptor functors' member functions definitions.
201 template <typename T, typename Enabler>
202 inline
203 msgpack::object const&
205  v.msgpack_unpack(o.convert());
206  return o;
207 }
208 
209 template <typename T, typename Enabler>
210 template <typename Stream>
211 inline
215 }
216 
217 template <typename T, typename Enabler>
218 inline
219 void
221  v.msgpack_object(static_cast<msgpack::object*>(&o), o.zone);
222 }
223 
224 // Adaptor functor specialization to object
225 namespace adaptor {
226 
227 template <>
230  v = o;
231  return o;
232  }
233 };
234 
235 template <>
236 struct pack<msgpack::object> {
237  template <typename Stream>
239  switch(v.type) {
240  case msgpack::type::NIL:
241  o.pack_nil();
242  return o;
243 
245  if(v.via.boolean) {
246  o.pack_true();
247  } else {
248  o.pack_false();
249  }
250  return o;
251 
253  o.pack_uint64(v.via.u64);
254  return o;
255 
257  o.pack_int64(v.via.i64);
258  return o;
259 
261  o.pack_double(v.via.f64);
262  return o;
263 
264  case msgpack::type::STR:
265  o.pack_str(v.via.str.size);
266  o.pack_str_body(v.via.str.ptr, v.via.str.size);
267  return o;
268 
269  case msgpack::type::BIN:
270  o.pack_bin(v.via.bin.size);
271  o.pack_bin_body(v.via.bin.ptr, v.via.bin.size);
272  return o;
273 
274  case msgpack::type::EXT:
275  o.pack_ext(v.via.ext.size, v.via.ext.type());
276  o.pack_ext_body(v.via.ext.data(), v.via.ext.size);
277  return o;
278 
280  o.pack_array(v.via.array.size);
281  for(msgpack::object* p(v.via.array.ptr),
282  * const pend(v.via.array.ptr + v.via.array.size);
283  p < pend; ++p) {
284  msgpack::operator<<(o, *p);
285  }
286  return o;
287 
288  case msgpack::type::MAP:
289  o.pack_map(v.via.map.size);
290  for(msgpack::object_kv* p(v.via.map.ptr),
291  * const pend(v.via.map.ptr + v.via.map.size);
292  p < pend; ++p) {
293  msgpack::operator<<(o, p->key);
294  msgpack::operator<<(o, p->val);
295  }
296  return o;
297 
298  default:
299  throw msgpack::type_error();
300  }
301  }
302 };
303 
304 template <>
307  o.type = v.type;
308 
309  switch(v.type) {
310  case msgpack::type::NIL:
315  std::memcpy(&o.via, &v.via, sizeof(v.via));
316  return;
317 
318  case msgpack::type::STR: {
319  char* ptr = static_cast<char*>(o.zone.allocate_align(v.via.str.size));
320  o.via.str.ptr = ptr;
321  o.via.str.size = v.via.str.size;
322  std::memcpy(ptr, v.via.str.ptr, v.via.str.size);
323  return;
324  }
325 
326  case msgpack::type::BIN: {
327  char* ptr = static_cast<char*>(o.zone.allocate_align(v.via.bin.size));
328  o.via.bin.ptr = ptr;
329  o.via.bin.size = v.via.bin.size;
330  std::memcpy(ptr, v.via.bin.ptr, v.via.bin.size);
331  return;
332  }
333 
334  case msgpack::type::EXT: {
335  char* ptr = static_cast<char*>(o.zone.allocate_align(v.via.ext.size + 1));
336  o.via.ext.ptr = ptr;
337  o.via.ext.size = v.via.ext.size;
338  std::memcpy(ptr, v.via.ext.ptr, v.via.ext.size + 1);
339  return;
340  }
341 
343  o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object) * v.via.array.size));
344  o.via.array.size = v.via.array.size;
345  for (msgpack::object
346  * po(o.via.array.ptr),
347  * pv(v.via.array.ptr),
348  * const pvend(v.via.array.ptr + v.via.array.size);
349  pv < pvend;
350  ++po, ++pv) {
351  new (po) msgpack::object(*pv, o.zone);
352  }
353  return;
354 
355  case msgpack::type::MAP:
357  o.via.map.size = v.via.map.size;
359  * po(o.via.map.ptr),
360  * pv(v.via.map.ptr),
361  * const pvend(v.via.map.ptr + v.via.map.size);
362  pv < pvend;
363  ++po, ++pv) {
364  msgpack::object_kv* kv = new (po) msgpack::object_kv;
365  new (&kv->key) msgpack::object(pv->key, o.zone);
366  new (&kv->val) msgpack::object(pv->val, o.zone);
367  }
368  return;
369 
370  default:
371  throw msgpack::type_error();
372  }
373 
374  }
375 };
376 
377 // Adaptor functor specialization to object::with_zone
378 
379 template <>
383  msgpack::object::with_zone const& v) const {
384  o << static_cast<msgpack::object const&>(v);
385  }
386 };
387 
388 
389 } // namespace adaptor
390 
391 
392 // obsolete
393 template <typename Type>
394 class define : public Type {
395 public:
396  typedef Type msgpack_type;
398 
399  define() {}
400  define(const msgpack_type& v) : msgpack_type(v) {}
401 
402  template <typename Packer>
403  void msgpack_pack(Packer& o) const
404  {
405  msgpack::operator<<(o, static_cast<const msgpack_type&>(*this));
406  }
407 
408  void msgpack_unpack(object const& o)
409  {
410  msgpack::operator>>(o, static_cast<msgpack_type&>(*this));
411  }
412 };
413 
414 // deconvert operator
415 
416 template <typename Stream>
417 template <typename T>
419 {
420  msgpack::operator<<(*this, v);
421  return *this;
422 }
423 
424 inline bool operator==(const msgpack::object& x, const msgpack::object& y)
425 {
426  if(x.type != y.type) { return false; }
427 
428  switch(x.type) {
429  case msgpack::type::NIL:
430  return true;
431 
433  return x.via.boolean == y.via.boolean;
434 
436  return x.via.u64 == y.via.u64;
437 
439  return x.via.i64 == y.via.i64;
440 
442  return x.via.f64 == y.via.f64;
443 
444  case msgpack::type::STR:
445  return x.via.str.size == y.via.str.size &&
446  std::memcmp(x.via.str.ptr, y.via.str.ptr, x.via.str.size) == 0;
447 
448  case msgpack::type::BIN:
449  return x.via.bin.size == y.via.bin.size &&
450  std::memcmp(x.via.bin.ptr, y.via.bin.ptr, x.via.bin.size) == 0;
451 
452  case msgpack::type::EXT:
453  return x.via.ext.size == y.via.ext.size &&
454  std::memcmp(x.via.ext.ptr, y.via.ext.ptr, x.via.ext.size) == 0;
455 
457  if(x.via.array.size != y.via.array.size) {
458  return false;
459  } else if(x.via.array.size == 0) {
460  return true;
461  } else {
462  msgpack::object* px = x.via.array.ptr;
463  msgpack::object* const pxend = x.via.array.ptr + x.via.array.size;
464  msgpack::object* py = y.via.array.ptr;
465  do {
466  if(!(*px == *py)) {
467  return false;
468  }
469  ++px;
470  ++py;
471  } while(px < pxend);
472  return true;
473  }
474 
475  case msgpack::type::MAP:
476  if(x.via.map.size != y.via.map.size) {
477  return false;
478  } else if(x.via.map.size == 0) {
479  return true;
480  } else {
481  msgpack::object_kv* px = x.via.map.ptr;
482  msgpack::object_kv* const pxend = x.via.map.ptr + x.via.map.size;
483  msgpack::object_kv* py = y.via.map.ptr;
484  do {
485  if(!(px->key == py->key) || !(px->val == py->val)) {
486  return false;
487  }
488  ++px;
489  ++py;
490  } while(px < pxend);
491  return true;
492  }
493 
494  default:
495  return false;
496  }
497 }
498 
499 template <typename T>
500 inline bool operator==(const msgpack::object& x, const T& y)
501 try {
502  return x == msgpack::object(y);
503 } catch (msgpack::type_error&) {
504  return false;
505 }
506 
507 inline bool operator!=(const msgpack::object& x, const msgpack::object& y)
508 { return !(x == y); }
509 
510 template <typename T>
511 inline bool operator==(const T& y, const msgpack::object& x)
512 { return x == y; }
513 
514 template <typename T>
515 inline bool operator!=(const msgpack::object& x, const T& y)
516 { return !(x == y); }
517 
518 template <typename T>
519 inline bool operator!=(const T& y, const msgpack::object& x)
520 { return x != y; }
521 
522 
524 {
525  return object::implicit_type(*this);
526 }
527 
528 template <typename T>
529 inline
530 typename msgpack::enable_if<
532  T&
533 >::type
534 object::convert(T& v) const
535 {
536  msgpack::operator>>(*this, v);
537  return v;
538 }
539 
540 template <typename T, std::size_t N>
541 inline T(&object::convert(T(&v)[N]) const)[N]
542 {
543  msgpack::operator>>(*this, v);
544  return v;
545 }
546 
547 #if !defined(MSGPACK_DISABLE_LEGACY_CONVERT)
548 template <typename T>
549 inline
550 typename msgpack::enable_if<
552  T
553 >::type
554 object::convert(T v) const
555 {
556  convert(*v);
557  return v;
558 }
559 #endif // !defined(MSGPACK_DISABLE_LEGACY_CONVERT)
560 
561 template <typename T>
562 inline bool object::convert_if_not_nil(T& v) const
563 {
564  if (is_nil()) {
565  return false;
566  }
567  convert(v);
568  return true;
569 }
570 
571 #if defined(MSGPACK_USE_CPP03)
572 
573 template <typename T>
574 inline T object::as() const
575 {
576  T v;
577  convert(v);
578  return v;
579 }
580 
581 #else // defined(MSGPACK_USE_CPP03)
582 
583 template <typename T>
584 inline typename std::enable_if<msgpack::has_as<T>::value, T>::type object::as() const {
585  return msgpack::adaptor::as<T>()(*this);
586 }
587 
588 template <typename T>
589 inline typename std::enable_if<!msgpack::has_as<T>::value, T>::type object::as() const {
590  T v;
591  convert(v);
592  return v;
593 }
594 
595 #endif // defined(MSGPACK_USE_CPP03)
596 
598 {
599  type = msgpack::type::NIL;
600 }
601 
602 template <typename T>
603 inline object::object(const T& v)
604 {
605  *this << v;
606 }
607 
608 template <typename T>
609 inline object& object::operator=(const T& v)
610 {
611  *this = object(v);
612  return *this;
613 }
614 
615 template <typename T>
616 inline object::object(const T& v, msgpack::zone& z)
617 {
618  with_zone oz(z);
619  msgpack::operator<<(oz, v);
620  type = oz.type;
621  via = oz.via;
622 }
623 
624 template <typename T>
625 inline object::object(const T& v, msgpack::zone* z)
626 {
627  with_zone oz(*z);
628  msgpack::operator<<(oz, v);
629  type = oz.type;
630  via = oz.via;
631 }
632 
633 
634 inline object::object(const msgpack_object& o)
635 {
636  // FIXME beter way?
637  std::memcpy(this, &o, sizeof(o));
638 }
639 
640 inline void operator<< (msgpack::object& o, const msgpack_object& v)
641 {
642  // FIXME beter way?
643  std::memcpy(&o, &v, sizeof(v));
644 }
645 
646 inline object::operator msgpack_object() const
647 {
648  // FIXME beter way?
649  msgpack_object obj;
650  std::memcpy(&obj, this, sizeof(obj));
651  return obj;
652 }
653 
654 
655 // obsolete
656 template <typename T>
657 inline void convert(T& v, msgpack::object const& o)
658 {
659  o.convert(v);
660 }
661 
662 // obsolete
663 template <typename Stream, typename T>
664 inline void pack(msgpack::packer<Stream>& o, const T& v)
665 {
666  o.pack(v);
667 }
668 
669 // obsolete
670 template <typename Stream, typename T>
671 inline void pack_copy(msgpack::packer<Stream>& o, T v)
672 {
673  pack(o, v);
674 }
675 
676 
677 template <typename Stream>
678 inline msgpack::packer<Stream>& operator<< (msgpack::packer<Stream>& o, const msgpack::object& v)
679 {
680  switch(v.type) {
681  case msgpack::type::NIL:
682  o.pack_nil();
683  return o;
684 
686  if(v.via.boolean) {
687  o.pack_true();
688  } else {
689  o.pack_false();
690  }
691  return o;
692 
694  o.pack_uint64(v.via.u64);
695  return o;
696 
698  o.pack_int64(v.via.i64);
699  return o;
700 
702  o.pack_double(v.via.f64);
703  return o;
704 
705  case msgpack::type::STR:
706  o.pack_str(v.via.str.size);
707  o.pack_str_body(v.via.str.ptr, v.via.str.size);
708  return o;
709 
710  case msgpack::type::BIN:
711  o.pack_bin(v.via.bin.size);
712  o.pack_bin_body(v.via.bin.ptr, v.via.bin.size);
713  return o;
714 
715  case msgpack::type::EXT:
716  o.pack_ext(v.via.ext.size, v.via.ext.type());
717  o.pack_ext_body(v.via.ext.data(), v.via.ext.size);
718  return o;
719 
721  o.pack_array(v.via.array.size);
722  for(msgpack::object* p(v.via.array.ptr),
723  * const pend(v.via.array.ptr + v.via.array.size);
724  p < pend; ++p) {
725  msgpack::operator<<(o, *p);
726  }
727  return o;
728 
729  case msgpack::type::MAP:
730  o.pack_map(v.via.map.size);
731  for(msgpack::object_kv* p(v.via.map.ptr),
732  * const pend(v.via.map.ptr + v.via.map.size);
733  p < pend; ++p) {
734  msgpack::operator<<(o, p->key);
735  msgpack::operator<<(o, p->val);
736  }
737  return o;
738 
739  default:
740  throw msgpack::type_error();
741  }
742 }
743 
744 template <typename Stream>
745 inline msgpack::packer<Stream>& operator<< (msgpack::packer<Stream>& o, const msgpack::object::with_zone& v)
746 {
747  return o << static_cast<msgpack::object>(v);
748 }
749 
750 inline std::ostream& operator<< (std::ostream& s, const msgpack::object& o)
751 {
752  switch(o.type) {
753  case msgpack::type::NIL:
754  s << "null";
755  break;
756 
758  s << (o.via.boolean ? "true" : "false");
759  break;
760 
762  s << o.via.u64;
763  break;
764 
766  s << o.via.i64;
767  break;
768 
770  s << o.via.f64;
771  break;
772 
773  case msgpack::type::STR:
774  s << '"';
775  for (uint32_t i = 0; i < o.via.str.size; ++i) {
776  char c = o.via.str.ptr[i];
777  switch (c) {
778  case '\\':
779  s << "\\\\";
780  break;
781  case '"':
782  s << "\\\"";
783  break;
784  case '/':
785  s << "\\/";
786  break;
787  case '\b':
788  s << "\\b";
789  break;
790  case '\f':
791  s << "\\f";
792  break;
793  case '\n':
794  s << "\\n";
795  break;
796  case '\r':
797  s << "\\r";
798  break;
799  case '\t':
800  s << "\\t";
801  break;
802  default: {
803  unsigned int code = static_cast<unsigned int>(c);
804  if (code < 0x20 || code == 0x7f) {
805  s << "\\u" << std::hex << std::setw(4) << std::setfill('0') << (code & 0xff);
806  }
807  else {
808  s << c;
809  }
810  } break;
811  }
812  }
813  s << '"';
814  break;
815 
816  case msgpack::type::BIN:
817  (s << '"').write(o.via.bin.ptr, o.via.bin.size) << '"';
818  break;
819 
820  case msgpack::type::EXT:
821  s << "EXT";
822  break;
823 
825  s << "[";
826  if(o.via.array.size != 0) {
828  s << *p;
829  ++p;
830  for(msgpack::object* const pend(o.via.array.ptr + o.via.array.size);
831  p < pend; ++p) {
832  s << ", " << *p;
833  }
834  }
835  s << "]";
836  break;
837 
838  case msgpack::type::MAP:
839  s << "{";
840  if(o.via.map.size != 0) {
842  s << p->key << ':' << p->val;
843  ++p;
844  for(msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
845  p < pend; ++p) {
846  s << ", " << p->key << ':' << p->val;
847  }
848  }
849  s << "}";
850  break;
851 
852  default:
853  // FIXME
854  s << "#<UNKNOWN " << static_cast<uint16_t>(o.type) << ">";
855  }
856  return s;
857 }
858 
860 } // MSGPACK_API_VERSION_NAMESPACE(v1)
862 
863 } // namespace msgpack
864 
865 #endif // MSGPACK_V1_OBJECT_HPP
define()
Definition: object.hpp:399
Definition: cpp_config_decl.hpp:67
packer< Stream > & pack_bin(uint32_t l)
Packing bin header and length.
Definition: pack.hpp:1255
Definition: object_fwd_decl.hpp:37
msgpack::object_kv * ptr
Definition: object_fwd.hpp:29
uint32_t size
Definition: object_fwd.hpp:23
object_handle()
Constructor that creates nil object and null zone.
Definition: object.hpp:46
packer< Stream > & pack_ext(size_t l, int8_t type)
Packing ext header, type, and length.
Definition: pack.hpp:1281
bool operator==(const msgpack::object &x, const msgpack::object &y)
Definition: object.hpp:424
void * allocate_align(size_t size, size_t align=MSGPACK_ZONE_ALIGN)
Definition: cpp03_zone.hpp:236
define(const msgpack_type &v)
Definition: object.hpp:400
Definition: object_fwd_decl.hpp:30
const char * ptr
Definition: object_fwd.hpp:39
void operator()(msgpack::object::with_zone &o, T const &v) const
Definition: object.hpp:220
Type msgpack_type
Definition: object.hpp:396
void operator()(msgpack::object::with_zone &o, msgpack::object const &v) const
Definition: object.hpp:306
Definition: object_fwd_decl.hpp:60
union_type via
Definition: object_fwd.hpp:92
msgpack::packer< Stream > & operator()(msgpack::packer< Stream > &o, msgpack::object const &v) const
Definition: object.hpp:238
object()
Default constructor. The object is set to nil.
Definition: object.hpp:597
Definition: object_fwd_decl.hpp:38
msgpack::zone & zone
Definition: object.hpp:36
Definition: object.hpp:394
const char * ptr
Definition: object_fwd.hpp:46
msgpack::object * ptr
Definition: object_fwd.hpp:24
packer< Stream > & pack_array(uint32_t n)
Packing array header and size.
Definition: pack.hpp:1160
msgpack::object val
Definition: object.hpp:31
uint32_t size
Definition: object_fwd.hpp:38
packer< Stream > & pack_uint64(uint64_t d)
Packing uint16.
Definition: pack.hpp:717
Definition: adaptor_base.hpp:15
std::size_t aligned_size(std::size_t size, std::size_t align)
Definition: cpp03_zone.hpp:337
packer< Stream > & pack_int64(int64_t d)
Packing int32.
Definition: pack.hpp:733
Definition: object_fwd.hpp:235
const char * data() const
Definition: object_fwd.hpp:44
const char * ptr
Definition: object_fwd.hpp:34
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:53
Definition: cpp03_zone.hpp:22
void msgpack_pack(Packer &o) const
Definition: object.hpp:403
Definition: object_fwd_decl.hpp:33
packer< Stream > & pack_bin_body(const char *b, uint32_t l)
Packing bin body.
Definition: pack.hpp:1274
packer< Stream > & pack_false()
Packing false.
Definition: pack.hpp:1151
bool boolean
Definition: object_fwd.hpp:77
msgpack::enable_if< !is_array< T >::value, msgpack::object const & >::type operator>>(msgpack::object const &o, T &v)
Definition: adaptor_base.hpp:57
void convert(T &v, msgpack::object const &o)
Definition: object.hpp:657
Definition: object.hpp:34
packer< Stream > & pack(const T &v)
Packing function template.
packer< Stream > & pack_str_body(const char *b, uint32_t l)
Packing str body.
Definition: pack.hpp:1220
Definition: object.hpp:29
Definition: cpp_config_decl.hpp:43
Definition: object_fwd_decl.hpp:29
int64_t i64
Definition: object_fwd.hpp:79
Definition: object_fwd_decl.hpp:32
#define MSGPACK_USE_CPP03
Definition: cpp_config_decl.hpp:21
packer< Stream > & pack_true()
Packing true.
Definition: pack.hpp:1143
std::enable_if< msgpack::has_as< T >::value, T >::type as() const
Get value as T.
Definition: object.hpp:584
Definition: adaptor_base.hpp:43
Definition: cpp_config_decl.hpp:77
uint32_t size
Definition: object_fwd.hpp:45
void pack_copy(msgpack::packer< Stream > &o, T v)
Definition: object.hpp:671
void operator()(msgpack::object::with_zone &o, msgpack::object::with_zone const &v) const
Definition: object.hpp:381
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:534
Definition: object_fwd.hpp:233
bool convert_if_not_nil(T &v) const
Convert the object if not nil.
Definition: object.hpp:562
define< Type > define_type
Definition: object.hpp:397
Definition: adaptor_base.hpp:32
object & operator=(const T &v)
Definition: object.hpp:609
int8_t type() const
Definition: object_fwd.hpp:43
std::size_t add_ext_type_size< 4 >(std::size_t size)
Definition: object.hpp:134
msgpack::enable_if< !is_array< T >::value, msgpack::packer< Stream > & >::type operator<<(msgpack::packer< Stream > &o, T const &v)
Definition: adaptor_base.hpp:72
double f64
Definition: object_fwd.hpp:83
Definition: object_fwd_decl.hpp:41
msgpack::object_array array
Definition: object_fwd.hpp:84
void pack(msgpack::packer< Stream > &o, const T &v)
Definition: object.hpp:664
with_zone(msgpack::zone &z)
Definition: object.hpp:35
msgpack::object const & operator()(msgpack::object const &o, msgpack::object &v) const
Definition: object.hpp:229
packer< Stream > & pack_map(uint32_t n)
Packing map header and size.
Definition: pack.hpp:1178
Definition: cpp_config_decl.hpp:52
msgpack::object_map map
Definition: object_fwd.hpp:85
msgpack::object_str str
Definition: object_fwd.hpp:86
Object class that corresponding to MessagePack format object.
Definition: object_fwd.hpp:75
Definition: object.hpp:192
packer< Stream > & pack_double(double d)
Packing double.
Definition: pack.hpp:1115
packer< Stream > & pack_ext_body(const char *b, uint32_t l)
Packing ext body.
Definition: pack.hpp:1340
msgpack::type::object_type type
Definition: object_fwd.hpp:91
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition: versioning.hpp:58
Definition: object_fwd_decl.hpp:39
msgpack::object key
Definition: object.hpp:30
uint32_t size
Definition: object_fwd.hpp:28
Definition: object_fwd_decl.hpp:40
msgpack::unique_ptr< msgpack::zone > & zone()
Get unique_ptr reference of zone.
Definition: object.hpp:78
implicit_type convert() const
Definition: object.hpp:523
uint32_t size
Definition: object_fwd.hpp:33
std::size_t add_ext_type_size(std::size_t size)
Definition: object.hpp:129
Definition: adaptor_base.hpp:38
The class template that supports continuous packing.
Definition: adaptor_base_decl.hpp:24
T & move(T &t)
object_handle clone(msgpack::object const &obj)
clone object
Definition: object.hpp:180
msgpack::object_ext ext
Definition: object_fwd.hpp:88
void msgpack_unpack(object const &o)
Definition: object.hpp:408
packer< Stream > & pack_nil()
Packing nil.
Definition: pack.hpp:1135
Definition: adaptor_base.hpp:27
packer< Stream > & pack_str(uint32_t l)
Packing str header and length.
Definition: pack.hpp:1197
msgpack::object const & operator()(msgpack::object const &o, T &v) const
Definition: object.hpp:204
static msgpack::packer< Stream > & pack(msgpack::packer< Stream > &o, const T &v)
Definition: object.hpp:193
msgpack::packer< Stream > & operator()(msgpack::packer< Stream > &o, T const &v) const
Definition: object.hpp:213
The class holds object and zone.
Definition: object.hpp:43
std::size_t aligned_zone_size(msgpack::object const &obj)
Definition: object.hpp:140
bool operator!=(const msgpack::object &x, const msgpack::object &y)
Definition: object.hpp:507
Definition: object_fwd_decl.hpp:31
uint64_t u64
Definition: object_fwd.hpp:78
msgpack::object_bin bin
Definition: object_fwd.hpp:87
const msgpack::unique_ptr< msgpack::zone > & zone() const
Get unique_ptr const reference of zone.
Definition: object.hpp:85