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-2009 FURUHASHI Sadayuki
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_TYPE_ARRAY_REF_HPP
hideakitai 0:3f9dbf1e2cb0 11 #define MSGPACK_TYPE_ARRAY_REF_HPP
hideakitai 0:3f9dbf1e2cb0 12
hideakitai 0:3f9dbf1e2cb0 13 #include "msgpack/versioning.hpp"
hideakitai 0:3f9dbf1e2cb0 14 #include "msgpack/adaptor/adaptor_base.hpp"
hideakitai 0:3f9dbf1e2cb0 15 #include "msgpack/adaptor/check_container_size.hpp"
hideakitai 0:3f9dbf1e2cb0 16 #include <cstring>
hideakitai 0:3f9dbf1e2cb0 17 #include <string>
hideakitai 0:3f9dbf1e2cb0 18
hideakitai 0:3f9dbf1e2cb0 19 namespace msgpack {
hideakitai 0:3f9dbf1e2cb0 20
hideakitai 0:3f9dbf1e2cb0 21 /// @cond
hideakitai 0:3f9dbf1e2cb0 22 MSGPACK_API_VERSION_NAMESPACE(v1) {
hideakitai 0:3f9dbf1e2cb0 23 /// @endcond
hideakitai 0:3f9dbf1e2cb0 24
hideakitai 0:3f9dbf1e2cb0 25 namespace type {
hideakitai 0:3f9dbf1e2cb0 26
hideakitai 0:3f9dbf1e2cb0 27 template <typename T>
hideakitai 0:3f9dbf1e2cb0 28 struct array_ref {
hideakitai 0:3f9dbf1e2cb0 29 array_ref() : data(nullptr) {}
hideakitai 0:3f9dbf1e2cb0 30 array_ref(T& t) : data(&t) {}
hideakitai 0:3f9dbf1e2cb0 31
hideakitai 0:3f9dbf1e2cb0 32 T* data;
hideakitai 0:3f9dbf1e2cb0 33
hideakitai 0:3f9dbf1e2cb0 34 template <typename U>
hideakitai 0:3f9dbf1e2cb0 35 bool operator==(array_ref<U> const& t) const {
hideakitai 0:3f9dbf1e2cb0 36 return *data == *t.data;
hideakitai 0:3f9dbf1e2cb0 37 }
hideakitai 0:3f9dbf1e2cb0 38 template <typename U>
hideakitai 0:3f9dbf1e2cb0 39 bool operator!=(array_ref<U> const& t) const {
hideakitai 0:3f9dbf1e2cb0 40 return !(*data == *t.data);
hideakitai 0:3f9dbf1e2cb0 41 }
hideakitai 0:3f9dbf1e2cb0 42 template <typename U>
hideakitai 0:3f9dbf1e2cb0 43 bool operator< (array_ref<U> const& t) const
hideakitai 0:3f9dbf1e2cb0 44 {
hideakitai 0:3f9dbf1e2cb0 45 return *data < *t.data;
hideakitai 0:3f9dbf1e2cb0 46 }
hideakitai 0:3f9dbf1e2cb0 47 template <typename U>
hideakitai 0:3f9dbf1e2cb0 48 bool operator> (array_ref<U> const& t) const
hideakitai 0:3f9dbf1e2cb0 49 {
hideakitai 0:3f9dbf1e2cb0 50 return *t.data < *data;
hideakitai 0:3f9dbf1e2cb0 51 }
hideakitai 0:3f9dbf1e2cb0 52 template <typename U>
hideakitai 0:3f9dbf1e2cb0 53 bool operator<= (array_ref<U> const& t) const
hideakitai 0:3f9dbf1e2cb0 54 {
hideakitai 0:3f9dbf1e2cb0 55 return !(*t.data < *data);
hideakitai 0:3f9dbf1e2cb0 56 }
hideakitai 0:3f9dbf1e2cb0 57 template <typename U>
hideakitai 0:3f9dbf1e2cb0 58 bool operator>= (array_ref<U> const& t) const
hideakitai 0:3f9dbf1e2cb0 59 {
hideakitai 0:3f9dbf1e2cb0 60 return !(*data < *t.data);
hideakitai 0:3f9dbf1e2cb0 61 }
hideakitai 0:3f9dbf1e2cb0 62 };
hideakitai 0:3f9dbf1e2cb0 63
hideakitai 0:3f9dbf1e2cb0 64 template <typename T>
hideakitai 0:3f9dbf1e2cb0 65 inline array_ref<T const> make_array_ref(T const& t) {
hideakitai 0:3f9dbf1e2cb0 66 return array_ref<T const>(t);
hideakitai 0:3f9dbf1e2cb0 67 }
hideakitai 0:3f9dbf1e2cb0 68
hideakitai 0:3f9dbf1e2cb0 69 template <typename T>
hideakitai 0:3f9dbf1e2cb0 70 inline array_ref<T> make_array_ref(T& t) {
hideakitai 0:3f9dbf1e2cb0 71 return array_ref<T>(t);
hideakitai 0:3f9dbf1e2cb0 72 }
hideakitai 0:3f9dbf1e2cb0 73
hideakitai 0:3f9dbf1e2cb0 74
hideakitai 0:3f9dbf1e2cb0 75 } // namespace type
hideakitai 0:3f9dbf1e2cb0 76
hideakitai 0:3f9dbf1e2cb0 77 namespace adaptor {
hideakitai 0:3f9dbf1e2cb0 78
hideakitai 0:3f9dbf1e2cb0 79 template <typename T>
hideakitai 0:3f9dbf1e2cb0 80 struct convert<msgpack::type::array_ref<T> > {
hideakitai 0:3f9dbf1e2cb0 81 msgpack::object const& operator()(msgpack::object const& o, msgpack::type::array_ref<T>& v) const {
hideakitai 0:3f9dbf1e2cb0 82 if (!v.data) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 83 if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 84 if (v.data->size() < o.via.bin.size) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 85 if (o.via.array.size > 0) {
hideakitai 0:3f9dbf1e2cb0 86 msgpack::object* p = o.via.array.ptr;
hideakitai 0:3f9dbf1e2cb0 87 msgpack::object* const pend = o.via.array.ptr + o.via.array.size;
hideakitai 0:3f9dbf1e2cb0 88 typename T::iterator it = v.data->begin();
hideakitai 0:3f9dbf1e2cb0 89 do {
hideakitai 0:3f9dbf1e2cb0 90 p->convert(*it);
hideakitai 0:3f9dbf1e2cb0 91 ++p;
hideakitai 0:3f9dbf1e2cb0 92 ++it;
hideakitai 0:3f9dbf1e2cb0 93 } while(p < pend);
hideakitai 0:3f9dbf1e2cb0 94 }
hideakitai 0:3f9dbf1e2cb0 95 return o;
hideakitai 0:3f9dbf1e2cb0 96 }
hideakitai 0:3f9dbf1e2cb0 97 };
hideakitai 0:3f9dbf1e2cb0 98
hideakitai 0:3f9dbf1e2cb0 99 template <typename T>
hideakitai 0:3f9dbf1e2cb0 100 struct convert<msgpack::type::array_ref<std::vector<T> > > {
hideakitai 0:3f9dbf1e2cb0 101 msgpack::object const& operator()(msgpack::object const& o, msgpack::type::array_ref<std::vector<T> >& v) const {
hideakitai 0:3f9dbf1e2cb0 102 if (!v.data) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 103 if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 104 v.data->resize(o.via.bin.size);
hideakitai 0:3f9dbf1e2cb0 105 if (o.via.array.size > 0) {
hideakitai 0:3f9dbf1e2cb0 106 msgpack::object* p = o.via.array.ptr;
hideakitai 0:3f9dbf1e2cb0 107 msgpack::object* const pend = o.via.array.ptr + o.via.array.size;
hideakitai 0:3f9dbf1e2cb0 108 typename std::vector<T>::iterator it = v.data->begin();
hideakitai 0:3f9dbf1e2cb0 109 do {
hideakitai 0:3f9dbf1e2cb0 110 p->convert(*it);
hideakitai 0:3f9dbf1e2cb0 111 ++p;
hideakitai 0:3f9dbf1e2cb0 112 ++it;
hideakitai 0:3f9dbf1e2cb0 113 } while(p < pend);
hideakitai 0:3f9dbf1e2cb0 114 }
hideakitai 0:3f9dbf1e2cb0 115 return o;
hideakitai 0:3f9dbf1e2cb0 116 }
hideakitai 0:3f9dbf1e2cb0 117 };
hideakitai 0:3f9dbf1e2cb0 118
hideakitai 0:3f9dbf1e2cb0 119 template <typename T>
hideakitai 0:3f9dbf1e2cb0 120 struct pack<msgpack::type::array_ref<T> > {
hideakitai 0:3f9dbf1e2cb0 121 template <typename Stream>
hideakitai 0:3f9dbf1e2cb0 122 msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const msgpack::type::array_ref<T>& v) const {
hideakitai 0:3f9dbf1e2cb0 123 if (!v.data) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 124 uint32_t size = checked_get_container_size(v.data->size());
hideakitai 0:3f9dbf1e2cb0 125 o.pack_array(size);
hideakitai 0:3f9dbf1e2cb0 126 for (typename T::const_iterator it(v.data->begin()), it_end(v.data->end());
hideakitai 0:3f9dbf1e2cb0 127 it != it_end; ++it) {
hideakitai 0:3f9dbf1e2cb0 128 o.pack(*it);
hideakitai 0:3f9dbf1e2cb0 129 }
hideakitai 0:3f9dbf1e2cb0 130 return o;
hideakitai 0:3f9dbf1e2cb0 131 }
hideakitai 0:3f9dbf1e2cb0 132 };
hideakitai 0:3f9dbf1e2cb0 133
hideakitai 0:3f9dbf1e2cb0 134 template <typename T>
hideakitai 0:3f9dbf1e2cb0 135 struct object_with_zone<msgpack::type::array_ref<T> > {
hideakitai 0:3f9dbf1e2cb0 136 void operator()(msgpack::object::with_zone& o, const msgpack::type::array_ref<T>& v) const {
hideakitai 0:3f9dbf1e2cb0 137 if (!v.data) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 138 o.type = msgpack::type::ARRAY;
hideakitai 0:3f9dbf1e2cb0 139 if (v.data->empty()) {
hideakitai 0:3f9dbf1e2cb0 140 o.via.array.ptr = nullptr;
hideakitai 0:3f9dbf1e2cb0 141 o.via.array.size = 0;
hideakitai 0:3f9dbf1e2cb0 142 }
hideakitai 0:3f9dbf1e2cb0 143 else {
hideakitai 0:3f9dbf1e2cb0 144 uint32_t size = checked_get_container_size(v.data->size());
hideakitai 0:3f9dbf1e2cb0 145 msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size));
hideakitai 0:3f9dbf1e2cb0 146 msgpack::object* const pend = p + size;
hideakitai 0:3f9dbf1e2cb0 147 o.via.array.ptr = p;
hideakitai 0:3f9dbf1e2cb0 148 o.via.array.size = size;
hideakitai 0:3f9dbf1e2cb0 149 typename T::const_iterator it(v.data->begin());
hideakitai 0:3f9dbf1e2cb0 150 do {
hideakitai 0:3f9dbf1e2cb0 151 #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__)
hideakitai 0:3f9dbf1e2cb0 152 #pragma GCC diagnostic push
hideakitai 0:3f9dbf1e2cb0 153 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
hideakitai 0:3f9dbf1e2cb0 154 #endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__)
hideakitai 0:3f9dbf1e2cb0 155 *p = msgpack::object(*it, o.zone);
hideakitai 0:3f9dbf1e2cb0 156 #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__)
hideakitai 0:3f9dbf1e2cb0 157 #pragma GCC diagnostic pop
hideakitai 0:3f9dbf1e2cb0 158 #endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__)
hideakitai 0:3f9dbf1e2cb0 159 ++p;
hideakitai 0:3f9dbf1e2cb0 160 ++it;
hideakitai 0:3f9dbf1e2cb0 161 } while(p < pend);
hideakitai 0:3f9dbf1e2cb0 162 }
hideakitai 0:3f9dbf1e2cb0 163 }
hideakitai 0:3f9dbf1e2cb0 164 };
hideakitai 0:3f9dbf1e2cb0 165
hideakitai 0:3f9dbf1e2cb0 166 } // namespace adaptor
hideakitai 0:3f9dbf1e2cb0 167
hideakitai 0:3f9dbf1e2cb0 168 /// @cond
hideakitai 0:3f9dbf1e2cb0 169 } // MSGPACK_API_VERSION_NAMESPACE(v1)
hideakitai 0:3f9dbf1e2cb0 170 /// @endcond
hideakitai 0:3f9dbf1e2cb0 171
hideakitai 0:3f9dbf1e2cb0 172 } // namespace msgpack
hideakitai 0:3f9dbf1e2cb0 173
hideakitai 0:3f9dbf1e2cb0 174 #endif // MSGPACK_TYPE_ARRAY_REF_HPP