21#define assert_enum(e,v) assert(e##Enum::isValid(v))
23template <
class T,
typename E>
struct Reflection {
26 static const char *key(isize nr) {
return T::key((E)nr); }
29 static const char *plainkey(isize nr) {
31 for (isize i = 0; p[i]; i++)
if (p[i] ==
'.')
return p + i + 1;
36 static std::map <string, E> pairs() {
38 std::map <string, E> result;
40 for (
auto i = T::minVal; i <= T::maxVal; i++) {
41 if (T::isValid(i)) result.insert(std::make_pair(key(i), E(i)));
48 static string keyList(std::function<
bool(E)> filter = [](E){
return true; },
const string &delim =
", ") {
52 for (
auto i = T::minVal; i <= T::maxVal; i++) {
54 if (T::isValid(i) && filter(E(i))) {
56 if (result !=
"") result += delim;
65 static string argList(std::function<
bool(E)> filter = [](E){
return true; }) {
67 return "{ " + keyList(filter,
" | ") +
" }";