diff --git a/include/boost/unordered/unordered_map.hpp b/include/boost/unordered/unordered_map.hpp index 17dc987d..8621f913 100644 --- a/include/boost/unordered/unordered_map.hpp +++ b/include/boost/unordered/unordered_map.hpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) @@ -1382,6 +1383,20 @@ namespace boost { iterator erase(const_iterator); size_type erase(const key_type&); iterator erase(const_iterator, const_iterator); + + template + typename boost::enable_if_c< + detail::is_transparent::value && + detail::is_transparent::value && + !boost::is_convertible::value && + !boost::is_convertible::value, + size_type>::type + erase(BOOST_FWD_REF(Key) k) + { + return table_.erase_key_unique_impl( + this->key_eq(), boost::forward(k)); + } + BOOST_UNORDERED_DEPRECATED("Use erase instead") void quick_erase(const_iterator it) { erase(it); } BOOST_UNORDERED_DEPRECATED("Use erase instead") diff --git a/test/unordered/transparent_tests.cpp b/test/unordered/transparent_tests.cpp index 7acab1a4..5206ba2e 100644 --- a/test/unordered/transparent_tests.cpp +++ b/test/unordered/transparent_tests.cpp @@ -515,6 +515,36 @@ template void test_non_transparent_equal_range() } } +template void test_transparent_erase() +{ + count_reset(); + + UnorderedMap map; + + int num_erased = 0; + + num_erased = map.erase(0); + BOOST_TEST(map.empty()); + BOOST_TEST(num_erased == 0); + BOOST_TEST(key::count_ == 0); + + map[key(0)] = 1337; + map[key(1)] = 1338; + map[key(2)] = 1339; + + int const expected_key_count = 2 * map.size(); + + BOOST_TEST(key::count_ == expected_key_count); + + num_erased = map.erase(0); + BOOST_TEST(num_erased == 1); + + num_erased = map.erase(1337); + BOOST_TEST(num_erased == 0); + + BOOST_TEST(key::count_ == expected_key_count); +} + UNORDERED_AUTO_TEST (unordered_map_transparent_count) { { typedef boost::unordered_map