diff options
| author | Maxime Coste <mawww@kakoune.org> | 2017-03-15 17:42:02 +0000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2017-03-15 17:42:02 +0000 |
| commit | a49e175727928b8b45c0c2ccdb01f143ea6d18c2 (patch) | |
| tree | 88c1c3909c2ab06394a63af5ebab8fdcd0a389f0 /src/enum.hh | |
| parent | a88e58763bd33e021511d2e821703f478afd85bf (diff) | |
Migrate to a more value based meta programming model
Introduce Meta::Type<T> to store a type as value, and pass it
around, migrate enum_desc and option_type_name to this.
Diffstat (limited to 'src/enum.hh')
| -rw-r--r-- | src/enum.hh | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/enum.hh b/src/enum.hh index 01f89b32..56242508 100644 --- a/src/enum.hh +++ b/src/enum.hh @@ -5,6 +5,7 @@ #include "string.hh" #include "exception.hh" #include "containers.hh" +#include "meta.hh" namespace Kakoune { @@ -22,10 +23,10 @@ struct Array template<typename T> struct EnumDesc { T value; StringView name; }; -template<typename Flags, typename = decltype(enum_desc(Flags{}))> +template<typename Flags, typename = decltype(enum_desc(Meta::Type<Flags>{}))> EnableIfWithBitOps<Flags, String> option_to_string(Flags flags) { - constexpr auto desc = enum_desc(Flags{}); + constexpr auto desc = enum_desc(Meta::Type<Flags>{}); String res; for (int i = 0; i < desc.size(); ++i) { @@ -38,10 +39,10 @@ EnableIfWithBitOps<Flags, String> option_to_string(Flags flags) return res; } -template<typename Enum, typename = decltype(enum_desc(Enum{}))> +template<typename Enum, typename = decltype(enum_desc(Meta::Type<Enum>{}))> EnableIfWithoutBitOps<Enum, String> option_to_string(Enum e) { - constexpr auto desc = enum_desc(Enum{}); + constexpr auto desc = enum_desc(Meta::Type<Enum>{}); auto it = find_if(desc, [e](const EnumDesc<Enum>& d) { return d.value == e; }); if (it != desc.end()) return it->name.str(); @@ -49,10 +50,10 @@ EnableIfWithoutBitOps<Enum, String> option_to_string(Enum e) return {}; } -template<typename Flags, typename = decltype(enum_desc(Flags{}))> +template<typename Flags, typename = decltype(enum_desc(Meta::Type<Flags>{}))> EnableIfWithBitOps<Flags> option_from_string(StringView str, Flags& flags) { - constexpr auto desc = enum_desc(Flags{}); + constexpr auto desc = enum_desc(Meta::Type<Flags>{}); flags = Flags{}; for (auto s : str | split<StringView>('|')) { @@ -63,17 +64,17 @@ EnableIfWithBitOps<Flags> option_from_string(StringView str, Flags& flags) } } -template<typename Enum, typename = decltype(enum_desc(Enum{}))> +template<typename Enum, typename = decltype(enum_desc(Meta::Type<Enum>{}))> EnableIfWithoutBitOps<Enum> option_from_string(StringView str, Enum& e) { - constexpr auto desc = enum_desc(Enum{}); + constexpr auto desc = enum_desc(Meta::Type<Enum>{}); auto it = find_if(desc, [str](const EnumDesc<Enum>& d) { return d.name == str; }); if (it == desc.end()) throw runtime_error(format("invalid enum value '{}'", str)); e = it->value; } -template<typename Flags, typename = decltype(enum_desc(Flags{}))> +template<typename Flags, typename = decltype(enum_desc(Meta::Type<Flags>{}))> EnableIfWithBitOps<Flags, bool> option_add(Flags& opt, StringView str) { Flags res = Flags{}; |
