Dependents:   hello_message_pack

msgpack-c & msgpack-c++ https://github.com/msgpack/msgpack-c implementation for embedded systems (mbed / Arduino)

Committer:
hideakitai
Date:
Mon Feb 22 01:43:48 2016 +0000
Revision:
4:bd0c06dd6e92
Parent:
0:3f9dbf1e2cb0
fix throw error

Who changed what in which revision?

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