From 3885cb29a2a5b875e72f3f5356fa6298c3fd7dac Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Sun, 17 May 2020 11:53:27 +0200 Subject: [PATCH] Add control of type and oplists --- m-funcobj.h | 9 +++++++++ m-tuple.h | 7 +++++++ m-variant.h | 8 ++++++++ 3 files changed, 24 insertions(+) diff --git a/m-funcobj.h b/m-funcobj.h index 99f7b5e0..3b1657e4 100644 --- a/m-funcobj.h +++ b/m-funcobj.h @@ -241,6 +241,8 @@ M_MAP(FUNC_OBJ_INS_ATTR_STRUCT, __VA_ARGS__) \ } M_C(name, _t)[1]; \ \ + FUNCOBJI_CONTROL_ALL_OPLIST(name, __VA_ARGS__) \ + \ static inline M_C(base_name, _retcode_t) \ M_C(name, _callback)(M_C(base_name, _t) obj \ M_IF_EMPTY(M_OPFLAT param_list)( \ @@ -333,4 +335,11 @@ #define FUNC_OBJ_TEST_METHOD_P(method, ...) \ M_IF(M_REDUCE2(FUNC_OBJ_TEST_METHOD1_P, M_AND, method, __VA_ARGS__)) +/* Macro for checking compatible type and oplist */ +#define FUNCOBJI_CONTROL_ALL_OPLIST(name, ...) \ + M_MAP2(FUNCOBJI_CONTROL_OPLIST, name, __VA_ARGS__) +#define FUNCOBJI_CONTROL_OPLIST(name, a) \ + M_CHECK_COMPATIBLE_OPLIST(name, M_RET_ARG1 a, M_RET_ARG2 a, M_RET_ARG3 a) + + #endif diff --git a/m-tuple.h b/m-tuple.h index cbdcba44..2bc3b981 100644 --- a/m-tuple.h +++ b/m-tuple.h @@ -108,6 +108,7 @@ namespace m_tuple { #define TUPLEI_DEF2_P3(name, ...) \ TUPLE_DEFINE_TYPE(name, __VA_ARGS__) \ TUPLE_DEFINE_ENUM(name, __VA_ARGS__) \ + TUPLE_CONTROL_ALL_OPLIST(name, __VA_ARGS__) \ TUPLEI_IF_ALL(INIT, __VA_ARGS__) \ (TUPLE_DEFINE_INIT(name, __VA_ARGS__),) \ TUPLE_DEFINE_INIT_SET(name, __VA_ARGS__) \ @@ -210,6 +211,12 @@ namespace m_tuple { #define TUPLE_DEFINE_ENUM_ELE(name, a) \ M_C4(name, _, TUPLE_GET_FIELD a, _value) +#define TUPLE_CONTROL_ALL_OPLIST(name, ...) \ + M_MAP2(TUPLE_CONTROL_OPLIST, name, __VA_ARGS__) +#define TUPLE_CONTROL_OPLIST(name, a) \ + M_CHECK_COMPATIBLE_OPLIST(name, TUPLE_GET_FIELD a, \ + TUPLE_GET_TYPE a, TUPLE_GET_OPLIST a) + #define TUPLE_DEFINE_INIT(name, ...) \ static inline void M_C(name, _init)(M_C(name,_t) my) { \ diff --git a/m-variant.h b/m-variant.h index b6e9067d..391fca45 100644 --- a/m-variant.h +++ b/m-variant.h @@ -81,6 +81,7 @@ /* Define the variant */ #define VARIANTI_DEF2_P3(name, ...) \ VARIANTI_DEFINE_TYPE(name, __VA_ARGS__) \ + VARIANTI_CONTROL_ALL_OPLIST(name, __VA_ARGS__) \ VARIANTI_DEFINE_INIT(name, __VA_ARGS__) \ VARIANTI_DEFINE_CLEAR(name, __VA_ARGS__) \ VARIANTI_DEFINE_INIT_SET(name, __VA_ARGS__) \ @@ -176,6 +177,13 @@ VARIANTI_GET_TYPE a VARIANTI_GET_FIELD a ; +#define VARIANTI_CONTROL_ALL_OPLIST(name, ...) \ + M_MAP2(VARIANTI_CONTROL_OPLIST, name, __VA_ARGS__) +#define VARIANTI_CONTROL_OPLIST(name, a) \ + M_CHECK_COMPATIBLE_OPLIST(name, VARIANTI_GET_FIELD a, \ + VARIANTI_GET_TYPE a, VARIANTI_GET_OPLIST a) + + #define VARIANTI_DEFINE_INIT(name, ...) \ static inline void M_C(name, _init)(M_C(name,_t) my) { \ my->type = M_C(name, _EMPTY); \