| |
| // Copyright 2007-2009 Daniel James. |
| // Distributed under the Boost Software License, Version 1.0. (See accompanying |
| // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| |
| #include "../helpers/prefix.hpp" |
| |
| #include <boost/unordered_set.hpp> |
| #include <boost/unordered_map.hpp> |
| #include "../helpers/test.hpp" |
| |
| #include <iostream> |
| |
| namespace insert_stable |
| { |
| struct member { |
| int tag1_; |
| int tag2_; |
| |
| member() : tag1_(0), tag2_(0) {} |
| member(int t1, int t2) : tag1_(t1), tag2_(t2) {} |
| |
| friend bool operator==(member const& x, member const& y) { |
| return x.tag1_ == y.tag1_; |
| } |
| |
| friend bool operator!=(member const& x, member const& y) { |
| return x.tag1_ != y.tag1_; |
| } |
| }; |
| } |
| |
| #ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP |
| namespace boost |
| #else |
| namespace insert_stable |
| #endif |
| { |
| std::size_t hash_value(insert_stable::member const& x) { |
| return static_cast<std::size_t>(x.tag1_); |
| } |
| } |
| |
| UNORDERED_AUTO_TEST(stable_insert_test1) { |
| boost::unordered_multiset<insert_stable::member> x; |
| |
| x.insert(insert_stable::member(1,1)); |
| x.insert(insert_stable::member(1,2)); |
| x.insert(insert_stable::member(1,3)); |
| |
| boost::unordered_multiset<insert_stable::member>::const_iterator |
| it = x.begin(), end = x.end(); |
| BOOST_TEST(it != end); |
| if(it != end) { BOOST_TEST(it->tag2_ == 1); ++it; } |
| BOOST_TEST(it != end); |
| if(it != end) { BOOST_TEST(it->tag2_ == 2); ++it; } |
| BOOST_TEST(it != end); |
| if(it != end) { BOOST_TEST(it->tag2_ == 3); ++it; } |
| BOOST_TEST(it == end); |
| } |
| |
| UNORDERED_AUTO_TEST(stable_insert_test2) { |
| boost::unordered_multimap<insert_stable::member, int> x; |
| typedef |
| boost::unordered_multimap<insert_stable::member, int>::const_iterator |
| iterator; |
| |
| iterator it |
| = x.insert(x.end(), std::make_pair(insert_stable::member(1,1), 1)); |
| it = x.insert(it, std::make_pair(insert_stable::member(1,2), 2)); |
| it = x.insert(it, std::make_pair(insert_stable::member(1,3), 3)); |
| |
| it = x.begin(); |
| iterator end = x.end(); |
| BOOST_TEST(it != end); |
| if(it != end) { BOOST_TEST(it->first.tag2_ == 1 && it->second == 1); ++it; } |
| BOOST_TEST(it != end); |
| if(it != end) { BOOST_TEST(it->first.tag2_ == 2 && it->second == 2); ++it; } |
| BOOST_TEST(it != end); |
| if(it != end) { BOOST_TEST(it->first.tag2_ == 3 && it->second == 3); ++it; } |
| BOOST_TEST(it == end); |
| } |
| |
| RUN_TESTS() |