mirror of
				https://github.com/boostorg/unordered.git
				synced 2025-11-04 01:31:41 +01:00 
			
		
		
		
	Implement heterogeneous equal_range() for unordered_map
				
					
				
			This commit is contained in:
		@@ -272,6 +272,153 @@ template <class UnorderedMap> void test_non_transparent_find()
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class UnorderedMap> void test_transparent_equal_range()
 | 
			
		||||
{
 | 
			
		||||
  count_reset();
 | 
			
		||||
 | 
			
		||||
  UnorderedMap unordered_map;
 | 
			
		||||
 | 
			
		||||
  unordered_map[key(0)] = 1337;
 | 
			
		||||
 | 
			
		||||
  int const expected_key_count = 2;
 | 
			
		||||
 | 
			
		||||
  BOOST_TEST(key::count_ == expected_key_count);
 | 
			
		||||
 | 
			
		||||
  typedef typename UnorderedMap::value_type value_type;
 | 
			
		||||
 | 
			
		||||
  // explicitly test `equal_range()` vs `equal_range() const`
 | 
			
		||||
  //
 | 
			
		||||
  {
 | 
			
		||||
    typedef typename UnorderedMap::iterator iterator;
 | 
			
		||||
    typedef std::pair<iterator, iterator> iterator_pair;
 | 
			
		||||
 | 
			
		||||
    UnorderedMap& map = unordered_map;
 | 
			
		||||
 | 
			
		||||
    iterator_pair iters = map.equal_range(0);
 | 
			
		||||
 | 
			
		||||
    iterator begin = iters.first;
 | 
			
		||||
    iterator end = iters.second;
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST(begin != end);
 | 
			
		||||
    BOOST_TEST(begin != map.end());
 | 
			
		||||
 | 
			
		||||
    value_type const& val = *begin;
 | 
			
		||||
    BOOST_TEST(val.second == 1337);
 | 
			
		||||
 | 
			
		||||
    iters = map.equal_range(1337);
 | 
			
		||||
 | 
			
		||||
    begin = iters.first;
 | 
			
		||||
    end = iters.second;
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST(begin == end);
 | 
			
		||||
    BOOST_TEST(begin == map.end());
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST(key::count_ == expected_key_count);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    typedef typename UnorderedMap::const_iterator iterator;
 | 
			
		||||
    typedef std::pair<iterator, iterator> iterator_pair;
 | 
			
		||||
 | 
			
		||||
    UnorderedMap const& map = unordered_map;
 | 
			
		||||
 | 
			
		||||
    iterator_pair iters = map.equal_range(0);
 | 
			
		||||
 | 
			
		||||
    iterator begin = iters.first;
 | 
			
		||||
    iterator end = iters.second;
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST(begin != end);
 | 
			
		||||
    BOOST_TEST(begin != map.end());
 | 
			
		||||
 | 
			
		||||
    value_type const& val = *begin;
 | 
			
		||||
    BOOST_TEST(val.second == 1337);
 | 
			
		||||
 | 
			
		||||
    iters = map.equal_range(1337);
 | 
			
		||||
 | 
			
		||||
    begin = iters.first;
 | 
			
		||||
    end = iters.second;
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST(begin == end);
 | 
			
		||||
    BOOST_TEST(begin == map.end());
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST(key::count_ == expected_key_count);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class UnorderedMap> void test_non_transparent_equal_range()
 | 
			
		||||
{
 | 
			
		||||
  count_reset();
 | 
			
		||||
 | 
			
		||||
  UnorderedMap unordered_map;
 | 
			
		||||
 | 
			
		||||
  unordered_map[key(0)] = 1337;
 | 
			
		||||
 | 
			
		||||
  int key_count = 2;
 | 
			
		||||
 | 
			
		||||
  BOOST_TEST(key::count_ == key_count);
 | 
			
		||||
 | 
			
		||||
  typedef typename UnorderedMap::value_type value_type;
 | 
			
		||||
 | 
			
		||||
  // explicitly test `equal_range()` vs `equal_range() const`
 | 
			
		||||
  //
 | 
			
		||||
  {
 | 
			
		||||
    typedef typename UnorderedMap::iterator iterator;
 | 
			
		||||
    typedef std::pair<iterator, iterator> iterator_pair;
 | 
			
		||||
 | 
			
		||||
    UnorderedMap& map = unordered_map;
 | 
			
		||||
 | 
			
		||||
    iterator_pair iters = map.equal_range(0);
 | 
			
		||||
 | 
			
		||||
    iterator begin = iters.first;
 | 
			
		||||
    iterator end = iters.second;
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST(begin != end);
 | 
			
		||||
    BOOST_TEST(begin != map.end());
 | 
			
		||||
 | 
			
		||||
    value_type const& val = *begin;
 | 
			
		||||
    BOOST_TEST(val.second == 1337);
 | 
			
		||||
 | 
			
		||||
    iters = map.equal_range(1337);
 | 
			
		||||
 | 
			
		||||
    begin = iters.first;
 | 
			
		||||
    end = iters.second;
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST(begin == end);
 | 
			
		||||
    BOOST_TEST(begin == map.end());
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST(key::count_ == 2 + key_count);
 | 
			
		||||
    key_count += 2;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    typedef typename UnorderedMap::const_iterator iterator;
 | 
			
		||||
    typedef std::pair<iterator, iterator> iterator_pair;
 | 
			
		||||
 | 
			
		||||
    UnorderedMap const& map = unordered_map;
 | 
			
		||||
 | 
			
		||||
    iterator_pair iters = map.equal_range(0);
 | 
			
		||||
 | 
			
		||||
    iterator begin = iters.first;
 | 
			
		||||
    iterator end = iters.second;
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST(begin != end);
 | 
			
		||||
    BOOST_TEST(begin != map.end());
 | 
			
		||||
 | 
			
		||||
    value_type const& val = *begin;
 | 
			
		||||
    BOOST_TEST(val.second == 1337);
 | 
			
		||||
 | 
			
		||||
    iters = map.equal_range(1337);
 | 
			
		||||
 | 
			
		||||
    begin = iters.first;
 | 
			
		||||
    end = iters.second;
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST(begin == end);
 | 
			
		||||
    BOOST_TEST(begin == map.end());
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST(key::count_ == 2 + key_count);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
UNORDERED_AUTO_TEST (unordered_map_transparent_count) {
 | 
			
		||||
  {
 | 
			
		||||
    typedef boost::unordered_map<key, int, transparent_hasher,
 | 
			
		||||
@@ -280,6 +427,7 @@ UNORDERED_AUTO_TEST (unordered_map_transparent_count) {
 | 
			
		||||
 | 
			
		||||
    test_transparent_count<unordered_map>();
 | 
			
		||||
    test_transparent_find<unordered_map>();
 | 
			
		||||
    test_transparent_equal_range<unordered_map>();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
@@ -289,6 +437,7 @@ UNORDERED_AUTO_TEST (unordered_map_transparent_count) {
 | 
			
		||||
 | 
			
		||||
    test_non_transparent_count<unordered_map>();
 | 
			
		||||
    test_non_transparent_find<unordered_map>();
 | 
			
		||||
    test_non_transparent_equal_range<unordered_map>();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
@@ -299,6 +448,7 @@ UNORDERED_AUTO_TEST (unordered_map_transparent_count) {
 | 
			
		||||
 | 
			
		||||
    test_non_transparent_count<unordered_map>();
 | 
			
		||||
    test_non_transparent_find<unordered_map>();
 | 
			
		||||
    test_non_transparent_equal_range<unordered_map>();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
@@ -309,6 +459,7 @@ UNORDERED_AUTO_TEST (unordered_map_transparent_count) {
 | 
			
		||||
 | 
			
		||||
    test_non_transparent_count<unordered_map>();
 | 
			
		||||
    test_non_transparent_find<unordered_map>();
 | 
			
		||||
    test_non_transparent_equal_range<unordered_map>();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user