diff --git a/include/cereal/types/concepts/pair_associative_container.hpp b/include/cereal/types/concepts/pair_associative_container.hpp index acfd41842..20395c8b0 100644 --- a/include/cereal/types/concepts/pair_associative_container.hpp +++ b/include/cereal/types/concepts/pair_associative_container.hpp @@ -54,7 +54,7 @@ namespace cereal map.clear(); - auto hint = map.begin(); + auto hint = map.end(); for( size_t i = 0; i < size; ++i ) { typename Map::key_type key; @@ -66,6 +66,7 @@ namespace cereal #else // NOT CEREAL_OLDER_GCC hint = map.emplace_hint( hint, std::move( key ), std::move( value ) ); #endif // NOT CEREAL_OLDER_GCC + hint = map.end(); } } } // namespace cereal diff --git a/include/cereal/types/set.hpp b/include/cereal/types/set.hpp index 0f83fbbe8..bfa8b9c3b 100644 --- a/include/cereal/types/set.hpp +++ b/include/cereal/types/set.hpp @@ -56,7 +56,7 @@ namespace cereal set.clear(); - auto hint = set.begin(); + auto hint = set.end(); for( size_type i = 0; i < size; ++i ) { typename SetT::key_type key; @@ -67,6 +67,7 @@ namespace cereal #else // NOT CEREAL_OLDER_GCC hint = set.emplace_hint( hint, std::move( key ) ); #endif // NOT CEREAL_OLDER_GCC + hint = set.end(); } } } diff --git a/unittests/multimap.cpp b/unittests/multimap.cpp index 3a09441b1..2798cad3f 100644 --- a/unittests/multimap.cpp +++ b/unittests/multimap.cpp @@ -32,21 +32,25 @@ TEST_SUITE_BEGIN("multimap"); TEST_CASE("binary_multimap") { test_multimap(); + test_multimap_equivalent_keys_order(); } TEST_CASE("portable_binary_multimap") { test_multimap(); + test_multimap_equivalent_keys_order(); } TEST_CASE("xml_multimap") { test_multimap(); + test_multimap_equivalent_keys_order(); } TEST_CASE("json_multimap") { test_multimap(); + test_multimap_equivalent_keys_order(); } TEST_SUITE_END(); diff --git a/unittests/multimap.hpp b/unittests/multimap.hpp index cc0f50bf9..dad1a2239 100644 --- a/unittests/multimap.hpp +++ b/unittests/multimap.hpp @@ -105,6 +105,8 @@ void test_multimap() } #define MULTIMAP_CHECK(InMap, OutMap) \ + CHECK_EQ( InMap.size(), OutMap.size() ); \ + CHECK_UNARY( std::equal( InMap.begin(), InMap.end(), OutMap.begin() ) ); \ for( auto & pair : OutMap ) \ { \ auto const count = InMap.count( pair.first ); \ @@ -126,4 +128,32 @@ void test_multimap() } } +template inline +void test_multimap_equivalent_keys_order() +{ + std::multimap o_multimap; + o_multimap.emplace('a', 1); + o_multimap.emplace('a', 2); + o_multimap.emplace('a', 3); + o_multimap.emplace('b', 10); + o_multimap.emplace('b', 20); + o_multimap.emplace('b', 30); + + std::ostringstream os; + { + OArchive oar(os); + oar(o_multimap); + } + + std::multimap i_multimap; + std::istringstream is(os.str()); + { + IArchive iar(is); + iar(i_multimap); + } + + CHECK_EQ(i_multimap.size(), o_multimap.size()); + CHECK_UNARY(std::equal(i_multimap.begin(), i_multimap.end(), o_multimap.begin())); +} + #endif // CEREAL_TEST_MULTIMAP_H_ diff --git a/unittests/multiset.cpp b/unittests/multiset.cpp index 991710108..8d376bc2b 100644 --- a/unittests/multiset.cpp +++ b/unittests/multiset.cpp @@ -32,21 +32,25 @@ TEST_SUITE_BEGIN("multiset"); TEST_CASE("binary_multiset") { test_multiset(); + test_multiset_equivalent_keys_order(); } TEST_CASE("portable_binary_multiset") { test_multiset(); + test_multiset_equivalent_keys_order(); } TEST_CASE("xml_multiset") { test_multiset(); + test_multiset_equivalent_keys_order(); } TEST_CASE("json_multiset") { test_multiset(); + test_multiset_equivalent_keys_order(); } TEST_SUITE_END(); diff --git a/unittests/multiset.hpp b/unittests/multiset.hpp index a1ddb93fe..739247b39 100644 --- a/unittests/multiset.hpp +++ b/unittests/multiset.hpp @@ -104,26 +104,36 @@ void test_multiset() iar(i_esplmultiset); } + CHECK_EQ( i_podmultiset.size(), o_podmultiset.size() ); + CHECK_UNARY( std::equal( i_podmultiset.begin(), i_podmultiset.end(), o_podmultiset.begin() ) ); for(auto const & p : i_podmultiset) { CHECK_EQ(o_podmultiset.count(p), i_podmultiset.count(p)); } + CHECK_EQ( i_isermultiset.size(), o_isermultiset.size() ); + CHECK_UNARY( std::equal( i_isermultiset.begin(), i_isermultiset.end(), o_isermultiset.begin() ) ); for(auto const & p : i_isermultiset) { CHECK_EQ(o_isermultiset.count(p), i_isermultiset.count(p)); } + CHECK_EQ( i_isplmultiset.size(), o_isplmultiset.size() ); + CHECK_UNARY( std::equal( i_isplmultiset.begin(), i_isplmultiset.end(), o_isplmultiset.begin() ) ); for(auto const & p : i_isplmultiset) { CHECK_EQ(o_isplmultiset.count(p), i_isplmultiset.count(p)); } + CHECK_EQ( i_esermultiset.size(), o_esermultiset.size() ); + CHECK_UNARY( std::equal( i_esermultiset.begin(), i_esermultiset.end(), o_esermultiset.begin() ) ); for(auto const & p : i_esermultiset) { CHECK_EQ(o_esermultiset.count(p), i_esermultiset.count(p)); } + CHECK_EQ( i_esplmultiset.size(), o_esplmultiset.size() ); + CHECK_UNARY( std::equal( i_esplmultiset.begin(), i_esplmultiset.end(), o_esplmultiset.begin() ) ); for(auto const & p : i_esplmultiset) { CHECK_EQ(o_esplmultiset.count(p), i_esplmultiset.count(p)); @@ -131,4 +141,31 @@ void test_multiset() } } +template inline +void test_multiset_equivalent_keys_order() +{ + std::multiset o_multiset; + o_multiset.emplace(1); + o_multiset.emplace(1); + o_multiset.emplace(1); + o_multiset.emplace(2); + o_multiset.emplace(2); + + std::ostringstream os; + { + OArchive oar(os); + oar(o_multiset); + } + + std::multiset i_multiset; + std::istringstream is(os.str()); + { + IArchive iar(is); + iar(i_multiset); + } + + CHECK_EQ(i_multiset.size(), o_multiset.size()); + CHECK_UNARY(std::equal(i_multiset.begin(), i_multiset.end(), o_multiset.begin())); +} + #endif // CEREAL_TEST_MULTISET_H_