diff --git a/modules/common/chowdsp_data_structures/Structures/chowdsp_EnumMap.h b/modules/common/chowdsp_data_structures/Structures/chowdsp_EnumMap.h index 5ff6add3..d709180b 100644 --- a/modules/common/chowdsp_data_structures/Structures/chowdsp_EnumMap.h +++ b/modules/common/chowdsp_data_structures/Structures/chowdsp_EnumMap.h @@ -1,4 +1,5 @@ #pragma once +#include #if 1 // JUCE_MODULE_AVAILABLE_chowdsp_reflection #include @@ -50,6 +51,12 @@ struct EnumMap return enum_count; } + constexpr void clear() + { + for (auto& opt : storage) + opt.reset(); + } + constexpr void insert_or_assign (Key key, T value) noexcept { storage[get_index (key)] = value; @@ -63,6 +70,14 @@ struct EnumMap return *opt; } + template + constexpr std::enable_if_t, T&> emplace (Key key) + { + auto& opt = storage[get_index (key)]; + opt.emplace(); + return *opt; + } + [[nodiscard]] constexpr std::optional& at (Key key) { return storage[get_index (key)]; @@ -111,8 +126,7 @@ struct EnumMap { ++index; ++iter; - } - while (! iter->has_value() && index < std::tuple_size_v); + } while (! iter->has_value() && index < std::tuple_size_v); if (index < std::tuple_size_v) key = magic_enum::enum_value (index); @@ -126,7 +140,7 @@ struct EnumMap constexpr auto begin() noexcept { - return iterator { + return iterator { 0, storage.begin(), magic_enum::enum_value (0), @@ -135,7 +149,7 @@ struct EnumMap constexpr auto begin() const noexcept { - return iterator { + return iterator { 0, storage.cbegin(), magic_enum::enum_value (0), @@ -144,7 +158,7 @@ struct EnumMap constexpr auto end() noexcept { - return iterator { + return iterator { enum_count, storage.end(), {}, @@ -153,7 +167,7 @@ struct EnumMap constexpr auto end() const noexcept { - return iterator { + return iterator { enum_count, storage.cend(), {},