diff --git a/m-variant.h b/m-variant.h index 250b6ee2..5db19c68 100644 --- a/m-variant.h +++ b/m-variant.h @@ -173,6 +173,20 @@ } +#define VARIANTI_OPLIST(name, ...) \ + (INIT(M_C(name,_init)), \ + INIT_SET(M_C(name, _init_set)), \ + SET(M_C(name,_set)), \ + CLEAR(M_C(name, _clear)), \ + TYPE(M_C(name,_t)), \ + M_IF_METHOD_ALL(HASH, __VA_ARGS__)(HASH(M_C(name, _hash)),), \ + M_IF_METHOD_ALL(EQUAL, __VA_ARGS__)(EQUAL(M_C(name, _equal_p)),), \ + M_IF_METHOD_ALL(GET_STR, __VA_ARGS__)(EQUAL(M_C(name, _get_str)),), \ + M_IF_METHOD_ALL(IN_STR, __VA_ARGS__)(EQUAL(M_C(name, _in_str)),), \ + M_IF_METHOD_ALL(OUT_STR, __VA_ARGS__)(EQUAL(M_C(name, _out_str)),), \ + M_IF_METHOD_ALL(INIT_MOVE, __VA_ARGS__)(EQUAL(M_C(name, _init_move)),), \ + M_IF_METHOD_ALL(MOVE, __VA_ARGS__)(EQUAL(M_C(name, _move)),), \ + ) /********************** External interface *************************/ @@ -186,5 +200,11 @@ VARIANTI_DEFINE_SETTER(name, __VA_ARGS__) \ VARIANTI_DEFINE_GETTER(name, __VA_ARGS__) \ +/* Define the oplist of a tuple. + VARIANT_OPLIST(name[, oplist of the first type, ...]) */ +#define VARIANT_OPLIST(...) \ + M_IF_NARGS_EQ1(__VA_ARGS__) \ + (VARIANTI_OPLIST(__VA_ARGS__, () ), \ + VARIANTI_OPLIST(__VA_ARGS__ )) #endif