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
hideakitai 0:3f9dbf1e2cb0 11 #ifndef MSGPACK_OBJECT_FWD_HPP
hideakitai 0:3f9dbf1e2cb0 12 #define MSGPACK_OBJECT_FWD_HPP
hideakitai 0:3f9dbf1e2cb0 13
hideakitai 0:3f9dbf1e2cb0 14 #include "msgpack/versioning.hpp"
hideakitai 0:3f9dbf1e2cb0 15 #include "msgpack/zone.hpp"
hideakitai 0:3f9dbf1e2cb0 16 #include "../object.h"
hideakitai 0:3f9dbf1e2cb0 17
hideakitai 0:3f9dbf1e2cb0 18 #include <typeinfo>
hideakitai 0:3f9dbf1e2cb0 19
hideakitai 0:3f9dbf1e2cb0 20 namespace msgpack {
hideakitai 0:3f9dbf1e2cb0 21
hideakitai 0:3f9dbf1e2cb0 22 /// @cond
hideakitai 0:3f9dbf1e2cb0 23 MSGPACK_API_VERSION_NAMESPACE(v1) {
hideakitai 0:3f9dbf1e2cb0 24 /// @endcond
hideakitai 0:3f9dbf1e2cb0 25
hideakitai 0:3f9dbf1e2cb0 26
hideakitai 0:3f9dbf1e2cb0 27 namespace type {
hideakitai 0:3f9dbf1e2cb0 28 enum object_type {
hideakitai 0:3f9dbf1e2cb0 29 NIL = MSGPACK_OBJECT_NIL,
hideakitai 0:3f9dbf1e2cb0 30 BOOLEAN = MSGPACK_OBJECT_BOOLEAN,
hideakitai 0:3f9dbf1e2cb0 31 POSITIVE_INTEGER = MSGPACK_OBJECT_POSITIVE_INTEGER,
hideakitai 0:3f9dbf1e2cb0 32 NEGATIVE_INTEGER = MSGPACK_OBJECT_NEGATIVE_INTEGER,
hideakitai 0:3f9dbf1e2cb0 33 FLOAT = MSGPACK_OBJECT_FLOAT,
hideakitai 0:3f9dbf1e2cb0 34 #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
hideakitai 0:3f9dbf1e2cb0 35 DOUBLE = MSGPACK_OBJECT_DOUBLE, // obsolete
hideakitai 0:3f9dbf1e2cb0 36 #endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
hideakitai 0:3f9dbf1e2cb0 37 STR = MSGPACK_OBJECT_STR,
hideakitai 0:3f9dbf1e2cb0 38 BIN = MSGPACK_OBJECT_BIN,
hideakitai 0:3f9dbf1e2cb0 39 ARRAY = MSGPACK_OBJECT_ARRAY,
hideakitai 0:3f9dbf1e2cb0 40 MAP = MSGPACK_OBJECT_MAP,
hideakitai 0:3f9dbf1e2cb0 41 EXT = MSGPACK_OBJECT_EXT
hideakitai 0:3f9dbf1e2cb0 42 };
hideakitai 0:3f9dbf1e2cb0 43 }
hideakitai 0:3f9dbf1e2cb0 44
hideakitai 0:3f9dbf1e2cb0 45
hideakitai 0:3f9dbf1e2cb0 46 struct object;
hideakitai 0:3f9dbf1e2cb0 47 struct object_kv;
hideakitai 0:3f9dbf1e2cb0 48
hideakitai 0:3f9dbf1e2cb0 49 struct object_array {
hideakitai 0:3f9dbf1e2cb0 50 uint32_t size;
hideakitai 0:3f9dbf1e2cb0 51 msgpack::object* ptr;
hideakitai 0:3f9dbf1e2cb0 52 };
hideakitai 0:3f9dbf1e2cb0 53
hideakitai 0:3f9dbf1e2cb0 54 struct object_map {
hideakitai 0:3f9dbf1e2cb0 55 uint32_t size;
hideakitai 0:3f9dbf1e2cb0 56 msgpack::object_kv* ptr;
hideakitai 0:3f9dbf1e2cb0 57 };
hideakitai 0:3f9dbf1e2cb0 58
hideakitai 0:3f9dbf1e2cb0 59 struct object_str {
hideakitai 0:3f9dbf1e2cb0 60 uint32_t size;
hideakitai 0:3f9dbf1e2cb0 61 const char* ptr;
hideakitai 0:3f9dbf1e2cb0 62 };
hideakitai 0:3f9dbf1e2cb0 63
hideakitai 0:3f9dbf1e2cb0 64 struct object_bin {
hideakitai 0:3f9dbf1e2cb0 65 uint32_t size;
hideakitai 0:3f9dbf1e2cb0 66 const char* ptr;
hideakitai 0:3f9dbf1e2cb0 67 };
hideakitai 0:3f9dbf1e2cb0 68
hideakitai 0:3f9dbf1e2cb0 69 struct object_ext {
hideakitai 0:3f9dbf1e2cb0 70 int8_t type() const { return ptr[0]; }
hideakitai 0:3f9dbf1e2cb0 71 const char* data() const { return &ptr[1]; }
hideakitai 0:3f9dbf1e2cb0 72 uint32_t size;
hideakitai 0:3f9dbf1e2cb0 73 const char* ptr;
hideakitai 0:3f9dbf1e2cb0 74 };
hideakitai 0:3f9dbf1e2cb0 75
hideakitai 0:3f9dbf1e2cb0 76
hideakitai 0:3f9dbf1e2cb0 77 #if !defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 78 struct object;
hideakitai 0:3f9dbf1e2cb0 79
hideakitai 0:3f9dbf1e2cb0 80 namespace adaptor {
hideakitai 0:3f9dbf1e2cb0 81 template <typename T, typename Enabler = void>
hideakitai 0:3f9dbf1e2cb0 82 struct as;
hideakitai 0:3f9dbf1e2cb0 83 } // namespace adaptor
hideakitai 0:3f9dbf1e2cb0 84
hideakitai 0:3f9dbf1e2cb0 85 template <typename T>
hideakitai 0:3f9dbf1e2cb0 86 struct has_as {
hideakitai 0:3f9dbf1e2cb0 87 private:
hideakitai 0:3f9dbf1e2cb0 88 template <typename U>
hideakitai 0:3f9dbf1e2cb0 89 static auto check(U*) ->
hideakitai 0:3f9dbf1e2cb0 90 typename std::is_same<
hideakitai 0:3f9dbf1e2cb0 91 decltype(msgpack::adaptor::as<U>()(std::declval<msgpack::object>())),
hideakitai 0:3f9dbf1e2cb0 92 T>::type;
hideakitai 0:3f9dbf1e2cb0 93 template <typename>
hideakitai 0:3f9dbf1e2cb0 94 static std::false_type check(...);
hideakitai 0:3f9dbf1e2cb0 95 public:
hideakitai 0:3f9dbf1e2cb0 96 using type = decltype(check<T>(nullptr));
hideakitai 0:3f9dbf1e2cb0 97 static constexpr bool value = type::value;
hideakitai 0:3f9dbf1e2cb0 98 };
hideakitai 0:3f9dbf1e2cb0 99
hideakitai 0:3f9dbf1e2cb0 100 #endif // !defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 101
hideakitai 0:3f9dbf1e2cb0 102 /// Object class that corresponding to MessagePack format object
hideakitai 0:3f9dbf1e2cb0 103 /**
hideakitai 0:3f9dbf1e2cb0 104 * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object
hideakitai 0:3f9dbf1e2cb0 105 */
hideakitai 0:3f9dbf1e2cb0 106 struct object {
hideakitai 0:3f9dbf1e2cb0 107 union union_type {
hideakitai 0:3f9dbf1e2cb0 108 bool boolean;
hideakitai 0:3f9dbf1e2cb0 109 uint64_t u64;
hideakitai 0:3f9dbf1e2cb0 110 int64_t i64;
hideakitai 0:3f9dbf1e2cb0 111 #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
hideakitai 0:3f9dbf1e2cb0 112 double dec; // obsolete
hideakitai 0:3f9dbf1e2cb0 113 #endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
hideakitai 0:3f9dbf1e2cb0 114 double f64;
hideakitai 0:3f9dbf1e2cb0 115 msgpack::object_array array;
hideakitai 0:3f9dbf1e2cb0 116 msgpack::object_map map;
hideakitai 0:3f9dbf1e2cb0 117 msgpack::object_str str;
hideakitai 0:3f9dbf1e2cb0 118 msgpack::object_bin bin;
hideakitai 0:3f9dbf1e2cb0 119 msgpack::object_ext ext;
hideakitai 0:3f9dbf1e2cb0 120 };
hideakitai 0:3f9dbf1e2cb0 121
hideakitai 0:3f9dbf1e2cb0 122 msgpack::type::object_type type;
hideakitai 0:3f9dbf1e2cb0 123 union_type via;
hideakitai 0:3f9dbf1e2cb0 124
hideakitai 0:3f9dbf1e2cb0 125 /// Cheking nil
hideakitai 0:3f9dbf1e2cb0 126 /**
hideakitai 0:3f9dbf1e2cb0 127 * @return If the object is nil, then return true, else return false.
hideakitai 0:3f9dbf1e2cb0 128 */
hideakitai 0:3f9dbf1e2cb0 129 bool is_nil() const { return type == msgpack::type::NIL; }
hideakitai 0:3f9dbf1e2cb0 130
hideakitai 0:3f9dbf1e2cb0 131 #if defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 132
hideakitai 0:3f9dbf1e2cb0 133 /// Get value as T
hideakitai 0:3f9dbf1e2cb0 134 /**
hideakitai 0:3f9dbf1e2cb0 135 * If the object can't be converted to T, msgpack::type_error would be thrown.
hideakitai 0:3f9dbf1e2cb0 136 * @tparam T The type you want to get.
hideakitai 0:3f9dbf1e2cb0 137 * @return The converted object.
hideakitai 0:3f9dbf1e2cb0 138 */
hideakitai 0:3f9dbf1e2cb0 139 template <typename T>
hideakitai 0:3f9dbf1e2cb0 140 T as() const;
hideakitai 0:3f9dbf1e2cb0 141
hideakitai 0:3f9dbf1e2cb0 142 #else // defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 143
hideakitai 0:3f9dbf1e2cb0 144 /// Get value as T
hideakitai 0:3f9dbf1e2cb0 145 /**
hideakitai 0:3f9dbf1e2cb0 146 * If the object can't be converted to T, msgpack::type_error would be thrown.
hideakitai 0:3f9dbf1e2cb0 147 * @tparam T The type you want to get.
hideakitai 0:3f9dbf1e2cb0 148 * @return The converted object.
hideakitai 0:3f9dbf1e2cb0 149 */
hideakitai 0:3f9dbf1e2cb0 150 template <typename T>
hideakitai 0:3f9dbf1e2cb0 151 typename std::enable_if<msgpack::has_as<T>::value, T>::type as() const;
hideakitai 0:3f9dbf1e2cb0 152
hideakitai 0:3f9dbf1e2cb0 153 /// Get value as T
hideakitai 0:3f9dbf1e2cb0 154 /**
hideakitai 0:3f9dbf1e2cb0 155 * If the object can't be converted to T, msgpack::type_error would be thrown.
hideakitai 0:3f9dbf1e2cb0 156 * @tparam T The type you want to get.
hideakitai 0:3f9dbf1e2cb0 157 * @return The converted object.
hideakitai 0:3f9dbf1e2cb0 158 */
hideakitai 0:3f9dbf1e2cb0 159 template <typename T>
hideakitai 0:3f9dbf1e2cb0 160 typename std::enable_if<!msgpack::has_as<T>::value, T>::type as() const;
hideakitai 0:3f9dbf1e2cb0 161
hideakitai 0:3f9dbf1e2cb0 162 #endif // defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 163
hideakitai 0:3f9dbf1e2cb0 164 /// Convert the object
hideakitai 0:3f9dbf1e2cb0 165 /**
hideakitai 0:3f9dbf1e2cb0 166 * If the object can't be converted to T, msgpack::type_error would be thrown.
hideakitai 0:3f9dbf1e2cb0 167 * @tparam T The type of v.
hideakitai 0:3f9dbf1e2cb0 168 * @param v The value you want to get. `v` is output parameter. `v` is overwritten by converted value from the object.
hideakitai 0:3f9dbf1e2cb0 169 * @return The reference of `v`.
hideakitai 0:3f9dbf1e2cb0 170 */
hideakitai 0:3f9dbf1e2cb0 171 template <typename T>
hideakitai 0:3f9dbf1e2cb0 172 T& convert(T& v) const;
hideakitai 0:3f9dbf1e2cb0 173
hideakitai 0:3f9dbf1e2cb0 174
hideakitai 0:3f9dbf1e2cb0 175 #if !defined(MSGPACK_DISABLE_LEGACY_CONVERT)
hideakitai 0:3f9dbf1e2cb0 176 /// Convert the object (obsolete)
hideakitai 0:3f9dbf1e2cb0 177 /**
hideakitai 0:3f9dbf1e2cb0 178 * If the object can't be converted to T, msgpack::type_error would be thrown.
hideakitai 0:3f9dbf1e2cb0 179 * @tparam T The type of v.
hideakitai 0:3f9dbf1e2cb0 180 * @param v The pointer of the value you want to get. `v` is output parameter. `*v` is overwritten by converted value from the object.
hideakitai 0:3f9dbf1e2cb0 181 * @return The pointer of `v`.
hideakitai 0:3f9dbf1e2cb0 182 */
hideakitai 0:3f9dbf1e2cb0 183 template <typename T>
hideakitai 0:3f9dbf1e2cb0 184 T* convert(T* v) const;
hideakitai 0:3f9dbf1e2cb0 185 #endif // !defined(MSGPACK_DISABLE_LEGACY_CONVERT)
hideakitai 0:3f9dbf1e2cb0 186
hideakitai 0:3f9dbf1e2cb0 187 /// Convert the object if not nil
hideakitai 0:3f9dbf1e2cb0 188 /**
hideakitai 0:3f9dbf1e2cb0 189 * If the object is not nil and can't be converted to T, msgpack::type_error would be thrown.
hideakitai 0:3f9dbf1e2cb0 190 * @tparam T The type of v.
hideakitai 0:3f9dbf1e2cb0 191 * @param v The value you want to get. `v` is output parameter. `v` is overwritten by converted value from the object if the object is not nil.
hideakitai 0:3f9dbf1e2cb0 192 * @return If the object is nil, then return false, else return true.
hideakitai 0:3f9dbf1e2cb0 193 */
hideakitai 0:3f9dbf1e2cb0 194 template <typename T>
hideakitai 0:3f9dbf1e2cb0 195 bool convert_if_not_nil(T& v) const;
hideakitai 0:3f9dbf1e2cb0 196
hideakitai 0:3f9dbf1e2cb0 197 /// Default constructor. The object is set to nil.
hideakitai 0:3f9dbf1e2cb0 198 object();
hideakitai 0:3f9dbf1e2cb0 199
hideakitai 0:3f9dbf1e2cb0 200 /// Copy constructor. Object is shallow copied.
hideakitai 0:3f9dbf1e2cb0 201 object(const msgpack_object& o);
hideakitai 0:3f9dbf1e2cb0 202
hideakitai 0:3f9dbf1e2cb0 203 /// Construct object from T
hideakitai 0:3f9dbf1e2cb0 204 /**
hideakitai 0:3f9dbf1e2cb0 205 * If `v` is the type that is corresponding to MessegePack format str, bin, ext, array, or map,
hideakitai 0:3f9dbf1e2cb0 206 * you need to call `object(const T& v, msgpack::zone& z)` instead of this constructor.
hideakitai 0:3f9dbf1e2cb0 207 *
hideakitai 0:3f9dbf1e2cb0 208 * @tparam T The type of `v`.
hideakitai 0:3f9dbf1e2cb0 209 * @param v The value you want to convert.
hideakitai 0:3f9dbf1e2cb0 210 */
hideakitai 0:3f9dbf1e2cb0 211 template <typename T>
hideakitai 0:3f9dbf1e2cb0 212 explicit object(const T& v);
hideakitai 0:3f9dbf1e2cb0 213
hideakitai 0:3f9dbf1e2cb0 214 /// Construct object from T
hideakitai 0:3f9dbf1e2cb0 215 /**
hideakitai 0:3f9dbf1e2cb0 216 * The object is constructed on the zone `z`.
hideakitai 0:3f9dbf1e2cb0 217 * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object
hideakitai 0:3f9dbf1e2cb0 218 *
hideakitai 0:3f9dbf1e2cb0 219 * @tparam T The type of `v`.
hideakitai 0:3f9dbf1e2cb0 220 * @param v The value you want to convert.
hideakitai 0:3f9dbf1e2cb0 221 * @param z The zone that is used by the object.
hideakitai 0:3f9dbf1e2cb0 222 */
hideakitai 0:3f9dbf1e2cb0 223 template <typename T>
hideakitai 0:3f9dbf1e2cb0 224 object(const T& v, msgpack::zone& z);
hideakitai 0:3f9dbf1e2cb0 225
hideakitai 0:3f9dbf1e2cb0 226 /// Construct object from T (obsolete)
hideakitai 0:3f9dbf1e2cb0 227 /**
hideakitai 0:3f9dbf1e2cb0 228 * The object is constructed on the zone `z`.
hideakitai 0:3f9dbf1e2cb0 229 * Use `object(const T& v, msgpack::zone& z)` instead of this constructor.
hideakitai 0:3f9dbf1e2cb0 230 * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object
hideakitai 0:3f9dbf1e2cb0 231 *
hideakitai 0:3f9dbf1e2cb0 232 * @tparam T The type of `v`.
hideakitai 0:3f9dbf1e2cb0 233 * @param v The value you want to convert.
hideakitai 0:3f9dbf1e2cb0 234 * @param z The pointer to the zone that is used by the object.
hideakitai 0:3f9dbf1e2cb0 235 */
hideakitai 0:3f9dbf1e2cb0 236 template <typename T>
hideakitai 0:3f9dbf1e2cb0 237 object(const T& v, msgpack::zone* z);
hideakitai 0:3f9dbf1e2cb0 238
hideakitai 0:3f9dbf1e2cb0 239 template <typename T>
hideakitai 0:3f9dbf1e2cb0 240 object& operator=(const T& v);
hideakitai 0:3f9dbf1e2cb0 241
hideakitai 0:3f9dbf1e2cb0 242 operator msgpack_object() const;
hideakitai 0:3f9dbf1e2cb0 243
hideakitai 0:3f9dbf1e2cb0 244 struct with_zone;
hideakitai 0:3f9dbf1e2cb0 245
hideakitai 0:3f9dbf1e2cb0 246 private:
hideakitai 0:3f9dbf1e2cb0 247 struct implicit_type;
hideakitai 0:3f9dbf1e2cb0 248
hideakitai 0:3f9dbf1e2cb0 249 public:
hideakitai 0:3f9dbf1e2cb0 250 implicit_type convert() const;
hideakitai 0:3f9dbf1e2cb0 251 };
hideakitai 0:3f9dbf1e2cb0 252
hideakitai 0:3f9dbf1e2cb0 253 class type_error : public std::bad_cast { };
hideakitai 0:3f9dbf1e2cb0 254
hideakitai 0:3f9dbf1e2cb0 255 struct object_kv {
hideakitai 0:3f9dbf1e2cb0 256 msgpack::object key;
hideakitai 0:3f9dbf1e2cb0 257 msgpack::object val;
hideakitai 0:3f9dbf1e2cb0 258 };
hideakitai 0:3f9dbf1e2cb0 259
hideakitai 0:3f9dbf1e2cb0 260 struct object::with_zone : object {
hideakitai 0:3f9dbf1e2cb0 261 with_zone(msgpack::zone& z) : zone(z) { }
hideakitai 0:3f9dbf1e2cb0 262 msgpack::zone& zone;
hideakitai 0:3f9dbf1e2cb0 263 private:
hideakitai 0:3f9dbf1e2cb0 264 with_zone();
hideakitai 0:3f9dbf1e2cb0 265 };
hideakitai 0:3f9dbf1e2cb0 266
hideakitai 0:3f9dbf1e2cb0 267 /// @cond
hideakitai 0:3f9dbf1e2cb0 268 } // MSGPACK_API_VERSION_NAMESPACE(v1)
hideakitai 0:3f9dbf1e2cb0 269 /// @endcond
hideakitai 0:3f9dbf1e2cb0 270
hideakitai 0:3f9dbf1e2cb0 271 } // namespace msgpack
hideakitai 0:3f9dbf1e2cb0 272
hideakitai 0:3f9dbf1e2cb0 273 #endif // MSGPACK_OBJECT_FWD_HPP