summaryrefslogtreecommitdiff
path: root/src/enum.hh
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2017-03-15 17:42:02 +0000
committerMaxime Coste <mawww@kakoune.org>2017-03-15 17:42:02 +0000
commita49e175727928b8b45c0c2ccdb01f143ea6d18c2 (patch)
tree88c1c3909c2ab06394a63af5ebab8fdcd0a389f0 /src/enum.hh
parenta88e58763bd33e021511d2e821703f478afd85bf (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.hh19
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{};