diff options
author | lat9nq <22451773+lat9nq@users.noreply.github.com> | 2023-06-21 21:41:06 -0400 |
---|---|---|
committer | lat9nq <22451773+lat9nq@users.noreply.github.com> | 2023-07-21 10:56:55 -0400 |
commit | e7f01128f181a7b754f6d5f94122cde059c7ed1a (patch) | |
tree | f41e233577fbb839e39f91a86d3f5177aa0fa861 /src/common/settings_enums.h | |
parent | ecc1feff6478c1429648ebe003b54d974d9a3c3d (diff) |
settings: Give indices to enums
Diffstat (limited to 'src/common/settings_enums.h')
-rw-r--r-- | src/common/settings_enums.h | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h index a5f87c956..f9bb75840 100644 --- a/src/common/settings_enums.h +++ b/src/common/settings_enums.h @@ -11,8 +11,9 @@ namespace Settings { template <typename T> -struct Canonicalization { - static constexpr std::vector<std::pair<std::string, T>> Get(); +struct EnumMetadata { + static constexpr std::vector<std::pair<std::string, T>> Canonicalizations(); + static constexpr u32 Index(); }; #define PAIR_45(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_46(N, __VA_ARGS__)) @@ -65,10 +66,17 @@ struct Canonicalization { #define ENUM(NAME, ...) \ enum class NAME : u32 { __VA_ARGS__ }; \ template <> \ - constexpr std::vector<std::pair<std::string, NAME>> Canonicalization<NAME>::Get() { \ + constexpr std::vector<std::pair<std::string, NAME>> EnumMetadata<NAME>::Canonicalizations() { \ return {PAIR(NAME, __VA_ARGS__)}; \ + } \ + template <> \ + constexpr u32 EnumMetadata<NAME>::Index() { \ + return __COUNTER__; \ } +// AudioEngine must be specified discretely due to having existing but slightly different +// canonicalizations +// TODO (lat9nq): Remove explicit definition of AudioEngine/sink_id enum class AudioEngine : u32 { Auto, Cubeb, @@ -77,7 +85,8 @@ enum class AudioEngine : u32 { }; template <> -constexpr std::vector<std::pair<std::string, AudioEngine>> Canonicalization<AudioEngine>::Get() { +constexpr std::vector<std::pair<std::string, AudioEngine>> +EnumMetadata<AudioEngine>::Canonicalizations() { return { {"auto", AudioEngine::Auto}, {"cubeb", AudioEngine::Cubeb}, @@ -86,6 +95,13 @@ constexpr std::vector<std::pair<std::string, AudioEngine>> Canonicalization<Audi }; } +template <> +constexpr u32 EnumMetadata<AudioEngine>::Index() { + // This is just a sufficiently large number that is more than the number of other enums declared + // here + return 100; +} + ENUM(AudioMode, Mono, Stereo, Surround); ENUM(Language, Japanese, EnglishAmerican, French, German, Italian, Spanish, Chinese, Korean, Dutch, @@ -130,7 +146,7 @@ ENUM(AspectRatio, R16_9, R4_3, R21_9, R16_10, Stretch); template <typename Type> constexpr std::string CanonicalizeEnum(Type id) { - const auto group = Canonicalization<Type>::Get(); + const auto group = EnumMetadata<Type>::Canonicalizations(); for (auto& [name, value] : group) { if (value == id) { return name; @@ -141,7 +157,7 @@ constexpr std::string CanonicalizeEnum(Type id) { template <typename Type> constexpr Type ToEnum(const std::string& canonicalization) { - const auto group = Canonicalization<Type>::Get(); + const auto group = EnumMetadata<Type>::Canonicalizations(); for (auto& [name, value] : group) { if (name == canonicalization) { return value; |