From f986370634af0640caf8a81de9ba8c52bcc40d0c Mon Sep 17 00:00:00 2001 From: Vladyslav Frolov Date: Fri, 31 Jul 2015 04:16:14 -0700 Subject: [PATCH] Improved templates for std::unordered_map and std::unordered_set so they handle all sorts of those --- .../msgpack/adaptor/cpp11/unordered_map.hpp | 64 ++++++++--------- .../msgpack/adaptor/cpp11/unordered_set.hpp | 72 +++++++++---------- 2 files changed, 68 insertions(+), 68 deletions(-) diff --git a/include/msgpack/adaptor/cpp11/unordered_map.hpp b/include/msgpack/adaptor/cpp11/unordered_map.hpp index 9dd704bd..8792adf3 100644 --- a/include/msgpack/adaptor/cpp11/unordered_map.hpp +++ b/include/msgpack/adaptor/cpp11/unordered_map.hpp @@ -32,15 +32,15 @@ MSGPACK_API_VERSION_NAMESPACE(v1) { namespace adaptor { -template +template struct as< - std::unordered_map, + std::unordered_map, typename std::enable_if::value && msgpack::has_as::value>::type> { - std::unordered_map operator()(msgpack::object const& o) const { + std::unordered_map operator()(msgpack::object const& o) const { if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); } msgpack::object_kv* p(o.via.map.ptr); msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size); - std::unordered_map v; + std::unordered_map v; for (; p != pend; ++p) { v.emplace(p->key.as(), p->val.as()); } @@ -48,13 +48,13 @@ struct as< } }; -template -struct convert> { - msgpack::object const& operator()(msgpack::object const& o, std::unordered_map& v) const { +template +struct convert> { + msgpack::object const& operator()(msgpack::object const& o, std::unordered_map& v) const { if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); } msgpack::object_kv* p(o.via.map.ptr); msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size); - std::unordered_map tmp; + std::unordered_map tmp; for(; p != pend; ++p) { K key; p->key.convert(key); @@ -65,13 +65,13 @@ struct convert> { } }; -template -struct pack> { +template +struct pack> { template - msgpack::packer& operator()(msgpack::packer& o, const std::unordered_map& v) const { + msgpack::packer& operator()(msgpack::packer& o, const std::unordered_map& v) const { uint32_t size = checked_get_container_size(v.size()); o.pack_map(size); - for(typename std::unordered_map::const_iterator it(v.begin()), it_end(v.end()); + for(typename std::unordered_map::const_iterator it(v.begin()), it_end(v.end()); it != it_end; ++it) { o.pack(it->first); o.pack(it->second); @@ -80,9 +80,9 @@ struct pack> { } }; -template -struct object_with_zone> { - void operator()(msgpack::object::with_zone& o, const std::unordered_map& v) const { +template +struct object_with_zone> { + void operator()(msgpack::object::with_zone& o, const std::unordered_map& v) const { o.type = msgpack::type::MAP; if(v.empty()) { o.via.map.ptr = nullptr; @@ -93,7 +93,7 @@ struct object_with_zone> { msgpack::object_kv* const pend = p + size; o.via.map.ptr = p; o.via.map.size = size; - typename std::unordered_map::const_iterator it(v.begin()); + typename std::unordered_map::const_iterator it(v.begin()); do { p->key = msgpack::object(it->first, o.zone); p->val = msgpack::object(it->second, o.zone); @@ -105,15 +105,15 @@ struct object_with_zone> { }; -template +template struct as< - std::unordered_multimap, + std::unordered_multimap, typename std::enable_if::value && msgpack::has_as::value>::type> { - std::unordered_multimap operator()(msgpack::object const& o) const { + std::unordered_multimap operator()(msgpack::object const& o) const { if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); } msgpack::object_kv* p(o.via.map.ptr); msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size); - std::unordered_multimap v; + std::unordered_multimap v; for (; p != pend; ++p) { v.emplace(p->key.as(), p->val.as()); } @@ -121,13 +121,13 @@ struct as< } }; -template -struct convert> { - msgpack::object const& operator()(msgpack::object const& o, std::unordered_multimap& v) const { +template +struct convert> { + msgpack::object const& operator()(msgpack::object const& o, std::unordered_multimap& v) const { if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); } msgpack::object_kv* p(o.via.map.ptr); msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size); - std::unordered_multimap tmp; + std::unordered_multimap tmp; for(; p != pend; ++p) { std::pair value; p->key.convert(value.first); @@ -139,13 +139,13 @@ struct convert> { } }; -template -struct pack> { +template +struct pack> { template - msgpack::packer& operator()(msgpack::packer& o, const std::unordered_multimap& v) const { + msgpack::packer& operator()(msgpack::packer& o, const std::unordered_multimap& v) const { uint32_t size = checked_get_container_size(v.size()); o.pack_map(size); - for(typename std::unordered_multimap::const_iterator it(v.begin()), it_end(v.end()); + for(typename std::unordered_multimap::const_iterator it(v.begin()), it_end(v.end()); it != it_end; ++it) { o.pack(it->first); o.pack(it->second); @@ -154,9 +154,9 @@ struct pack> { } }; -template -struct object_with_zone> { - void operator()(msgpack::object::with_zone& o, const std::unordered_multimap& v) const { +template +struct object_with_zone> { + void operator()(msgpack::object::with_zone& o, const std::unordered_multimap& v) const { o.type = msgpack::type::MAP; if(v.empty()) { o.via.map.ptr = nullptr; @@ -167,7 +167,7 @@ struct object_with_zone> { msgpack::object_kv* const pend = p + size; o.via.map.ptr = p; o.via.map.size = size; - typename std::unordered_multimap::const_iterator it(v.begin()); + typename std::unordered_multimap::const_iterator it(v.begin()); do { p->key = msgpack::object(it->first, o.zone); p->val = msgpack::object(it->second, o.zone); diff --git a/include/msgpack/adaptor/cpp11/unordered_set.hpp b/include/msgpack/adaptor/cpp11/unordered_set.hpp index 8735dc15..77a1640f 100644 --- a/include/msgpack/adaptor/cpp11/unordered_set.hpp +++ b/include/msgpack/adaptor/cpp11/unordered_set.hpp @@ -32,44 +32,44 @@ MSGPACK_API_VERSION_NAMESPACE(v1) { namespace adaptor { -template -struct as, typename std::enable_if::value>::type> { - std::unordered_set operator()(msgpack::object const& o) const { +template +struct as, typename std::enable_if::value>::type> { + std::unordered_set operator()(msgpack::object const& o) const { if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); } msgpack::object* p = o.via.array.ptr + o.via.array.size; msgpack::object* const pbegin = o.via.array.ptr; - std::unordered_set v; + std::unordered_set v; while (p > pbegin) { --p; - v.insert(p->as()); + v.insert(p->as()); } return v; } }; -template -struct convert> { - msgpack::object const& operator()(msgpack::object const& o, std::unordered_set& v) const { +template +struct convert> { + msgpack::object const& operator()(msgpack::object const& o, std::unordered_set& v) const { if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); } msgpack::object* p = o.via.array.ptr + o.via.array.size; msgpack::object* const pbegin = o.via.array.ptr; - std::unordered_set tmp; + std::unordered_set tmp; while(p > pbegin) { --p; - tmp.insert(p->as()); + tmp.insert(p->as()); } v = std::move(tmp); return o; } }; -template -struct pack> { +template +struct pack> { template - msgpack::packer& operator()(msgpack::packer& o, const std::unordered_set& v) const { + msgpack::packer& operator()(msgpack::packer& o, const std::unordered_set& v) const { uint32_t size = checked_get_container_size(v.size()); o.pack_array(size); - for(typename std::unordered_set::const_iterator it(v.begin()), it_end(v.end()); + for(typename std::unordered_set::const_iterator it(v.begin()), it_end(v.end()); it != it_end; ++it) { o.pack(*it); } @@ -77,9 +77,9 @@ struct pack> { } }; -template -struct object_with_zone> { - void operator()(msgpack::object::with_zone& o, const std::unordered_set& v) const { +template +struct object_with_zone> { + void operator()(msgpack::object::with_zone& o, const std::unordered_set& v) const { o.type = msgpack::type::ARRAY; if(v.empty()) { o.via.array.ptr = nullptr; @@ -90,7 +90,7 @@ struct object_with_zone> { msgpack::object* const pend = p + size; o.via.array.ptr = p; o.via.array.size = size; - typename std::unordered_set::const_iterator it(v.begin()); + typename std::unordered_set::const_iterator it(v.begin()); do { *p = msgpack::object(*it, o.zone); ++p; @@ -101,44 +101,44 @@ struct object_with_zone> { }; -template -struct as, typename std::enable_if::value>::type> { - std::unordered_multiset operator()(msgpack::object const& o) const { +template +struct as, typename std::enable_if::value>::type> { + std::unordered_multiset operator()(msgpack::object const& o) const { if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); } msgpack::object* p = o.via.array.ptr + o.via.array.size; msgpack::object* const pbegin = o.via.array.ptr; - std::unordered_multiset v; + std::unordered_multiset v; while (p > pbegin) { --p; - v.insert(p->as()); + v.insert(p->as()); } return v; } }; -template -struct convert> { - msgpack::object const& operator()(msgpack::object const& o, std::unordered_multiset& v) const { +template +struct convert> { + msgpack::object const& operator()(msgpack::object const& o, std::unordered_multiset& v) const { if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); } msgpack::object* p = o.via.array.ptr + o.via.array.size; msgpack::object* const pbegin = o.via.array.ptr; - std::unordered_multiset tmp; + std::unordered_multiset tmp; while(p > pbegin) { --p; - tmp.insert(p->as()); + tmp.insert(p->as()); } v = std::move(tmp); return o; } }; -template -struct pack> { +template +struct pack> { template - msgpack::packer& operator()(msgpack::packer& o, const std::unordered_multiset& v) const { + msgpack::packer& operator()(msgpack::packer& o, const std::unordered_multiset& v) const { uint32_t size = checked_get_container_size(v.size()); o.pack_array(size); - for(typename std::unordered_multiset::const_iterator it(v.begin()), it_end(v.end()); + for(typename std::unordered_multiset::const_iterator it(v.begin()), it_end(v.end()); it != it_end; ++it) { o.pack(*it); } @@ -146,9 +146,9 @@ struct pack> { } }; -template -struct object_with_zone> { - void operator()(msgpack::object::with_zone& o, const std::unordered_multiset& v) const { +template +struct object_with_zone> { + void operator()(msgpack::object::with_zone& o, const std::unordered_multiset& v) const { o.type = msgpack::type::ARRAY; if(v.empty()) { o.via.array.ptr = nullptr; @@ -159,7 +159,7 @@ struct object_with_zone> { msgpack::object* const pend = p + size; o.via.array.ptr = p; o.via.array.size = size; - typename std::unordered_multiset::const_iterator it(v.begin()); + typename std::unordered_multiset::const_iterator it(v.begin()); do { *p = msgpack::object(*it, o.zone); ++p;