AK: Add HashMap(std::initializer_list<Entry>) constructor

This allows us to construct a HashMap from an initializer list like so:

    HashMap<K, V> hash_map = { { K, V }, { K, V } { K, V } };
This commit is contained in:
Linus Groh 2020-12-28 12:49:16 +01:00 committed by Andreas Kling
parent 1dbd264239
commit 1ed72cc580
2 changed files with 31 additions and 1 deletions

View file

@ -31,6 +31,13 @@
#include <AK/StdLibExtras.h>
#include <AK/Vector.h>
// NOTE: We can't include <initializer_list> during the toolchain bootstrap,
// since it's part of libstdc++, and libstdc++ depends on LibC.
// For this reason, we don't support HashMap(initializer_list) in LibC.
#ifndef SERENITY_LIBC_BUILD
# include <initializer_list>
#endif
namespace AK {
template<typename K, typename V, typename KeyTraits>
@ -49,7 +56,19 @@ private:
public:
HashMap() { }
bool is_empty() const { return m_table.is_empty(); }
#ifndef SERENITY_LIBC_BUILD
HashMap(std::initializer_list<Entry> list)
{
ensure_capacity(list.size());
for (auto& item : list)
set(item.key, item.value);
}
#endif
bool is_empty() const
{
return m_table.is_empty();
}
size_t size() const { return m_table.size(); }
size_t capacity() const { return m_table.capacity(); }
void clear() { m_table.clear(); }

View file

@ -36,6 +36,17 @@ TEST_CASE(construct)
EXPECT_EQ(IntIntMap().size(), 0u);
}
TEST_CASE(construct_from_initializer_list)
{
HashMap<int, String> number_to_string {
{ 1, "One" },
{ 2, "Two" },
{ 3, "Three" },
};
EXPECT_EQ(number_to_string.is_empty(), false);
EXPECT_EQ(number_to_string.size(), 3u);
}
TEST_CASE(populate)
{
HashMap<int, String> number_to_string;