Dependents:   hello_message_pack

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

Committer:
hideakitai
Date:
Sat Feb 13 01:53:11 2016 +0000
Revision:
0:3f9dbf1e2cb0
first commit

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-2015 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_SET_HPP
hideakitai 0:3f9dbf1e2cb0 11 #define MSGPACK_TYPE_SET_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
hideakitai 0:3f9dbf1e2cb0 17 #include <set>
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 adaptor {
hideakitai 0:3f9dbf1e2cb0 26
hideakitai 0:3f9dbf1e2cb0 27 #if !defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 28
hideakitai 0:3f9dbf1e2cb0 29 template <typename T, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 30 struct as<std::set<T, Compare, Alloc>, typename std::enable_if<msgpack::has_as<T>::value>::type> {
hideakitai 0:3f9dbf1e2cb0 31 std::set<T, Compare, Alloc> operator()(msgpack::object const& o) const {
hideakitai 0:3f9dbf1e2cb0 32 if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 33 msgpack::object* p = o.via.array.ptr + o.via.array.size;
hideakitai 0:3f9dbf1e2cb0 34 msgpack::object* const pbegin = o.via.array.ptr;
hideakitai 0:3f9dbf1e2cb0 35 std::set<T, Compare, Alloc> v;
hideakitai 0:3f9dbf1e2cb0 36 while (p > pbegin) {
hideakitai 0:3f9dbf1e2cb0 37 --p;
hideakitai 0:3f9dbf1e2cb0 38 v.insert(p->as<T>());
hideakitai 0:3f9dbf1e2cb0 39 }
hideakitai 0:3f9dbf1e2cb0 40 return v;
hideakitai 0:3f9dbf1e2cb0 41 }
hideakitai 0:3f9dbf1e2cb0 42 };
hideakitai 0:3f9dbf1e2cb0 43
hideakitai 0:3f9dbf1e2cb0 44 #endif // !defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 45
hideakitai 0:3f9dbf1e2cb0 46 template <typename T, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 47 struct convert<std::set<T, Compare, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 48 msgpack::object const& operator()(msgpack::object const& o, std::set<T, Compare, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 49 if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 50 msgpack::object* p = o.via.array.ptr + o.via.array.size;
hideakitai 0:3f9dbf1e2cb0 51 msgpack::object* const pbegin = o.via.array.ptr;
hideakitai 0:3f9dbf1e2cb0 52 std::set<T, Compare, Alloc> tmp;
hideakitai 0:3f9dbf1e2cb0 53 while (p > pbegin) {
hideakitai 0:3f9dbf1e2cb0 54 --p;
hideakitai 0:3f9dbf1e2cb0 55 tmp.insert(p->as<T>());
hideakitai 0:3f9dbf1e2cb0 56 }
hideakitai 0:3f9dbf1e2cb0 57 #if __cplusplus >= 201103L
hideakitai 0:3f9dbf1e2cb0 58 v = std::move(tmp);
hideakitai 0:3f9dbf1e2cb0 59 #else
hideakitai 0:3f9dbf1e2cb0 60 tmp.swap(v);
hideakitai 0:3f9dbf1e2cb0 61 #endif
hideakitai 0:3f9dbf1e2cb0 62 return o;
hideakitai 0:3f9dbf1e2cb0 63 }
hideakitai 0:3f9dbf1e2cb0 64 };
hideakitai 0:3f9dbf1e2cb0 65
hideakitai 0:3f9dbf1e2cb0 66 template <typename T, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 67 struct pack<std::set<T, Compare, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 68 template <typename Stream>
hideakitai 0:3f9dbf1e2cb0 69 msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::set<T, Compare, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 70 uint32_t size = checked_get_container_size(v.size());
hideakitai 0:3f9dbf1e2cb0 71 o.pack_array(size);
hideakitai 0:3f9dbf1e2cb0 72 for (typename std::set<T, Compare, Alloc>::const_iterator it(v.begin()), it_end(v.end());
hideakitai 0:3f9dbf1e2cb0 73 it != it_end; ++it) {
hideakitai 0:3f9dbf1e2cb0 74 o.pack(*it);
hideakitai 0:3f9dbf1e2cb0 75 }
hideakitai 0:3f9dbf1e2cb0 76 return o;
hideakitai 0:3f9dbf1e2cb0 77 }
hideakitai 0:3f9dbf1e2cb0 78 };
hideakitai 0:3f9dbf1e2cb0 79
hideakitai 0:3f9dbf1e2cb0 80 template <typename T, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 81 struct object_with_zone<std::set<T, Compare, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 82 void operator()(msgpack::object::with_zone& o, const std::set<T, Compare, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 83 o.type = msgpack::type::ARRAY;
hideakitai 0:3f9dbf1e2cb0 84 if (v.empty()) {
hideakitai 0:3f9dbf1e2cb0 85 o.via.array.ptr = nullptr;
hideakitai 0:3f9dbf1e2cb0 86 o.via.array.size = 0;
hideakitai 0:3f9dbf1e2cb0 87 }
hideakitai 0:3f9dbf1e2cb0 88 else {
hideakitai 0:3f9dbf1e2cb0 89 uint32_t size = checked_get_container_size(v.size());
hideakitai 0:3f9dbf1e2cb0 90 msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size));
hideakitai 0:3f9dbf1e2cb0 91 msgpack::object* const pend = p + size;
hideakitai 0:3f9dbf1e2cb0 92 o.via.array.ptr = p;
hideakitai 0:3f9dbf1e2cb0 93 o.via.array.size = size;
hideakitai 0:3f9dbf1e2cb0 94 typename std::set<T, Compare, Alloc>::const_iterator it(v.begin());
hideakitai 0:3f9dbf1e2cb0 95 do {
hideakitai 0:3f9dbf1e2cb0 96 *p = msgpack::object(*it, o.zone);
hideakitai 0:3f9dbf1e2cb0 97 ++p;
hideakitai 0:3f9dbf1e2cb0 98 ++it;
hideakitai 0:3f9dbf1e2cb0 99 } while(p < pend);
hideakitai 0:3f9dbf1e2cb0 100 }
hideakitai 0:3f9dbf1e2cb0 101 }
hideakitai 0:3f9dbf1e2cb0 102 };
hideakitai 0:3f9dbf1e2cb0 103
hideakitai 0:3f9dbf1e2cb0 104 #if !defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 105
hideakitai 0:3f9dbf1e2cb0 106 template <typename T, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 107 struct as<std::multiset<T, Compare, Alloc>, typename std::enable_if<msgpack::has_as<T>::value>::type> {
hideakitai 0:3f9dbf1e2cb0 108 std::multiset<T, Compare, Alloc> operator()(msgpack::object const& o) const {
hideakitai 0:3f9dbf1e2cb0 109 if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 110 msgpack::object* p = o.via.array.ptr + o.via.array.size;
hideakitai 0:3f9dbf1e2cb0 111 msgpack::object* const pbegin = o.via.array.ptr;
hideakitai 0:3f9dbf1e2cb0 112 std::multiset<T, Compare, Alloc> v;
hideakitai 0:3f9dbf1e2cb0 113 while (p > pbegin) {
hideakitai 0:3f9dbf1e2cb0 114 --p;
hideakitai 0:3f9dbf1e2cb0 115 v.insert(p->as<T>());
hideakitai 0:3f9dbf1e2cb0 116 }
hideakitai 0:3f9dbf1e2cb0 117 return v;
hideakitai 0:3f9dbf1e2cb0 118 }
hideakitai 0:3f9dbf1e2cb0 119 };
hideakitai 0:3f9dbf1e2cb0 120
hideakitai 0:3f9dbf1e2cb0 121 #endif // !defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 122
hideakitai 0:3f9dbf1e2cb0 123 template <typename T, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 124 struct convert<std::multiset<T, Compare, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 125 msgpack::object const& operator()(msgpack::object const& o, std::multiset<T, Compare, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 126 if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 127 msgpack::object* p = o.via.array.ptr + o.via.array.size;
hideakitai 0:3f9dbf1e2cb0 128 msgpack::object* const pbegin = o.via.array.ptr;
hideakitai 0:3f9dbf1e2cb0 129 std::multiset<T, Compare, Alloc> tmp;
hideakitai 0:3f9dbf1e2cb0 130 while (p > pbegin) {
hideakitai 0:3f9dbf1e2cb0 131 --p;
hideakitai 0:3f9dbf1e2cb0 132 tmp.insert(p->as<T>());
hideakitai 0:3f9dbf1e2cb0 133 }
hideakitai 0:3f9dbf1e2cb0 134 #if __cplusplus >= 201103L
hideakitai 0:3f9dbf1e2cb0 135 v = std::move(tmp);
hideakitai 0:3f9dbf1e2cb0 136 #else
hideakitai 0:3f9dbf1e2cb0 137 tmp.swap(v);
hideakitai 0:3f9dbf1e2cb0 138 #endif
hideakitai 0:3f9dbf1e2cb0 139 return o;
hideakitai 0:3f9dbf1e2cb0 140 }
hideakitai 0:3f9dbf1e2cb0 141 };
hideakitai 0:3f9dbf1e2cb0 142
hideakitai 0:3f9dbf1e2cb0 143 template <typename T, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 144 struct pack<std::multiset<T, Compare, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 145 template <typename Stream>
hideakitai 0:3f9dbf1e2cb0 146 msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::multiset<T, Compare, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 147 uint32_t size = checked_get_container_size(v.size());
hideakitai 0:3f9dbf1e2cb0 148 o.pack_array(size);
hideakitai 0:3f9dbf1e2cb0 149 for (typename std::multiset<T, Compare, Alloc>::const_iterator it(v.begin()), it_end(v.end());
hideakitai 0:3f9dbf1e2cb0 150 it != it_end; ++it) {
hideakitai 0:3f9dbf1e2cb0 151 o.pack(*it);
hideakitai 0:3f9dbf1e2cb0 152 }
hideakitai 0:3f9dbf1e2cb0 153 return o;
hideakitai 0:3f9dbf1e2cb0 154 }
hideakitai 0:3f9dbf1e2cb0 155 };
hideakitai 0:3f9dbf1e2cb0 156
hideakitai 0:3f9dbf1e2cb0 157 template <typename T, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 158 struct object_with_zone<std::multiset<T, Compare, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 159 void operator()(msgpack::object::with_zone& o, const std::multiset<T, Compare, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 160 o.type = msgpack::type::ARRAY;
hideakitai 0:3f9dbf1e2cb0 161 if (v.empty()) {
hideakitai 0:3f9dbf1e2cb0 162 o.via.array.ptr = nullptr;
hideakitai 0:3f9dbf1e2cb0 163 o.via.array.size = 0;
hideakitai 0:3f9dbf1e2cb0 164 } else {
hideakitai 0:3f9dbf1e2cb0 165 uint32_t size = checked_get_container_size(v.size());
hideakitai 0:3f9dbf1e2cb0 166 msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size));
hideakitai 0:3f9dbf1e2cb0 167 msgpack::object* const pend = p + size;
hideakitai 0:3f9dbf1e2cb0 168 o.via.array.ptr = p;
hideakitai 0:3f9dbf1e2cb0 169 o.via.array.size = size;
hideakitai 0:3f9dbf1e2cb0 170 typename std::multiset<T, Compare, Alloc>::const_iterator it(v.begin());
hideakitai 0:3f9dbf1e2cb0 171 do {
hideakitai 0:3f9dbf1e2cb0 172 *p = msgpack::object(*it, o.zone);
hideakitai 0:3f9dbf1e2cb0 173 ++p;
hideakitai 0:3f9dbf1e2cb0 174 ++it;
hideakitai 0:3f9dbf1e2cb0 175 } while(p < pend);
hideakitai 0:3f9dbf1e2cb0 176 }
hideakitai 0:3f9dbf1e2cb0 177 }
hideakitai 0:3f9dbf1e2cb0 178 };
hideakitai 0:3f9dbf1e2cb0 179
hideakitai 0:3f9dbf1e2cb0 180 } // namespace adaptor
hideakitai 0:3f9dbf1e2cb0 181
hideakitai 0:3f9dbf1e2cb0 182 /// @cond
hideakitai 0:3f9dbf1e2cb0 183 } // MSGPACK_API_VERSION_NAMESPACE(v1)
hideakitai 0:3f9dbf1e2cb0 184 /// @endcond
hideakitai 0:3f9dbf1e2cb0 185
hideakitai 0:3f9dbf1e2cb0 186 } // namespace msgpack
hideakitai 0:3f9dbf1e2cb0 187
hideakitai 0:3f9dbf1e2cb0 188 #endif // MSGPACK_TYPE_SET_HPP