From e688f0b1dfa683bab13ae3717c7f47d247e56707 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Thu, 17 Jun 2021 00:20:35 +0200 Subject: [PATCH] Add internal method M_GET_OPPROPERTY to get the subproperty of an oplist Add test for such macro Rename operator CLASS into PROPERTIES --- README.md | 2 +- m-core.h | 14 ++++++++++---- tests/test-mcore.c | 9 +++++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 11769f01..1ae4664f 100644 --- a/README.md +++ b/README.md @@ -567,7 +567,7 @@ Other documented operators are: * REVERSE(obj) : Reverse the order of the items in the container 'obj'. * SEPARATOR() --> character: Return the character used to separate items for I/O methods (default is ',') (for internal use only). * EXT\_ALGO(name, container oplist, object oplist): Define additional algorithms functions specialized for the containers (for internal use only). -* CLASS() --> ( properties): Return internal properties of a container (for internal use only) in an oplist format. +* PROPERTIES() --> ( properties): Return internal properties of a container (for internal use only) in an oplist format. The operator names listed above shall not be defined as macro. diff --git a/m-core.h b/m-core.h index f924baeb..7d02d5b9 100644 --- a/m-core.h +++ b/m-core.h @@ -1120,7 +1120,7 @@ M_BEGIN_PROTECTED_CODE #define M_PATTERN_MAP_MAP , #define M_PATTERN_KEYVAL_KEYVAL , #define M_PATTERN_KEYVAL_PTR_KEYVAL_PTR , - +#define M_PATTERN_priority_priority , /* Necessary macros to handle recursivity, delaying the evaluation by one (or more) level of macro expansion. @@ -2638,7 +2638,7 @@ static inline size_t m_core_cstr_hash(const char str[]) #define M_OOR_SET_OOR_SET(a) ,a, #define M_OOR_EQUAL_OOR_EQUAL(a) ,a, #define M_LIMITS_LIMITS(a) ,a, -#define M_CLASS_CLASS(a) ,a, +#define M_PROPERTIES_PROPERTIES(a) ,a, /* From an oplist - an unorded list of methods : like "INIT(mpz_init),CLEAR(mpz_clear),SET(mpz_set)" - Return the given method in the oplist or the default method. @@ -2720,7 +2720,7 @@ static inline size_t m_core_cstr_hash(const char str[]) #define M_GET_OOR_SET(...) M_GET_METHOD(OOR_SET, M_NO_DEFAULT, __VA_ARGS__) #define M_GET_OOR_EQUAL(...) M_GET_METHOD(OOR_EQUAL, M_NO_DEFAULT, __VA_ARGS__) #define M_GET_LIMITS(...) M_GET_METHOD(LIMITS, M_LIMITS_DEFAULT, __VA_ARGS__) -#define M_GET_CLASS(...) M_GET_METHOD(CLASS, (), __VA_ARGS__) +#define M_GET_PROPERTIES(...) M_GET_METHOD(PROPERTIES, (), __VA_ARGS__) // Calling method with support of defined transformation API // operators that are not methods are commented @@ -2791,7 +2791,7 @@ static inline size_t m_core_cstr_hash(const char str[]) #define M_CALL_OOR_SET(oplist, ...) M_APPLY_API(M_GET_OOR_SET oplist, oplist, __VA_ARGS__) #define M_CALL_OOR_EQUAL(oplist, ...) M_APPLY_API(M_GET_OOR_EQUAL oplist, oplist, __VA_ARGS__) //#define M_CALL_LIMITS(oplist, ...) M_APPLY_API(M_GET_LIMITS oplist, oplist, __VA_ARGS__) -//#define M_CALL_CLASS(oplist, ...) M_APPLY_API(M_GET_CLASS oplist, oplist, __VA_ARGS__) +//#define M_CALL_PROPERTIES(oplist, ...) M_APPLY_API(M_GET_PROPERTIES oplist, oplist, __VA_ARGS__) /* API transformation support: transform the call to the method into the supported API by the method. @@ -3179,6 +3179,12 @@ m_core_parse2_enum (const char str[], const char **endptr) /* Extend an oplist by adding some methods */ #define M_OPEXTEND(op, ...) (__VA_ARGS__, M_OPFLAT op) +/* Return the content of a property named 'propname' + in the PROPERTIES field of oplist + or 0, if it is not defined */ +#define M_GET_OPPROPERTY(oplist, propname) \ + M_GET_METHOD (propname, 0, M_OPFLAT M_GET_PROPERTIES oplist) + /* Test if a method is present in an oplist. Return 0 (method is absent or disabled) or 1 (method is present and not disabled). NOTE: Does not work if method is OPLIST, KEY_OPLIST or VALUE_OPLIST. diff --git a/tests/test-mcore.c b/tests/test-mcore.c index a11fc42c..669a6c87 100644 --- a/tests/test-mcore.c +++ b/tests/test-mcore.c @@ -706,6 +706,14 @@ static void test_M_CSTR(void) assert (r == 0); } +static void test_properties(void) +{ +#define OP_PROP() ( INIT(init), PROPERTIES((INIT(1), IT_TYPE(2), INIT_WITH(priority))) ) + assert( M_GET_OPPROPERTY (OP_PROP(), INIT ) == 1); + assert( M_GET_OPPROPERTY (OP_PROP(), CLEAR ) == 0); + assert( M_GET_OPPROPERTY (OP_PROP(), IT_TYPE ) == 2); + assert( M_KEYWORD_P( M_GET_OPPROPERTY (OP_PROP(), INIT_WITH ), priority)); +} int main(void) { test_cat(); @@ -730,5 +738,6 @@ int main(void) test_builtin(); test_str_hash(); test_M_CSTR(); + test_properties(); exit(0); }