From 03ed30ce036d34016bdcf2c5c952c0424240faa0 Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Mon, 15 Sep 2014 18:16:37 +0900 Subject: [PATCH] Fixed https://github.com/msgpack/msgpack-c/issues/76 Clear deserialized target containers. As the result of this fix, all containers' deserialized behaviors become consistent. --- include/msgpack/adaptor/map.hpp | 12 ++++++++---- include/msgpack/adaptor/set.hpp | 8 ++++++-- include/msgpack/adaptor/tr1/unordered_map.hpp | 8 ++++++-- include/msgpack/adaptor/tr1/unordered_set.hpp | 8 ++++++-- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/include/msgpack/adaptor/map.hpp b/include/msgpack/adaptor/map.hpp index 5cf61762..4f2e0af0 100644 --- a/include/msgpack/adaptor/map.hpp +++ b/include/msgpack/adaptor/map.hpp @@ -99,18 +99,20 @@ inline object const& operator>> (object const& o, std::map& v) if(o.type != type::MAP) { throw type_error(); } object_kv* p(o.via.map.ptr); object_kv* const pend(o.via.map.ptr + o.via.map.size); + std::map tmp; for(; p != pend; ++p) { K key; p->key.convert(key); - typename std::map::iterator it(v.lower_bound(key)); - if(it != v.end() && !(key < it->first)) { + typename std::map::iterator it(tmp.lower_bound(key)); + if(it != tmp.end() && !(key < it->first)) { p->val.convert(it->second); } else { V val; p->val.convert(val); - v.insert(it, std::pair(key, val)); + tmp.insert(it, std::pair(key, val)); } } + tmp.swap(v); return o; } @@ -155,12 +157,14 @@ inline object const& operator>> (object const& o, std::multimap& v) if(o.type != type::MAP) { throw type_error(); } object_kv* p(o.via.map.ptr); object_kv* const pend(o.via.map.ptr + o.via.map.size); + std::multimap tmp; for(; p != pend; ++p) { std::pair value; p->key.convert(value.first); p->val.convert(value.second); - v.insert(value); + tmp.insert(value); } + tmp.swap(v); return o; } diff --git a/include/msgpack/adaptor/set.hpp b/include/msgpack/adaptor/set.hpp index f949944e..fa2b5657 100644 --- a/include/msgpack/adaptor/set.hpp +++ b/include/msgpack/adaptor/set.hpp @@ -30,10 +30,12 @@ inline object const& operator>> (object const& o, std::set& v) if(o.type != type::ARRAY) { throw type_error(); } object* p = o.via.array.ptr + o.via.array.size; object* const pbegin = o.via.array.ptr; + std::set tmp; while(p > pbegin) { --p; - v.insert(p->as()); + tmp.insert(p->as()); } + tmp.swap(v); return o; } @@ -76,10 +78,12 @@ inline object const& operator>> (object const& o, std::multiset& v) if(o.type != type::ARRAY) { throw type_error(); } object* p = o.via.array.ptr + o.via.array.size; object* const pbegin = o.via.array.ptr; + std::multiset tmp; while(p > pbegin) { --p; - v.insert(p->as()); + tmp.insert(p->as()); } + tmp.swap(v); return o; } diff --git a/include/msgpack/adaptor/tr1/unordered_map.hpp b/include/msgpack/adaptor/tr1/unordered_map.hpp index 6495fa9b..7e6ea497 100644 --- a/include/msgpack/adaptor/tr1/unordered_map.hpp +++ b/include/msgpack/adaptor/tr1/unordered_map.hpp @@ -49,11 +49,13 @@ inline object const& operator>> (object const& o, MSGPACK_STD_TR1::unordered_map if(o.type != type::MAP) { throw type_error(); } object_kv* p(o.via.map.ptr); object_kv* const pend(o.via.map.ptr + o.via.map.size); + MSGPACK_STD_TR1::unordered_map tmp; for(; p != pend; ++p) { K key; p->key.convert(key); - p->val.convert(v[key]); + p->val.convert(tmp[key]); } + tmp.swap(v); return o; } @@ -98,12 +100,14 @@ inline object const& operator>> (object const& o, MSGPACK_STD_TR1::unordered_mul if(o.type != type::MAP) { throw type_error(); } object_kv* p(o.via.map.ptr); object_kv* const pend(o.via.map.ptr + o.via.map.size); + MSGPACK_STD_TR1::unordered_multimap tmp; for(; p != pend; ++p) { std::pair value; p->key.convert(value.first); p->val.convert(value.second); - v.insert(value); + tmp.insert(value); } + tmp.swap(v); return o; } diff --git a/include/msgpack/adaptor/tr1/unordered_set.hpp b/include/msgpack/adaptor/tr1/unordered_set.hpp index e6086c09..384e2fac 100644 --- a/include/msgpack/adaptor/tr1/unordered_set.hpp +++ b/include/msgpack/adaptor/tr1/unordered_set.hpp @@ -48,10 +48,12 @@ inline object const& operator>> (object const& o, MSGPACK_STD_TR1::unordered_set if(o.type != type::ARRAY) { throw type_error(); } object* p = o.via.array.ptr + o.via.array.size; object* const pbegin = o.via.array.ptr; + MSGPACK_STD_TR1::unordered_set tmp; while(p > pbegin) { --p; - v.insert(p->as()); + tmp.insert(p->as()); } + tmp.swap(v); return o; } @@ -94,10 +96,12 @@ inline object const& operator>> (object const& o, MSGPACK_STD_TR1::unordered_mul if(o.type != type::ARRAY) { throw type_error(); } object* p = o.via.array.ptr + o.via.array.size; object* const pbegin = o.via.array.ptr; + MSGPACK_STD_TR1::unordered_multiset tmp; while(p > pbegin) { --p; - v.insert(p->as()); + tmp.insert(p->as()); } + tmp.swap(v); return o; }