dense_map: added count

This commit is contained in:
Michele Caini
2022-08-03 18:09:52 +02:00
parent 57067bc362
commit 2b0045e23e
2 changed files with 32 additions and 6 deletions

View File

@@ -748,6 +748,27 @@ public:
return insert_or_do_nothing(std::move(key)).first->second;
}
/**
* @brief Returns the number of elements matching a key (either 1 or 0).
* @param key Key value of an element to search for.
* @return Number of elements matching the key (either 1 or 0).
*/
[[nodiscard]] size_type count(const key_type &key) const {
return find(key) != end();
}
/**
* @brief Returns the number of elements matching a key (either 1 or 0).
* @tparam Other Type of the key value of an element to search for.
* @param key Key value of an element to search for.
* @return Number of elements matching the key (either 1 or 0).
*/
template<typename Other>
[[nodiscard]] std::enable_if_t<is_transparent_v<hasher> && is_transparent_v<key_equal>, std::conditional_t<false, Other, size_type>>
count(const Other &key) const {
return find(key) != end();
}
/**
* @brief Finds an element with a given key.
* @param key Key value of an element to search for.

View File

@@ -26,7 +26,7 @@ struct transparent_equal_to {
};
TEST(DenseMap, Functionalities) {
entt::dense_map<std::size_t, std::size_t, entt::identity, transparent_equal_to> map;
entt::dense_map<int, int, entt::identity, transparent_equal_to> map;
ASSERT_NO_THROW([[maybe_unused]] auto alloc = map.get_allocator());
@@ -34,7 +34,7 @@ TEST(DenseMap, Functionalities) {
ASSERT_EQ(map.size(), 0u);
ASSERT_EQ(map.load_factor(), 0.f);
ASSERT_EQ(map.max_load_factor(), .875f);
ASSERT_EQ(map.max_size(), (std::vector<entt::internal::dense_map_node<std::size_t, std::size_t>>{}.max_size()));
ASSERT_EQ(map.max_size(), (std::vector<entt::internal::dense_map_node<int, int>>{}.max_size()));
map.max_load_factor(.9f);
@@ -68,7 +68,12 @@ TEST(DenseMap, Functionalities) {
ASSERT_EQ(map.hash_function()(42), 42);
ASSERT_TRUE(map.key_eq()(42, 42));
map.emplace(0u, 0u);
map.emplace(0, 0);
ASSERT_EQ(map.count(0), 1u);
ASSERT_EQ(map.count(4.2), 0u);
ASSERT_EQ(std::as_const(map).count(0.0), 1u);
ASSERT_EQ(std::as_const(map).count(42), 0u);
ASSERT_FALSE(map.empty());
ASSERT_EQ(map.size(), 1u);
@@ -77,8 +82,8 @@ TEST(DenseMap, Functionalities) {
ASSERT_NE(std::as_const(map).begin(), std::as_const(map).end());
ASSERT_NE(map.cbegin(), map.cend());
ASSERT_TRUE(map.contains(0u));
ASSERT_EQ(map.bucket(0u), 0u);
ASSERT_TRUE(map.contains(0));
ASSERT_EQ(map.bucket(0), 0u);
map.clear();
@@ -89,7 +94,7 @@ TEST(DenseMap, Functionalities) {
ASSERT_EQ(std::as_const(map).begin(), std::as_const(map).end());
ASSERT_EQ(map.cbegin(), map.cend());
ASSERT_FALSE(map.contains(0u));
ASSERT_FALSE(map.contains(0));
}
TEST(DenseMap, Constructors) {