Add internal method M_GET_OPPROPERTY to get the subproperty of an oplist

Add test for such macro
Rename operator CLASS into PROPERTIES
This commit is contained in:
Patrick Pelissier committed 2021-06-17 00:20:35 +02:00
1 parent a950e15625
commit e688f0b1df
3 files changed
+20 -5

No files matched your search

+1 -1
View File
@@ -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.
+10 -4
View File
@@ -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.
+9
View File
@@ -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);
}