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-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_MAP_HPP
hideakitai 0:3f9dbf1e2cb0 11 #define MSGPACK_TYPE_MAP_HPP
hideakitai 0:3f9dbf1e2cb0 12
hideakitai 0:3f9dbf1e2cb0 13 #include "msgpack/versioning.hpp"
hideakitai 0:3f9dbf1e2cb0 14 #include "msgpack/object_fwd.hpp"
hideakitai 0:3f9dbf1e2cb0 15 #include "msgpack/adaptor/check_container_size.hpp"
hideakitai 0:3f9dbf1e2cb0 16
hideakitai 0:3f9dbf1e2cb0 17 #include <map>
hideakitai 0:3f9dbf1e2cb0 18 #include <vector>
hideakitai 0:3f9dbf1e2cb0 19 #include <algorithm>
hideakitai 0:3f9dbf1e2cb0 20
hideakitai 0:3f9dbf1e2cb0 21 namespace msgpack {
hideakitai 0:3f9dbf1e2cb0 22
hideakitai 0:3f9dbf1e2cb0 23 /// @cond
hideakitai 0:3f9dbf1e2cb0 24 MSGPACK_API_VERSION_NAMESPACE(v1) {
hideakitai 0:3f9dbf1e2cb0 25 /// @endcond
hideakitai 0:3f9dbf1e2cb0 26
hideakitai 0:3f9dbf1e2cb0 27 namespace type {
hideakitai 0:3f9dbf1e2cb0 28
hideakitai 0:3f9dbf1e2cb0 29 template <typename K, typename V, typename Compare = std::less<K>, typename Alloc = std::allocator<std::pair<K, V> > >
hideakitai 0:3f9dbf1e2cb0 30 class assoc_vector : public std::vector< std::pair<K, V>, Alloc > {
hideakitai 0:3f9dbf1e2cb0 31 #if !defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 32 using std::vector<std::pair<K, V>, Alloc>::vector;
hideakitai 0:3f9dbf1e2cb0 33 #endif // !defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 34 };
hideakitai 0:3f9dbf1e2cb0 35
hideakitai 0:3f9dbf1e2cb0 36 namespace detail {
hideakitai 0:3f9dbf1e2cb0 37 template <typename K, typename V, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 38 struct pair_first_less {
hideakitai 0:3f9dbf1e2cb0 39 bool operator() (const std::pair<K, V>& x, const std::pair<K, V>& y) const
hideakitai 0:3f9dbf1e2cb0 40 { return Compare()(x.first, y.first); }
hideakitai 0:3f9dbf1e2cb0 41 };
hideakitai 0:3f9dbf1e2cb0 42 }
hideakitai 0:3f9dbf1e2cb0 43
hideakitai 0:3f9dbf1e2cb0 44 } //namespace type
hideakitai 0:3f9dbf1e2cb0 45
hideakitai 0:3f9dbf1e2cb0 46 namespace adaptor {
hideakitai 0:3f9dbf1e2cb0 47
hideakitai 0:3f9dbf1e2cb0 48 #if !defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 49
hideakitai 0:3f9dbf1e2cb0 50 template <typename K, typename V, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 51 struct as<
hideakitai 0:3f9dbf1e2cb0 52 type::assoc_vector<K, V, Compare, Alloc>,
hideakitai 0:3f9dbf1e2cb0 53 typename std::enable_if<msgpack::has_as<K>::value && msgpack::has_as<V>::value>::type> {
hideakitai 0:3f9dbf1e2cb0 54 type::assoc_vector<K, V, Compare, Alloc> operator()(msgpack::object const& o) const {
hideakitai 0:3f9dbf1e2cb0 55 if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 56 type::assoc_vector<K, V, Compare, Alloc> v;
hideakitai 0:3f9dbf1e2cb0 57 v.reserve(o.via.map.size);
hideakitai 0:3f9dbf1e2cb0 58 msgpack::object_kv* p = o.via.map.ptr;
hideakitai 0:3f9dbf1e2cb0 59 msgpack::object_kv* const pend = o.via.map.ptr + o.via.map.size;
hideakitai 0:3f9dbf1e2cb0 60 for (; p < pend; ++p) {
hideakitai 0:3f9dbf1e2cb0 61 v.emplace_back(p->key.as<K>(), p->val.as<V>());
hideakitai 0:3f9dbf1e2cb0 62 }
hideakitai 0:3f9dbf1e2cb0 63 std::sort(v.begin(), v.end(), type::detail::pair_first_less<K, V, Compare, Alloc>());
hideakitai 0:3f9dbf1e2cb0 64 return v;
hideakitai 0:3f9dbf1e2cb0 65 }
hideakitai 0:3f9dbf1e2cb0 66 };
hideakitai 0:3f9dbf1e2cb0 67
hideakitai 0:3f9dbf1e2cb0 68 #endif // !defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 69
hideakitai 0:3f9dbf1e2cb0 70 template <typename K, typename V, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 71 struct convert<type::assoc_vector<K, V, Compare, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 72 msgpack::object const& operator()(msgpack::object const& o, type::assoc_vector<K, V, Compare, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 73 if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 74 v.resize(o.via.map.size);
hideakitai 0:3f9dbf1e2cb0 75 msgpack::object_kv* p = o.via.map.ptr;
hideakitai 0:3f9dbf1e2cb0 76 msgpack::object_kv* const pend = o.via.map.ptr + o.via.map.size;
hideakitai 0:3f9dbf1e2cb0 77 std::pair<K, V>* it(&v.front());
hideakitai 0:3f9dbf1e2cb0 78 for (; p < pend; ++p, ++it) {
hideakitai 0:3f9dbf1e2cb0 79 p->key.convert(it->first);
hideakitai 0:3f9dbf1e2cb0 80 p->val.convert(it->second);
hideakitai 0:3f9dbf1e2cb0 81 }
hideakitai 0:3f9dbf1e2cb0 82 std::sort(v.begin(), v.end(), type::detail::pair_first_less<K, V, Compare, Alloc>());
hideakitai 0:3f9dbf1e2cb0 83 return o;
hideakitai 0:3f9dbf1e2cb0 84 }
hideakitai 0:3f9dbf1e2cb0 85 };
hideakitai 0:3f9dbf1e2cb0 86
hideakitai 0:3f9dbf1e2cb0 87 template <typename K, typename V, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 88 struct pack<type::assoc_vector<K, V, Compare, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 89 template <typename Stream>
hideakitai 0:3f9dbf1e2cb0 90 msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const type::assoc_vector<K, V, Compare, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 91 uint32_t size = checked_get_container_size(v.size());
hideakitai 0:3f9dbf1e2cb0 92 o.pack_map(size);
hideakitai 0:3f9dbf1e2cb0 93 for (typename type::assoc_vector<K, V, Compare, Alloc>::const_iterator it(v.begin()), it_end(v.end());
hideakitai 0:3f9dbf1e2cb0 94 it != it_end; ++it) {
hideakitai 0:3f9dbf1e2cb0 95 o.pack(it->first);
hideakitai 0:3f9dbf1e2cb0 96 o.pack(it->second);
hideakitai 0:3f9dbf1e2cb0 97 }
hideakitai 0:3f9dbf1e2cb0 98 return o;
hideakitai 0:3f9dbf1e2cb0 99 }
hideakitai 0:3f9dbf1e2cb0 100 };
hideakitai 0:3f9dbf1e2cb0 101
hideakitai 0:3f9dbf1e2cb0 102 template <typename K, typename V, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 103 struct object_with_zone<type::assoc_vector<K, V, Compare, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 104 void operator()(msgpack::object::with_zone& o, const type::assoc_vector<K, V, Compare, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 105 o.type = msgpack::type::MAP;
hideakitai 0:3f9dbf1e2cb0 106 if (v.empty()) {
hideakitai 0:3f9dbf1e2cb0 107 o.via.map.ptr = nullptr;
hideakitai 0:3f9dbf1e2cb0 108 o.via.map.size = 0;
hideakitai 0:3f9dbf1e2cb0 109 }
hideakitai 0:3f9dbf1e2cb0 110 else {
hideakitai 0:3f9dbf1e2cb0 111 uint32_t size = checked_get_container_size(v.size());
hideakitai 0:3f9dbf1e2cb0 112 msgpack::object_kv* p = static_cast<msgpack::object_kv*>(o.zone.allocate_align(sizeof(msgpack::object_kv)*size));
hideakitai 0:3f9dbf1e2cb0 113 msgpack::object_kv* const pend = p + size;
hideakitai 0:3f9dbf1e2cb0 114 o.via.map.ptr = p;
hideakitai 0:3f9dbf1e2cb0 115 o.via.map.size = size;
hideakitai 0:3f9dbf1e2cb0 116 typename type::assoc_vector<K, V, Compare, Alloc>::const_iterator it(v.begin());
hideakitai 0:3f9dbf1e2cb0 117 do {
hideakitai 0:3f9dbf1e2cb0 118 p->key = msgpack::object(it->first, o.zone);
hideakitai 0:3f9dbf1e2cb0 119 p->val = msgpack::object(it->second, o.zone);
hideakitai 0:3f9dbf1e2cb0 120 ++p;
hideakitai 0:3f9dbf1e2cb0 121 ++it;
hideakitai 0:3f9dbf1e2cb0 122 } while(p < pend);
hideakitai 0:3f9dbf1e2cb0 123 }
hideakitai 0:3f9dbf1e2cb0 124 }
hideakitai 0:3f9dbf1e2cb0 125 };
hideakitai 0:3f9dbf1e2cb0 126
hideakitai 0:3f9dbf1e2cb0 127 #if !defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 128
hideakitai 0:3f9dbf1e2cb0 129 template <typename K, typename V, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 130 struct as<
hideakitai 0:3f9dbf1e2cb0 131 std::map<K, V, Compare, Alloc>,
hideakitai 0:3f9dbf1e2cb0 132 typename std::enable_if<msgpack::has_as<K>::value && msgpack::has_as<V>::value>::type> {
hideakitai 0:3f9dbf1e2cb0 133 std::map<K, V, Compare, Alloc> operator()(msgpack::object const& o) const {
hideakitai 0:3f9dbf1e2cb0 134 if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 135 msgpack::object_kv* p(o.via.map.ptr);
hideakitai 0:3f9dbf1e2cb0 136 msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
hideakitai 0:3f9dbf1e2cb0 137 std::map<K, V, Compare, Alloc> v;
hideakitai 0:3f9dbf1e2cb0 138 for (; p != pend; ++p) {
hideakitai 0:3f9dbf1e2cb0 139 v.emplace(p->key.as<K>(), p->val.as<V>());
hideakitai 0:3f9dbf1e2cb0 140 }
hideakitai 0:3f9dbf1e2cb0 141 return v;
hideakitai 0:3f9dbf1e2cb0 142 }
hideakitai 0:3f9dbf1e2cb0 143 };
hideakitai 0:3f9dbf1e2cb0 144
hideakitai 0:3f9dbf1e2cb0 145 #endif // !defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 146
hideakitai 0:3f9dbf1e2cb0 147 template <typename K, typename V, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 148 struct convert<std::map<K, V, Compare, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 149 msgpack::object const& operator()(msgpack::object const& o, std::map<K, V, Compare, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 150 if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 151 msgpack::object_kv* p(o.via.map.ptr);
hideakitai 0:3f9dbf1e2cb0 152 msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
hideakitai 0:3f9dbf1e2cb0 153 std::map<K, V, Compare, Alloc> tmp;
hideakitai 0:3f9dbf1e2cb0 154 for (; p != pend; ++p) {
hideakitai 0:3f9dbf1e2cb0 155 K key;
hideakitai 0:3f9dbf1e2cb0 156 p->key.convert(key);
hideakitai 0:3f9dbf1e2cb0 157 #if __cplusplus >= 201103L
hideakitai 0:3f9dbf1e2cb0 158 p->val.convert(tmp[std::move(key)]);
hideakitai 0:3f9dbf1e2cb0 159 #else
hideakitai 0:3f9dbf1e2cb0 160 p->val.convert(tmp[key]);
hideakitai 0:3f9dbf1e2cb0 161 #endif
hideakitai 0:3f9dbf1e2cb0 162 }
hideakitai 0:3f9dbf1e2cb0 163 #if __cplusplus >= 201103L
hideakitai 0:3f9dbf1e2cb0 164 v = std::move(tmp);
hideakitai 0:3f9dbf1e2cb0 165 #else
hideakitai 0:3f9dbf1e2cb0 166 tmp.swap(v);
hideakitai 0:3f9dbf1e2cb0 167 #endif
hideakitai 0:3f9dbf1e2cb0 168 return o;
hideakitai 0:3f9dbf1e2cb0 169 }
hideakitai 0:3f9dbf1e2cb0 170 };
hideakitai 0:3f9dbf1e2cb0 171
hideakitai 0:3f9dbf1e2cb0 172 template <typename K, typename V, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 173 struct pack<std::map<K, V, Compare, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 174 template <typename Stream>
hideakitai 0:3f9dbf1e2cb0 175 msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::map<K, V, Compare, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 176 uint32_t size = checked_get_container_size(v.size());
hideakitai 0:3f9dbf1e2cb0 177 o.pack_map(size);
hideakitai 0:3f9dbf1e2cb0 178 for (typename std::map<K, V, Compare, Alloc>::const_iterator it(v.begin()), it_end(v.end());
hideakitai 0:3f9dbf1e2cb0 179 it != it_end; ++it) {
hideakitai 0:3f9dbf1e2cb0 180 o.pack(it->first);
hideakitai 0:3f9dbf1e2cb0 181 o.pack(it->second);
hideakitai 0:3f9dbf1e2cb0 182 }
hideakitai 0:3f9dbf1e2cb0 183 return o;
hideakitai 0:3f9dbf1e2cb0 184 }
hideakitai 0:3f9dbf1e2cb0 185 };
hideakitai 0:3f9dbf1e2cb0 186
hideakitai 0:3f9dbf1e2cb0 187 template <typename K, typename V, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 188 struct object_with_zone<std::map<K, V, Compare, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 189 void operator()(msgpack::object::with_zone& o, const std::map<K, V, Compare, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 190 o.type = msgpack::type::MAP;
hideakitai 0:3f9dbf1e2cb0 191 if (v.empty()) {
hideakitai 0:3f9dbf1e2cb0 192 o.via.map.ptr = nullptr;
hideakitai 0:3f9dbf1e2cb0 193 o.via.map.size = 0;
hideakitai 0:3f9dbf1e2cb0 194 }
hideakitai 0:3f9dbf1e2cb0 195 else {
hideakitai 0:3f9dbf1e2cb0 196 uint32_t size = checked_get_container_size(v.size());
hideakitai 0:3f9dbf1e2cb0 197 msgpack::object_kv* p = static_cast<msgpack::object_kv*>(o.zone.allocate_align(sizeof(msgpack::object_kv)*size));
hideakitai 0:3f9dbf1e2cb0 198 msgpack::object_kv* const pend = p + size;
hideakitai 0:3f9dbf1e2cb0 199 o.via.map.ptr = p;
hideakitai 0:3f9dbf1e2cb0 200 o.via.map.size = size;
hideakitai 0:3f9dbf1e2cb0 201 typename std::map<K, V, Compare, Alloc>::const_iterator it(v.begin());
hideakitai 0:3f9dbf1e2cb0 202 do {
hideakitai 0:3f9dbf1e2cb0 203 p->key = msgpack::object(it->first, o.zone);
hideakitai 0:3f9dbf1e2cb0 204 p->val = msgpack::object(it->second, o.zone);
hideakitai 0:3f9dbf1e2cb0 205 ++p;
hideakitai 0:3f9dbf1e2cb0 206 ++it;
hideakitai 0:3f9dbf1e2cb0 207 } while(p < pend);
hideakitai 0:3f9dbf1e2cb0 208 }
hideakitai 0:3f9dbf1e2cb0 209 }
hideakitai 0:3f9dbf1e2cb0 210 };
hideakitai 0:3f9dbf1e2cb0 211
hideakitai 0:3f9dbf1e2cb0 212 #if !defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 213
hideakitai 0:3f9dbf1e2cb0 214 template <typename K, typename V, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 215 struct as<
hideakitai 0:3f9dbf1e2cb0 216 std::multimap<K, V, Compare, Alloc>,
hideakitai 0:3f9dbf1e2cb0 217 typename std::enable_if<msgpack::has_as<K>::value && msgpack::has_as<V>::value>::type> {
hideakitai 0:3f9dbf1e2cb0 218 std::multimap<K, V, Compare, Alloc> operator()(msgpack::object const& o) const {
hideakitai 0:3f9dbf1e2cb0 219 if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 220 msgpack::object_kv* p(o.via.map.ptr);
hideakitai 0:3f9dbf1e2cb0 221 msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
hideakitai 0:3f9dbf1e2cb0 222 std::multimap<K, V, Compare, Alloc> v;
hideakitai 0:3f9dbf1e2cb0 223 for (; p != pend; ++p) {
hideakitai 0:3f9dbf1e2cb0 224 v.emplace(p->key.as<K>(), p->val.as<V>());
hideakitai 0:3f9dbf1e2cb0 225 }
hideakitai 0:3f9dbf1e2cb0 226 return v;
hideakitai 0:3f9dbf1e2cb0 227 }
hideakitai 0:3f9dbf1e2cb0 228 };
hideakitai 0:3f9dbf1e2cb0 229
hideakitai 0:3f9dbf1e2cb0 230 #endif // !defined(MSGPACK_USE_CPP03)
hideakitai 0:3f9dbf1e2cb0 231
hideakitai 0:3f9dbf1e2cb0 232 template <typename K, typename V, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 233 struct convert<std::multimap<K, V, Compare, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 234 msgpack::object const& operator()(msgpack::object const& o, std::multimap<K, V, Compare, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 235 if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
hideakitai 0:3f9dbf1e2cb0 236 msgpack::object_kv* p(o.via.map.ptr);
hideakitai 0:3f9dbf1e2cb0 237 msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
hideakitai 0:3f9dbf1e2cb0 238 std::multimap<K, V, Compare, Alloc> tmp;
hideakitai 0:3f9dbf1e2cb0 239 for (; p != pend; ++p) {
hideakitai 0:3f9dbf1e2cb0 240 std::pair<K, V> value;
hideakitai 0:3f9dbf1e2cb0 241 p->key.convert(value.first);
hideakitai 0:3f9dbf1e2cb0 242 p->val.convert(value.second);
hideakitai 0:3f9dbf1e2cb0 243 #if __cplusplus >= 201103L
hideakitai 0:3f9dbf1e2cb0 244 tmp.insert(std::move(value));
hideakitai 0:3f9dbf1e2cb0 245 #else
hideakitai 0:3f9dbf1e2cb0 246 tmp.insert(value);
hideakitai 0:3f9dbf1e2cb0 247 #endif
hideakitai 0:3f9dbf1e2cb0 248 }
hideakitai 0:3f9dbf1e2cb0 249 #if __cplusplus >= 201103L
hideakitai 0:3f9dbf1e2cb0 250 v = std::move(tmp);
hideakitai 0:3f9dbf1e2cb0 251 #else
hideakitai 0:3f9dbf1e2cb0 252 tmp.swap(v);
hideakitai 0:3f9dbf1e2cb0 253 #endif
hideakitai 0:3f9dbf1e2cb0 254 return o;
hideakitai 0:3f9dbf1e2cb0 255 }
hideakitai 0:3f9dbf1e2cb0 256 };
hideakitai 0:3f9dbf1e2cb0 257
hideakitai 0:3f9dbf1e2cb0 258 template <typename K, typename V, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 259 struct pack<std::multimap<K, V, Compare, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 260 template <typename Stream>
hideakitai 0:3f9dbf1e2cb0 261 msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::multimap<K, V, Compare, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 262 uint32_t size = checked_get_container_size(v.size());
hideakitai 0:3f9dbf1e2cb0 263 o.pack_map(size);
hideakitai 0:3f9dbf1e2cb0 264 for (typename std::multimap<K, V, Compare, Alloc>::const_iterator it(v.begin()), it_end(v.end());
hideakitai 0:3f9dbf1e2cb0 265 it != it_end; ++it) {
hideakitai 0:3f9dbf1e2cb0 266 o.pack(it->first);
hideakitai 0:3f9dbf1e2cb0 267 o.pack(it->second);
hideakitai 0:3f9dbf1e2cb0 268 }
hideakitai 0:3f9dbf1e2cb0 269 return o;
hideakitai 0:3f9dbf1e2cb0 270 }
hideakitai 0:3f9dbf1e2cb0 271 };
hideakitai 0:3f9dbf1e2cb0 272
hideakitai 0:3f9dbf1e2cb0 273 template <typename K, typename V, typename Compare, typename Alloc>
hideakitai 0:3f9dbf1e2cb0 274 struct object_with_zone<std::multimap<K, V, Compare, Alloc> > {
hideakitai 0:3f9dbf1e2cb0 275 void operator()(msgpack::object::with_zone& o, const std::multimap<K, V, Compare, Alloc>& v) const {
hideakitai 0:3f9dbf1e2cb0 276 o.type = msgpack::type::MAP;
hideakitai 0:3f9dbf1e2cb0 277 if (v.empty()) {
hideakitai 0:3f9dbf1e2cb0 278 o.via.map.ptr = nullptr;
hideakitai 0:3f9dbf1e2cb0 279 o.via.map.size = 0;
hideakitai 0:3f9dbf1e2cb0 280 }
hideakitai 0:3f9dbf1e2cb0 281 else {
hideakitai 0:3f9dbf1e2cb0 282 uint32_t size = checked_get_container_size(v.size());
hideakitai 0:3f9dbf1e2cb0 283 msgpack::object_kv* p = static_cast<msgpack::object_kv*>(o.zone.allocate_align(sizeof(msgpack::object_kv)*size));
hideakitai 0:3f9dbf1e2cb0 284 msgpack::object_kv* const pend = p + size;
hideakitai 0:3f9dbf1e2cb0 285 o.via.map.ptr = p;
hideakitai 0:3f9dbf1e2cb0 286 o.via.map.size = size;
hideakitai 0:3f9dbf1e2cb0 287 typename std::multimap<K, V, Compare, Alloc>::const_iterator it(v.begin());
hideakitai 0:3f9dbf1e2cb0 288 do {
hideakitai 0:3f9dbf1e2cb0 289 p->key = msgpack::object(it->first, o.zone);
hideakitai 0:3f9dbf1e2cb0 290 p->val = msgpack::object(it->second, o.zone);
hideakitai 0:3f9dbf1e2cb0 291 ++p;
hideakitai 0:3f9dbf1e2cb0 292 ++it;
hideakitai 0:3f9dbf1e2cb0 293 } while(p < pend);
hideakitai 0:3f9dbf1e2cb0 294 }
hideakitai 0:3f9dbf1e2cb0 295 }
hideakitai 0:3f9dbf1e2cb0 296 };
hideakitai 0:3f9dbf1e2cb0 297
hideakitai 0:3f9dbf1e2cb0 298 } // namespace adaptor
hideakitai 0:3f9dbf1e2cb0 299
hideakitai 0:3f9dbf1e2cb0 300 /// @cond
hideakitai 0:3f9dbf1e2cb0 301 } // MSGPACK_API_VERSION_NAMESPACE(v1)
hideakitai 0:3f9dbf1e2cb0 302 /// @endcond
hideakitai 0:3f9dbf1e2cb0 303
hideakitai 0:3f9dbf1e2cb0 304 } // namespace msgpack
hideakitai 0:3f9dbf1e2cb0 305
hideakitai 0:3f9dbf1e2cb0 306 #endif // MSGPACK_TYPE_MAP_HPP