diff --git a/AK/HashMap.h b/AK/HashMap.h index cf1c8e22f12..424e14ac3d6 100644 --- a/AK/HashMap.h +++ b/AK/HashMap.h @@ -31,6 +31,13 @@ #include #include +// NOTE: We can't include 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 +#endif + namespace AK { template @@ -49,7 +56,19 @@ private: public: HashMap() { } - bool is_empty() const { return m_table.is_empty(); } +#ifndef SERENITY_LIBC_BUILD + HashMap(std::initializer_list 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(); } diff --git a/AK/Tests/TestHashMap.cpp b/AK/Tests/TestHashMap.cpp index b38437600f3..4b86bcd0823 100644 --- a/AK/Tests/TestHashMap.cpp +++ b/AK/Tests/TestHashMap.cpp @@ -36,6 +36,17 @@ TEST_CASE(construct) EXPECT_EQ(IntIntMap().size(), 0u); } +TEST_CASE(construct_from_initializer_list) +{ + HashMap 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 number_to_string;