Skip to content

Commit f986370

Browse files
author
Vladyslav Frolov
committed
Improved templates for std::unordered_map and std::unordered_set so they handle all sorts of those
1 parent 7e6a498 commit f986370

File tree

2 files changed

+68
-68
lines changed

2 files changed

+68
-68
lines changed

include/msgpack/adaptor/cpp11/unordered_map.hpp

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -32,29 +32,29 @@ MSGPACK_API_VERSION_NAMESPACE(v1) {
3232

3333
namespace adaptor {
3434

35-
template <typename K, typename V>
35+
template <typename K, typename V, typename... OtherTypes>
3636
struct as<
37-
std::unordered_map<K, V>,
37+
std::unordered_map<K, V, OtherTypes...>,
3838
typename std::enable_if<msgpack::has_as<K>::value && msgpack::has_as<V>::value>::type> {
39-
std::unordered_map<K, V> operator()(msgpack::object const& o) const {
39+
std::unordered_map<K, V, OtherTypes...> operator()(msgpack::object const& o) const {
4040
if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
4141
msgpack::object_kv* p(o.via.map.ptr);
4242
msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
43-
std::unordered_map<K, V> v;
43+
std::unordered_map<K, V, OtherTypes...> v;
4444
for (; p != pend; ++p) {
4545
v.emplace(p->key.as<K>(), p->val.as<V>());
4646
}
4747
return v;
4848
}
4949
};
5050

51-
template <typename K, typename V>
52-
struct convert<std::unordered_map<K, V>> {
53-
msgpack::object const& operator()(msgpack::object const& o, std::unordered_map<K, V>& v) const {
51+
template <typename K, typename V, typename... OtherTypes>
52+
struct convert<std::unordered_map<K, V, OtherTypes...>> {
53+
msgpack::object const& operator()(msgpack::object const& o, std::unordered_map<K, V, OtherTypes...>& v) const {
5454
if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
5555
msgpack::object_kv* p(o.via.map.ptr);
5656
msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
57-
std::unordered_map<K, V> tmp;
57+
std::unordered_map<K, V, OtherTypes...> tmp;
5858
for(; p != pend; ++p) {
5959
K key;
6060
p->key.convert(key);
@@ -65,13 +65,13 @@ struct convert<std::unordered_map<K, V>> {
6565
}
6666
};
6767

68-
template <typename K, typename V>
69-
struct pack<std::unordered_map<K, V>> {
68+
template <typename K, typename V, typename... OtherTypes>
69+
struct pack<std::unordered_map<K, V, OtherTypes...>> {
7070
template <typename Stream>
71-
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unordered_map<K,V>& v) const {
71+
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unordered_map<K, V, OtherTypes...>& v) const {
7272
uint32_t size = checked_get_container_size(v.size());
7373
o.pack_map(size);
74-
for(typename std::unordered_map<K,V>::const_iterator it(v.begin()), it_end(v.end());
74+
for(typename std::unordered_map<K, V, OtherTypes...>::const_iterator it(v.begin()), it_end(v.end());
7575
it != it_end; ++it) {
7676
o.pack(it->first);
7777
o.pack(it->second);
@@ -80,9 +80,9 @@ struct pack<std::unordered_map<K, V>> {
8080
}
8181
};
8282

83-
template <typename K, typename V>
84-
struct object_with_zone<std::unordered_map<K, V>> {
85-
void operator()(msgpack::object::with_zone& o, const std::unordered_map<K,V>& v) const {
83+
template <typename K, typename V, typename... OtherTypes>
84+
struct object_with_zone<std::unordered_map<K, V, OtherTypes...>> {
85+
void operator()(msgpack::object::with_zone& o, const std::unordered_map<K, V, OtherTypes...>& v) const {
8686
o.type = msgpack::type::MAP;
8787
if(v.empty()) {
8888
o.via.map.ptr = nullptr;
@@ -93,7 +93,7 @@ struct object_with_zone<std::unordered_map<K, V>> {
9393
msgpack::object_kv* const pend = p + size;
9494
o.via.map.ptr = p;
9595
o.via.map.size = size;
96-
typename std::unordered_map<K,V>::const_iterator it(v.begin());
96+
typename std::unordered_map<K, V, OtherTypes...>::const_iterator it(v.begin());
9797
do {
9898
p->key = msgpack::object(it->first, o.zone);
9999
p->val = msgpack::object(it->second, o.zone);
@@ -105,29 +105,29 @@ struct object_with_zone<std::unordered_map<K, V>> {
105105
};
106106

107107

108-
template <typename K, typename V>
108+
template <typename K, typename V, typename... OtherTypes>
109109
struct as<
110-
std::unordered_multimap<K, V>,
110+
std::unordered_multimap<K, V, OtherTypes...>,
111111
typename std::enable_if<msgpack::has_as<K>::value && msgpack::has_as<V>::value>::type> {
112-
std::unordered_multimap<K, V> operator()(msgpack::object const& o) const {
112+
std::unordered_multimap<K, V, OtherTypes...> operator()(msgpack::object const& o) const {
113113
if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
114114
msgpack::object_kv* p(o.via.map.ptr);
115115
msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
116-
std::unordered_multimap<K, V> v;
116+
std::unordered_multimap<K, V, OtherTypes...> v;
117117
for (; p != pend; ++p) {
118118
v.emplace(p->key.as<K>(), p->val.as<V>());
119119
}
120120
return v;
121121
}
122122
};
123123

124-
template <typename K, typename V>
125-
struct convert<std::unordered_multimap<K, V>> {
126-
msgpack::object const& operator()(msgpack::object const& o, std::unordered_multimap<K, V>& v) const {
124+
template <typename K, typename V, typename... OtherTypes>
125+
struct convert<std::unordered_multimap<K, V, OtherTypes...>> {
126+
msgpack::object const& operator()(msgpack::object const& o, std::unordered_multimap<K, V, OtherTypes...>& v) const {
127127
if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
128128
msgpack::object_kv* p(o.via.map.ptr);
129129
msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
130-
std::unordered_multimap<K, V> tmp;
130+
std::unordered_multimap<K, V, OtherTypes...> tmp;
131131
for(; p != pend; ++p) {
132132
std::pair<K, V> value;
133133
p->key.convert(value.first);
@@ -139,13 +139,13 @@ struct convert<std::unordered_multimap<K, V>> {
139139
}
140140
};
141141

142-
template <typename K, typename V>
143-
struct pack<std::unordered_multimap<K, V>> {
142+
template <typename K, typename V, typename... OtherTypes>
143+
struct pack<std::unordered_multimap<K, V, OtherTypes...>> {
144144
template <typename Stream>
145-
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unordered_multimap<K,V>& v) const {
145+
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unordered_multimap<K, V, OtherTypes...>& v) const {
146146
uint32_t size = checked_get_container_size(v.size());
147147
o.pack_map(size);
148-
for(typename std::unordered_multimap<K,V>::const_iterator it(v.begin()), it_end(v.end());
148+
for(typename std::unordered_multimap<K, V, OtherTypes...>::const_iterator it(v.begin()), it_end(v.end());
149149
it != it_end; ++it) {
150150
o.pack(it->first);
151151
o.pack(it->second);
@@ -154,9 +154,9 @@ struct pack<std::unordered_multimap<K, V>> {
154154
}
155155
};
156156

157-
template <typename K, typename V>
158-
struct object_with_zone<std::unordered_multimap<K, V>> {
159-
void operator()(msgpack::object::with_zone& o, const std::unordered_multimap<K,V>& v) const {
157+
template <typename K, typename V, typename... OtherTypes>
158+
struct object_with_zone<std::unordered_multimap<K, V, OtherTypes...>> {
159+
void operator()(msgpack::object::with_zone& o, const std::unordered_multimap<K, V, OtherTypes...>& v) const {
160160
o.type = msgpack::type::MAP;
161161
if(v.empty()) {
162162
o.via.map.ptr = nullptr;
@@ -167,7 +167,7 @@ struct object_with_zone<std::unordered_multimap<K, V>> {
167167
msgpack::object_kv* const pend = p + size;
168168
o.via.map.ptr = p;
169169
o.via.map.size = size;
170-
typename std::unordered_multimap<K,V>::const_iterator it(v.begin());
170+
typename std::unordered_multimap<K, V, OtherTypes...>::const_iterator it(v.begin());
171171
do {
172172
p->key = msgpack::object(it->first, o.zone);
173173
p->val = msgpack::object(it->second, o.zone);

include/msgpack/adaptor/cpp11/unordered_set.hpp

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -32,54 +32,54 @@ MSGPACK_API_VERSION_NAMESPACE(v1) {
3232

3333
namespace adaptor {
3434

35-
template <typename T>
36-
struct as<std::unordered_set<T>, typename std::enable_if<msgpack::has_as<T>::value>::type> {
37-
std::unordered_set<T> operator()(msgpack::object const& o) const {
35+
template <typename Key, typename... OtherTypes>
36+
struct as<std::unordered_set<Key, OtherTypes...>, typename std::enable_if<msgpack::has_as<Key>::value>::type> {
37+
std::unordered_set<Key, OtherTypes...> operator()(msgpack::object const& o) const {
3838
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
3939
msgpack::object* p = o.via.array.ptr + o.via.array.size;
4040
msgpack::object* const pbegin = o.via.array.ptr;
41-
std::unordered_set<T> v;
41+
std::unordered_set<Key, OtherTypes...> v;
4242
while (p > pbegin) {
4343
--p;
44-
v.insert(p->as<T>());
44+
v.insert(p->as<Key>());
4545
}
4646
return v;
4747
}
4848
};
4949

50-
template <typename T>
51-
struct convert<std::unordered_set<T>> {
52-
msgpack::object const& operator()(msgpack::object const& o, std::unordered_set<T>& v) const {
50+
template <typename Key, typename... OtherTypes>
51+
struct convert<std::unordered_set<Key, OtherTypes...>> {
52+
msgpack::object const& operator()(msgpack::object const& o, std::unordered_set<Key, OtherTypes...>& v) const {
5353
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
5454
msgpack::object* p = o.via.array.ptr + o.via.array.size;
5555
msgpack::object* const pbegin = o.via.array.ptr;
56-
std::unordered_set<T> tmp;
56+
std::unordered_set<Key, OtherTypes...> tmp;
5757
while(p > pbegin) {
5858
--p;
59-
tmp.insert(p->as<T>());
59+
tmp.insert(p->as<Key>());
6060
}
6161
v = std::move(tmp);
6262
return o;
6363
}
6464
};
6565

66-
template <typename T>
67-
struct pack<std::unordered_set<T>> {
66+
template <typename Key, typename... OtherTypes>
67+
struct pack<std::unordered_set<Key, OtherTypes...>> {
6868
template <typename Stream>
69-
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unordered_set<T>& v) const {
69+
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unordered_set<Key, OtherTypes...>& v) const {
7070
uint32_t size = checked_get_container_size(v.size());
7171
o.pack_array(size);
72-
for(typename std::unordered_set<T>::const_iterator it(v.begin()), it_end(v.end());
72+
for(typename std::unordered_set<Key, OtherTypes...>::const_iterator it(v.begin()), it_end(v.end());
7373
it != it_end; ++it) {
7474
o.pack(*it);
7575
}
7676
return o;
7777
}
7878
};
7979

80-
template <typename T>
81-
struct object_with_zone<std::unordered_set<T>> {
82-
void operator()(msgpack::object::with_zone& o, const std::unordered_set<T>& v) const {
80+
template <typename Key, typename... OtherTypes>
81+
struct object_with_zone<std::unordered_set<Key, OtherTypes...>> {
82+
void operator()(msgpack::object::with_zone& o, const std::unordered_set<Key, OtherTypes...>& v) const {
8383
o.type = msgpack::type::ARRAY;
8484
if(v.empty()) {
8585
o.via.array.ptr = nullptr;
@@ -90,7 +90,7 @@ struct object_with_zone<std::unordered_set<T>> {
9090
msgpack::object* const pend = p + size;
9191
o.via.array.ptr = p;
9292
o.via.array.size = size;
93-
typename std::unordered_set<T>::const_iterator it(v.begin());
93+
typename std::unordered_set<Key, OtherTypes...>::const_iterator it(v.begin());
9494
do {
9595
*p = msgpack::object(*it, o.zone);
9696
++p;
@@ -101,54 +101,54 @@ struct object_with_zone<std::unordered_set<T>> {
101101
};
102102

103103

104-
template <typename T>
105-
struct as<std::unordered_multiset<T>, typename std::enable_if<msgpack::has_as<T>::value>::type> {
106-
std::unordered_multiset<T> operator()(msgpack::object const& o) const {
104+
template <typename Key, typename... OtherTypes>
105+
struct as<std::unordered_multiset<Key, OtherTypes...>, typename std::enable_if<msgpack::has_as<Key>::value>::type> {
106+
std::unordered_multiset<Key, OtherTypes...> operator()(msgpack::object const& o) const {
107107
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
108108
msgpack::object* p = o.via.array.ptr + o.via.array.size;
109109
msgpack::object* const pbegin = o.via.array.ptr;
110-
std::unordered_multiset<T> v;
110+
std::unordered_multiset<Key, OtherTypes...> v;
111111
while (p > pbegin) {
112112
--p;
113-
v.insert(p->as<T>());
113+
v.insert(p->as<Key>());
114114
}
115115
return v;
116116
}
117117
};
118118

119-
template <typename T>
120-
struct convert<std::unordered_multiset<T>> {
121-
msgpack::object const& operator()(msgpack::object const& o, std::unordered_multiset<T>& v) const {
119+
template <typename Key, typename... OtherTypes>
120+
struct convert<std::unordered_multiset<Key, OtherTypes...>> {
121+
msgpack::object const& operator()(msgpack::object const& o, std::unordered_multiset<Key, OtherTypes...>& v) const {
122122
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
123123
msgpack::object* p = o.via.array.ptr + o.via.array.size;
124124
msgpack::object* const pbegin = o.via.array.ptr;
125-
std::unordered_multiset<T> tmp;
125+
std::unordered_multiset<Key, OtherTypes...> tmp;
126126
while(p > pbegin) {
127127
--p;
128-
tmp.insert(p->as<T>());
128+
tmp.insert(p->as<Key>());
129129
}
130130
v = std::move(tmp);
131131
return o;
132132
}
133133
};
134134

135-
template <typename T>
136-
struct pack<std::unordered_multiset<T>> {
135+
template <typename Key, typename... OtherTypes>
136+
struct pack<std::unordered_multiset<Key, OtherTypes...>> {
137137
template <typename Stream>
138-
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unordered_multiset<T>& v) const {
138+
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unordered_multiset<Key, OtherTypes...>& v) const {
139139
uint32_t size = checked_get_container_size(v.size());
140140
o.pack_array(size);
141-
for(typename std::unordered_multiset<T>::const_iterator it(v.begin()), it_end(v.end());
141+
for(typename std::unordered_multiset<Key, OtherTypes...>::const_iterator it(v.begin()), it_end(v.end());
142142
it != it_end; ++it) {
143143
o.pack(*it);
144144
}
145145
return o;
146146
}
147147
};
148148

149-
template <typename T>
150-
struct object_with_zone<std::unordered_multiset<T>> {
151-
void operator()(msgpack::object::with_zone& o, const std::unordered_multiset<T>& v) const {
149+
template <typename Key, typename... OtherTypes>
150+
struct object_with_zone<std::unordered_multiset<Key, OtherTypes...>> {
151+
void operator()(msgpack::object::with_zone& o, const std::unordered_multiset<Key, OtherTypes...>& v) const {
152152
o.type = msgpack::type::ARRAY;
153153
if(v.empty()) {
154154
o.via.array.ptr = nullptr;
@@ -159,7 +159,7 @@ struct object_with_zone<std::unordered_multiset<T>> {
159159
msgpack::object* const pend = p + size;
160160
o.via.array.ptr = p;
161161
o.via.array.size = size;
162-
typename std::unordered_multiset<T>::const_iterator it(v.begin());
162+
typename std::unordered_multiset<Key, OtherTypes...>::const_iterator it(v.begin());
163163
do {
164164
*p = msgpack::object(*it, o.zone);
165165
++p;

0 commit comments

Comments
 (0)