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