From 3be653d55aa1bd644f9d43a25d54d0e320eac21a Mon Sep 17 00:00:00 2001 From: DerSkythe Date: Thu, 8 Feb 2024 11:48:40 +0400 Subject: [PATCH] Improve README.md formatting and clarifications Corrections were made according PR #115 --- README.md | 101 ++++++++++++++++++++++++++---------------------------- 1 file changed, 48 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index ea5a6453..d7d84656 100644 --- a/README.md +++ b/README.md @@ -385,7 +385,8 @@ We can also write the same example shorter: #include "m-array.h" // Register the oplist of a mpz_t. -#define M_OPL_mpz_t() (INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), CLEAR(mpz_clear)) +#define M_OPL_mpz_t() (INIT(mpz_init), INIT_SET(mpz_init_set), \ + SET(mpz_set), CLEAR(mpz_clear)) // Define an instance of an array of mpz_t (both type and function) ARRAY_DEF(array_mpz, mpz_t) // Register the oplist of the created instance of array of mpz_t @@ -417,7 +418,8 @@ Or even shorter when you're comfortable enough with the library: #include "m-array.h" // Register the oplist of a mpz_t. It is a classic oplist. -#define M_OPL_mpz_t() M_OPEXTEND(M_CLASSIC_OPLIST(mpz), INIT_WITH(mpz_init_set_ui), EMPLACE_TYPE(unsigned nt) ) +#define M_OPL_mpz_t() M_OPEXTEND(M_CLASSIC_OPLIST(mpz), \ + INIT_WITH(mpz_init_set_ui), EMPLACE_TYPE(unsigned int)) // Define an instance of an array of mpz_t (both type and function) ARRAY_DEF(array_mpz, mpz_t) // Register the oplist of the created instance of array of mpz_t @@ -743,8 +745,8 @@ can be used instead, but this typedef shall be used everywhere. Example: ```C -#define - M_OPL_mpz_t() (INIT(mpz_init),SET(mpz_set),INIT_SET(mpz_init_set),CLEAR(mpz_clear),TYPE(mpz_t)) +#define M_OPL_mpz_t() (INIT(mpz_init),SET(mpz_set), \ + INIT_SET(mpz_init_set),CLEAR(mpz_clear),TYPE(mpz_t)) ``` This can simplify a lot `OPLIST` usage and it is recommended. @@ -916,16 +918,17 @@ or override in the inherited oplist. For example: ```C int my_int_oor_set(char c) { return INT_MIN + c; } bool my_int_oor_equal(int i1, int i2) { return i1 == i2; } -#define MY_INT_OPLIST \ - M_OPEXTEND(M_BASIC_OPLIST, OOR_SET(API_4(my_int_oor_set)), OOR_EQUAL(my_int_oor_equal)) +#define MY_INT_OPLIST \ + M_OPEXTEND(M_BASIC_OPLIST, OOR_SET(API_4(my_int_oor_set)), \ + OOR_EQUAL(my_int_oor_equal)) ``` You can even inherit from another oplist to disable some operators in your new oplist. For example: ```C -#define MY_INT_OPLIST \ - M_OPEXTEND(M_BASIC_OPLIST, HASH(0), CMP(0), EQUAL(0)) +#define MY_INT_OPLIST \ + M_OPEXTEND(M_BASIC_OPLIST, HASH(0), CMP(0), EQUAL(0)) ``` `MY_INT_OPLIST` is a new oplist that handles integers but has disabled the operators `HASH`, `CMP` and `EQUAL`. @@ -952,7 +955,8 @@ An oplist can therefore be: ```C typedef FILE *m_file_t; -#define M_OPL_m_file_t() (INIT_WITH(API(fopen, ARG1, ARG2, ID("wt"))),SET(0),INIT_SET(0),CLEAR(fclose),TYPEm_file_t)) +#define M_OPL_m_file_t() (INIT_WITH(API(fopen, ARG1, ARG2, ID("wt"))), \ + SET(0),INIT_SET(0),CLEAR(fclose),TYPE(m_file_t)) ``` Since there is no `INIT_SET` operator available, pretty much no container can work. @@ -1050,12 +1054,13 @@ If you take once again the example of the `FILE*`, a more complete oplist can be ```C typedef FILE *m_file_t; -#define -M_OPL_m_file_t() (INIT_WITH(API_1(M_INIT_WITH_THROUGH_EMPLACE_TYPE)),SET(0),INIT_SET(0),CLEAR(fclose),TYPEm_file_t), \ +#define M_OPL_m_file_t() (INIT_WITH(API_1(M_INIT_WITH_THROUGH_EMPLACE_TYPE)), \ + SET(0),INIT_SET(0),CLEAR(fclose),TYPE(m_file_t), \ EMPLACE_TYPE(LIST((_str, API(fopen, ARG1, ARG2, ID("wb")), char *)))) ``` -The `INIT_WITH` operator will use the provided init methods in the `EMPLACE_TYPE`. `EMPLACE_TYPE` defines a `_str` suffix method with a GAIA for `fopen`, and accepts a `char*` as argument. +The `INIT_WITH` operator will use the provided init methods in the `EMPLACE_TYPE`. +`EMPLACE_TYPE` defines a `_str` suffix method with a GAIA for `fopen`, and accepts a `char*` as argument. The GAIA specifies that the output (ARG1) is set as return value, ARG2 is given as the first argument, and a third constant argument is used. @@ -1696,10 +1701,10 @@ Example: #include #include "m-list.h" -#define MPZ_OUT_STR(stream, x) mpz_out_str(stream, 0, x) -LIST_DEF(list_mpz, mpz_t, \ - (INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), - CLEAR(mpz_clear), OUT_STR(MPZ_OUT_STR))) +#define MPZ_OUT_STR(stream, x) mpz_out_str(stream, 0, x) \ + LIST_DEF(list_mpz, mpz_t, \ + (INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), \ + CLEAR(mpz_clear), OUT_STR(MPZ_OUT_STR))) int main(void) { list_mpz_t a; @@ -1895,10 +1900,10 @@ Example: #include #include "m-list.h" -#define MPZ_OUT_STR(stream, x) mpz_out_str(stream, 0, x) -LIST_DUAL_PUSH_DEF(list_mpz, mpz_t, \ - (INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), - CLEAR(mpz_clear), OUT_STR(MPZ_OUT_STR))) +#define MPZ_OUT_STR(stream, x) mpz_out_str(stream, 0, x) \ + LIST_DUAL_PUSH_DEF(list_mpz, mpz_t, \ + (INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), \ + CLEAR(mpz_clear), OUT_STR(MPZ_OUT_STR))) int main(void) { list_mpz_t a; @@ -2053,10 +2058,10 @@ Example: #include #include "m-array.h" -#define MPZ_OUT_STR(stream, x) mpz_out_str(stream, 0, x) -ARRAY_DEF(array_mpz, mpz_t, \ - (INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), - CLEAR(mpz_clear), OUT_STR(MPZ_OUT_STR))) +#define MPZ_OUT_STR(stream, x) mpz_out_str(stream, 0, x) \ + ARRAY_DEF(array_mpz, mpz_t, \ + (INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), \ + CLEAR(mpz_clear), OUT_STR(MPZ_OUT_STR))) int main(void) { array_mpz_t a; @@ -2711,10 +2716,10 @@ Example: #include "m-string.h" #include "m-tuple.h" -#define MPZ_OUT_STR(stream, x) mpz_out_str(stream, 0, x) -TUPLE_DEF2(pair, - (key_field, string_t, STRING_OPLIST), - (value_field, mpz_t, M_OPEXTEND(M_CLASSIC_OPLIST(mpz), OUT_STR(MPZ_OUT_STR)))) +#define MPZ_OUT_STR(stream, x) mpz_out_str(stream, 0, x) \ + TUPLE_DEF2(pair,(key_field, string_t, STRING_OPLIST), \ + (value_field, mpz_t, M_OPEXTEND(M_CLASSIC_OPLIST(mpz), \ + OUT_STR(MPZ_OUT_STR)))) int main(void) { pair_t p1; @@ -3349,7 +3354,7 @@ The tree handles its own pool of nodes for the nodes. It is called the capacity of the tree. This pool of nodes will increase when needed by default. However, in case of capacity increased, all the nodes of the tree may move in memory to accommodate the new need. -You may also request to reserve more capacity to avoid moving the items, and disable this auto-expand feature (in which a MEMORY_FAILURE is raised). +You may also request to reserve more capacity to avoid moving the items, and disable this auto-expand feature (in which a `MEMORY_FAILURE` is raised). There are several way to iterate over this container: @@ -3451,7 +3456,7 @@ The user should use other the non `_raw` function if possible rather than this o as it is low level and error prone. `name_insert_down_raw` will move all children of the referenced node as children of the inserted children, -whereas `name_insert_down_raw` will insert the node as the new first child of the referenced node. +whereas `name_insert_child_raw` will insert the node as the new first child of the referenced node. ##### `it_t name_insert_up(it_t ref, const type value)` ##### `it_t name_insert_left(it_t ref, const type value)` @@ -3463,7 +3468,7 @@ Insert a node up (resp. left, right, down and down) the given referenced iterato It returns an iterator to the inserted node. `name_insert_down` will move all children of the referenced node as children of the inserted children, -whereas `name_insert_down` will insert the node as the new first child of the referenced node. +whereas `name_insert_child` will insert the node as the new first child of the referenced node. ##### `it_t name_move_up(it_t ref, type *value)` ##### `it_t name_move_left(it_t ref, type *value)` @@ -3475,7 +3480,7 @@ Insert a node up (resp. left, right, down and down) the given referenced iterato It returns an iterator to the inserted node. `name_move_down` will move all children of the referenced node as children of the inserted children, -whereas name_move_down will insert the node as the new first child of the referenced node. +whereas `name_move_child` will insert the node as the new first child of the referenced node. ##### `it_t name_emplace_up[suffix](it_t ref, args...)` ##### `it_t name_emplace_left[suffix](it_t ref, args...)` @@ -3491,7 +3496,7 @@ See [emplace chapter](#Emplace-construction) for more details. It returns an iterator to the inserted node. `name_emplace_down` will move all children of the referenced node as children of the inserted children, -whereas name_emplace_down will insert the node as the new first child of the referenced node. +whereas `name_emplace_child` will insert the node as the new first child of the referenced node. ##### `type *name_up_ref(name_it_t it)` ##### `type *name_down_ref(name_it_t it)` @@ -5700,7 +5705,7 @@ Provide the `OOR_SET` method of a string. Convert a string into a formatted string usable for I/O: Outputs the input string with quote around, -replacing any `\"` by `\\\"` within the string +replacing any `"` by `\"` within the string into the output string. ##### `bool string_parse_str(string_t v, const char str[], const char **endp)` @@ -5716,7 +5721,7 @@ decoded by the function. Write a string into a `FILE*` as a formatted string: Outputs the input string while quoting around, -replacing any `\"` by `\\\"` within the string, +replacing any `"` by `\"` within the string, and quote special characters. ##### `bool string_in_str(string_t v, FILE *f)` @@ -6153,9 +6158,6 @@ Return the pre-processing token `action_if_true` if `cond` is empty, `action_if_false` otherwise (meaning it is evaluated at macro processing stage, not at compiler stage). -`cond` shall be a preprocessing constant equal to 0 or 1. -(You could use `M_BOOL` to convert). - ##### `M_DELAY1(expr)` ##### `M_DELAY2(expr) ` ##### `M_DELAY3(expr)` @@ -6176,8 +6178,8 @@ Can not be chained. ##### `M_APPLY(func, args...)` -Apply `func` to `'(args...)` ensuring -that `a()` isn't evaluated until all `args` have been also evaluated. +Apply `func` to `(args...)` ensuring +that `func()` isn't evaluated until all `args` have been also evaluated. It is used to delay evaluation. ##### `M_EAT(...)` @@ -6263,7 +6265,7 @@ f(1) f(2) f(3) ##### `M_MAP_C(func, args...)` Apply `func` to each argument of the `args...` list of argument, -putting a comma between each expanded `func(argc)` +putting a comma between each expanded `func(args)` ```C M_MAP_C(f, 1, 2, 3) @@ -6772,12 +6774,6 @@ M_IF_METHOD_ALL(HASH, oplist1, oplist2, oplist3) (/*define function*/, ) Return the content of the property named `propname` as defined in the `PROPERTIES` field of the `oplist`, or 0 if it is not defined. -##### `M_TEST_NOEXCEPT_P(oplist, operator)` - -Test if the operator has the property `NOEXCEPT` or not in the oplist. -If this property is set to 1 for this operator, it means that there is a guarantee that the operator won't raise any error. -If the operator has not this property or it is set to 0, it means that it may raise some error (default). - ##### `M_DO_INIT_MOVE(oplist, dest, src)` ##### `M_DO_MOVE(oplist, dest, src)` @@ -7095,9 +7091,7 @@ The macro can: * Set a global error variable and return > [!NOTE] -> The last two cases are not properly fully supported yet. -> Throwing an exception is not fully supported yet -> (Needs M\*LIB support to clear the skipped objects). +> The last case is not properly fully supported yet. The default is to raise a fatal error. @@ -8413,7 +8407,7 @@ TUPLE_DEF2(my, (value, int), (name, string_t) ) -#define M_OPL_my_t() TUPLE_OPLIST(my, M_BASIC_OPLIST, STRING_OPLIST ) +#define M_OPL_my_t() TUPLE_OPLIST(my, M_BASIC_OPLIST, STRING_OPLIST) // Output in JSON file the structure my_t void output(my_t el1) @@ -8572,7 +8566,8 @@ with To register an oplist the *component user* shall define a macro like this for all oplists: ```C -#define M_GENERIC_ORG__COMP__OPLIST_() +#define M_GENERIC_ORG__COMP__OPLIST_() \ + ``` with @@ -8654,7 +8649,7 @@ The following macro is defined and enabled to iterate over a container (See exam * `each(item, container)` > [!Note] -> that only short names are defined in this header which may be +> Only short names are defined in this header which may be > incompatible with your own namespace (This header is still a WIP) _________________