diff --git a/example/ex-multi02.c b/example/ex-multi02.c index 42499b86..b949f0ad 100644 --- a/example/ex-multi02.c +++ b/example/ex-multi02.c @@ -8,35 +8,42 @@ #include "m-dict.h" #include "m-array.h" +/* Define the OPLIST of a mpz_t and register it globally */ +#define M_OPL_mpz_t() \ + (INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), CLEAR(mpz_clear), \ + EQUAL( API( mpz_cmp, EQ(0), ARG1, ARG2)), \ + CMP(mpz_cmp), \ + OUT_STR( API( mpz_out_str, VOID, ARG1, 10, ARG2)), \ + IN_STR( API( mpz_inp_str, GT(0), ARG1, ARG2, 10)), \ + TYPE(mpz_t) ) + /* Define a variant over two integers named integer_t Notice than mpz_t has special init & clear functions mpz_init & mpz_clear. This is handle by the library. */ VARIANT_DEF2(my_integer, - (n, long long, M_DEFAULT_OPLIST), - (z, mpz_t, M_CLASSIC_OPLIST(mpz))) -/* Define the oplist associated to this variant */ -#define MY_INTEGER_OPLIST VARIANT_OPLIST(my_integer, M_DEFAULT_OPLIST, M_CLASSIC_OPLIST(mpz)) + (n, long long), + (z, mpz_t)) +/* Define the oplist associated to this variant and register it */ +#define M_OPL_my_integer_t() VARIANT_OPLIST(my_integer, M_DEFAULT_OPLIST, M_OPL_mpz_t() ) /* Define a dictionary of string --> integer named dict_my_t */ -DICT_DEF2(my_dict, - string_t, STRING_OPLIST, - my_integer_t, MY_INTEGER_OPLIST) -/* Define the oplist associated to this dictionary */ -#define MY_DICT_OPLIST DICT_OPLIST(my_dict, STRING_OPLIST, MY_INTEGER_OPLIST) +DICT_DEF2(my_dict, string_t, my_integer_t) +/* Define the oplist associated to this dictionary and register it */ +#define M_OPL_my_dict_t() DICT_OPLIST(my_dict, STRING_OPLIST, M_OPL_my_integer_t() ) /* Define an array of such dictionary named array_my_t */ -ARRAY_DEF(my_array, my_dict_t, MY_DICT_OPLIST) -/* Define the oplist associated to this array of dictionary of variant */ -#define MY_ARRAY_OPLIST ARRAY_OPLIST(my_array, MY_DICT_OPLIST) +ARRAY_DEF(my_array, my_dict_t) +/* Define the oplist associated to this array of dictionary of variant and register it */ +#define M_OPL_my_array_t() ARRAY_OPLIST(my_array, M_OPL_my_dict_t()) int main(void) { - M_LET(z, MY_INTEGER_OPLIST) /* Define & init & clear an instance of a variant of integer */ - M_LET(dict, MY_DICT_OPLIST) /* Define & init & clear an instance of a dictionary of variant */ - M_LET(array, MY_ARRAY_OPLIST) /* Define & init & clear an intance of an array of dictionary of variant */ - M_LET(gmp, M_CLASSIC_OPLIST(mpz)) /* M_LET allows even with non container type */ + M_LET(z, my_integer_t) /* Define & init & clear an instance of a variant of integer */ + M_LET(dict, my_dict_t) /* Define & init & clear an instance of a dictionary of variant */ + M_LET(array, my_array_t) /* Define & init & clear an intance of an array of dictionary of variant */ + M_LET(gmp, mpz_t) /* M_LET allows even with non container type */ { my_integer_set_n (z, 17LL); // Set z as the long long 17 my_dict_set_at(dict, STRING_CTE("n1"), z); // Push it in the dictionary @@ -46,9 +53,9 @@ int main(void) my_array_push_back (array, dict); // Push the dictionary in the array // Iterate over the array container - for M_EACH(item, array, MY_ARRAY_OPLIST) { + for M_EACH(item, array, my_array_t) { // Iterate over the dictionary container - for M_EACH(p, *item, MY_DICT_OPLIST) { + for M_EACH(p, *item, M_OPL_my_dict_t()) { // Dictionary iterator are pair (key,value) if (my_integer_n_p(p->value)) { printf ("It is a long long, value = %lld\n",