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 T& object::convert(T& v) const
530 {
531  msgpack::operator>>(*this, v);
532  return v;
533 }
534 
535 #if !defined(MSGPACK_DISABLE_LEGACY_CONVERT)
536 template <typename T>
537 inline T* object::convert(T* v) const
538 {
539  convert(*v);
540  return v;
541 }
542 #endif // !defined(MSGPACK_DISABLE_LEGACY_CONVERT)
543 
544 template <typename T>
545 inline bool object::convert_if_not_nil(T& v) const
546 {
547  if (is_nil()) {
548  return false;
549  }
550  convert(v);
551  return true;
552 }
553 
554 #if defined(MSGPACK_USE_CPP03)
555 
556 template <typename T>
557 inline T object::as() const
558 {
559  T v;
560  convert(v);
561  return v;
562 }
563 
564 #else // defined(MSGPACK_USE_CPP03)
565 
566 template <typename T>
567 inline typename std::enable_if<msgpack::has_as<T>::value, T>::type object::as() const {
568  return msgpack::adaptor::as<T>()(*this);
569 }
570 
571 template <typename T>
572 inline typename std::enable_if<!msgpack::has_as<T>::value, T>::type object::as() const {
573  T v;
574  convert(v);
575  return v;
576 }
577 
578 #endif // defined(MSGPACK_USE_CPP03)
579 
581 {
582  type = msgpack::type::NIL;
583 }
584 
585 template <typename T>
586 inline object::object(const T& v)
587 {
588  *this << v;
589 }
590 
591 template <typename T>
592 inline object& object::operator=(const T& v)
593 {
594  *this = object(v);
595  return *this;
596 }
597 
598 template <typename T>
599 inline object::object(const T& v, msgpack::zone& z)
600 {
601  with_zone oz(z);
602  msgpack::operator<<(oz, v);
603  type = oz.type;
604  via = oz.via;
605 }
606 
607 template <typename T>
608 inline object::object(const T& v, msgpack::zone* z)
609 {
610  with_zone oz(*z);
611  msgpack::operator<<(oz, v);
612  type = oz.type;
613  via = oz.via;
614 }
615 
616 
617 inline object::object(const msgpack_object& o)
618 {
619  // FIXME beter way?
620  std::memcpy(this, &o, sizeof(o));
621 }
622 
623 inline void operator<< (msgpack::object& o, const msgpack_object& v)
624 {
625  // FIXME beter way?
626  std::memcpy(&o, &v, sizeof(v));
627 }
628 
629 inline object::operator msgpack_object() const
630 {
631  // FIXME beter way?
632  msgpack_object obj;
633  std::memcpy(&obj, this, sizeof(obj));
634  return obj;
635 }
636 
637 
638 // obsolete
639 template <typename T>
640 inline void convert(T& v, msgpack::object const& o)
641 {
642  o.convert(v);
643 }
644 
645 // obsolete
646 template <typename Stream, typename T>
647 inline void pack(msgpack::packer<Stream>& o, const T& v)
648 {
649  o.pack(v);
650 }
651 
652 // obsolete
653 template <typename Stream, typename T>
654 inline void pack_copy(msgpack::packer<Stream>& o, T v)
655 {
656  pack(o, v);
657 }
658 
659 
660 template <typename Stream>
661 inline msgpack::packer<Stream>& operator<< (msgpack::packer<Stream>& o, const msgpack::object& v)
662 {
663  switch(v.type) {
664  case msgpack::type::NIL:
665  o.pack_nil();
666  return o;
667 
669  if(v.via.boolean) {
670  o.pack_true();
671  } else {
672  o.pack_false();
673  }
674  return o;
675 
677  o.pack_uint64(v.via.u64);
678  return o;
679 
681  o.pack_int64(v.via.i64);
682  return o;
683 
685  o.pack_double(v.via.f64);
686  return o;
687 
688  case msgpack::type::STR:
689  o.pack_str(v.via.str.size);
690  o.pack_str_body(v.via.str.ptr, v.via.str.size);
691  return o;
692 
693  case msgpack::type::BIN:
694  o.pack_bin(v.via.bin.size);
695  o.pack_bin_body(v.via.bin.ptr, v.via.bin.size);
696  return o;
697 
698  case msgpack::type::EXT:
699  o.pack_ext(v.via.ext.size, v.via.ext.type());
700  o.pack_ext_body(v.via.ext.data(), v.via.ext.size);
701  return o;
702 
704  o.pack_array(v.via.array.size);
705  for(msgpack::object* p(v.via.array.ptr),
706  * const pend(v.via.array.ptr + v.via.array.size);
707  p < pend; ++p) {
708  msgpack::operator<<(o, *p);
709  }
710  return o;
711 
712  case msgpack::type::MAP:
713  o.pack_map(v.via.map.size);
714  for(msgpack::object_kv* p(v.via.map.ptr),
715  * const pend(v.via.map.ptr + v.via.map.size);
716  p < pend; ++p) {
717  msgpack::operator<<(o, p->key);
718  msgpack::operator<<(o, p->val);
719  }
720  return o;
721 
722  default:
723  throw msgpack::type_error();
724  }
725 }
726 
727 template <typename Stream>
728 inline msgpack::packer<Stream>& operator<< (msgpack::packer<Stream>& o, const msgpack::object::with_zone& v)
729 {
730  return o << static_cast<msgpack::object>(v);
731 }
732 
733 inline std::ostream& operator<< (std::ostream& s, const msgpack::object& o)
734 {
735  switch(o.type) {
736  case msgpack::type::NIL:
737  s << "nil";
738  break;
739 
741  s << (o.via.boolean ? "true" : "false");
742  break;
743 
745  s << o.via.u64;
746  break;
747 
749  s << o.via.i64;
750  break;
751 
753  s << o.via.f64;
754  break;
755 
756  case msgpack::type::STR:
757  s << '"';
758  for (uint32_t i = 0; i < o.via.str.size; ++i) {
759  char c = o.via.str.ptr[i];
760  switch (c) {
761  case '\\':
762  s << "\\\\";
763  break;
764  case '"':
765  s << "\\\"";
766  break;
767  case '/':
768  s << "\\/";
769  break;
770  case '\b':
771  s << "\\b";
772  break;
773  case '\f':
774  s << "\\f";
775  break;
776  case '\n':
777  s << "\\n";
778  break;
779  case '\r':
780  s << "\\r";
781  break;
782  case '\t':
783  s << "\\t";
784  break;
785  default: {
786  unsigned int code = static_cast<unsigned int>(c);
787  if (code < 0x20 || code == 0x7f) {
788  s << "\\u" << std::hex << std::setw(4) << std::setfill('0') << (code & 0xff);
789  }
790  else {
791  s << c;
792  }
793  } break;
794  }
795  }
796  s << '"';
797  break;
798 
799  case msgpack::type::BIN:
800  (s << '"').write(o.via.bin.ptr, o.via.bin.size) << '"';
801  break;
802 
803  case msgpack::type::EXT:
804  s << "EXT";
805  break;
806 
808  s << "[";
809  if(o.via.array.size != 0) {
811  s << *p;
812  ++p;
813  for(msgpack::object* const pend(o.via.array.ptr + o.via.array.size);
814  p < pend; ++p) {
815  s << ", " << *p;
816  }
817  }
818  s << "]";
819  break;
820 
821  case msgpack::type::MAP:
822  s << "{";
823  if(o.via.map.size != 0) {
825  s << p->key << ':' << p->val;
826  ++p;
827  for(msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
828  p < pend; ++p) {
829  s << ", " << p->key << ':' << p->val;
830  }
831  }
832  s << "}";
833  break;
834 
835  default:
836  // FIXME
837  s << "#<UNKNOWN " << static_cast<uint16_t>(o.type) << ">";
838  }
839  return s;
840 }
841 
843 } // MSGPACK_API_VERSION_NAMESPACE(v1)
845 
846 } // namespace msgpack
847 
848 #endif // MSGPACK_V1_OBJECT_HPP
define()
Definition: object.hpp:399
packer< Stream > & pack_bin(uint32_t l)
Packing bin header and length.
Definition: pack.hpp:1255
Definition: object_fwd_decl.hpp:37
msgpack::object const & operator>>(msgpack::object const &o, T &v)
Definition: adaptor_base.hpp:53
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:580
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:224
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
void convert(T &v, msgpack::object const &o)
Definition: object.hpp:640
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:567
Definition: adaptor_base.hpp:43
uint32_t size
Definition: object_fwd.hpp:45
void pack_copy(msgpack::packer< Stream > &o, T v)
Definition: object.hpp:654
void operator()(msgpack::object::with_zone &o, msgpack::object::with_zone const &v) const
Definition: object.hpp:381
Definition: object_fwd.hpp:222
bool convert_if_not_nil(T &v) const
Convert the object if not nil.
Definition: object.hpp:545
define< Type > define_type
Definition: object.hpp:397
Definition: adaptor_base.hpp:32
object & operator=(const T &v)
Definition: object.hpp:592
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
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:647
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
msgpack::object_map map
Definition: object_fwd.hpp:85
msgpack::object_str str
Definition: object_fwd.hpp:86
T & convert(T &v) const
Convert the object.
Definition: object.hpp:529
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:23
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
msgpack::packer< Stream > & operator<<(msgpack::packer< Stream > &o, T const &v)
Definition: adaptor_base.hpp:59
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