From 4e194f28eef641a56a1f558c7e6187e1b9ad3f1b Mon Sep 17 00:00:00 2001 From: Leonardo Vencovsky Date: Tue, 29 Sep 2020 17:08:40 -0300 Subject: [PATCH] WIP new architecture, tests will fail --- README.md | 12 +--- examples/example.c | 2 +- src/ext_cmc_bitset.h | 12 ++-- src/ext_cmc_deque.h | 55 +++++++++++----- src/macro_collections.h | 141 +++++++++++++++++++++++----------------- 5 files changed, 131 insertions(+), 91 deletions(-) diff --git a/README.md b/README.md index cc0f98b..9d689ff 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ Below is a minimal example that makes use of some core functionalities. And a lo // needs to be generated first. Then, we can add other parts after. This macro // does all of that for us. The STR part will provide us with a function that // will be used later. -C_MACRO_COLLECTIONS_GEN(CMC, LIST, MY_LIST_PARAMS, (STR)) +C_MACRO_COLLECTIONS_EXTENDED(CMC, LIST, MY_LIST_PARAMS, (STR)) int main(void) { @@ -138,11 +138,12 @@ The C Macro Collections library is organized into many other sub-libraries. The Every macro that generates code for a certain collection can be found with the following template. Some exceptions exist as certain collections don't have or can't have some features. One big example is the `UTL` library, which does not follow this pattern. ``` -macro_name := CMC_[ lib ]_[ collection ]_[ part ]_[ file ] +macro_name := CMC_[ lib ]_[ collection ]_[ part ]_[ access ]_[ file ] lib := CMC | COR | DEV | EXT | INT | SAC | TSC collection := BITSET | DEQUE | HASHBIDIMAP | ... | TREEMULTISET | TREESET part := CORE | ITER | INIT | ... | SETF | NODE +access := PUBLIC | PRIVATE file := HEADER | SOURCE ``` @@ -157,13 +158,6 @@ Every macro is suffixed by `CMC` and each section is separated by an underscore * __documentation__ - The markdowns used by [mdBook](https://github.com/rust-lang/mdBook) to generate the website * __examples__ - Examples using the C Macro Collections Library * __src__ - All headers part of the C Macro Collections Library - * __cmc__ - The main C Macro Collections Library - * __cor__ - Core includes in the C Macro Collections Library - * __ext__ - Extensions to the CMC, SAC and TSC collections - * __int__ - Integrations between Collections - * __sac__ - Statically Allocated Collections - * __tsc__ - Thread Safe Collections - * __utl__ - Utilities like ForEach macros, logging, etc * __macro\_collections.h__ - Master header containing all collections and utilities * __tests__ - Where all tests are hosted diff --git a/examples/example.c b/examples/example.c index 527d78d..bf1ca90 100644 --- a/examples/example.c +++ b/examples/example.c @@ -12,7 +12,7 @@ // needs to be generated first. Then, we can add other parts after. This macro // does all of that for us. The STR part will provide us with a function that // will be used later. -C_MACRO_COLLECTIONS_GEN(CMC, LIST, MY_LIST_PARAMS, (STR)) +C_MACRO_COLLECTIONS_EXTENDED(CMC, LIST, MY_LIST_PARAMS, (STR)) int main(void) { diff --git a/src/ext_cmc_bitset.h b/src/ext_cmc_bitset.h index 4c713ff..7966ee6 100644 --- a/src/ext_cmc_bitset.h +++ b/src/ext_cmc_bitset.h @@ -18,13 +18,15 @@ */ #define CMC_EXT_CMC_BITSET_PARTS PLACEHOLDER -#define CMC_EXT_CMC_BITSET_PLACEHOLDER(PARAMS) +#define CMC_EXT_CMC_BITSET_PLACEHOLDER(ACCESS, FILE, PARAMS) \ + CMC_(CMC_(CMC_EXT_CMC_BITSET_PLACEHOLDER_, ACCESS), CMC_(_, FILE))(PARAMS) -#define CMC_EXT_CMC_BITSET_PLACEHOLDER_HEADER(PARAMS) +#define CMC_EXT_CMC_BITSET_PLACEHOLDER_PUBLIC_HEADER(PARAMS) -#define CMC_EXT_CMC_BITSET_PLACEHOLDER_SOURCE(PARAMS) +#define CMC_EXT_CMC_BITSET_PLACEHOLDER_PUBLIC_SOURCE(PARAMS) -#define CMC_EXT_CMC_BITSET_PLACEHOLDER_HEADER_(PFX, SNAME, V) -#define CMC_EXT_CMC_BITSET_PLACEHOLDER_SOURCE_(PFX, SNAME, V) +#define CMC_EXT_CMC_BITSET_PLACEHOLDER_PRIVATE_HEADER(PARAMS) + +#define CMC_EXT_CMC_BITSET_PLACEHOLDER_PRIVATE_SOURCE(PARAMS) #endif /* CMC_EXT_CMC_BITSET_H */ diff --git a/src/ext_cmc_deque.h b/src/ext_cmc_deque.h index 622f359..1e59c90 100644 --- a/src/ext_cmc_deque.h +++ b/src/ext_cmc_deque.h @@ -23,17 +23,24 @@ * * The part 'INIT' gives a new way of initializing a collection. The collection * struct is not heap allocated, only its internal structure (nodes, buffers). + * + * \param ACCESS Either PUBLIC or PRIVATE + * \param FILE Either HEADER or SOURCE + * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V) */ -#define CMC_EXT_CMC_DEQUE_INIT(PARAMS) \ - CMC_EXT_CMC_DEQUE_INIT_HEADER(PARAMS) \ - CMC_EXT_CMC_DEQUE_INIT_SOURCE(PARAMS) +#define CMC_EXT_CMC_DEQUE_INIT(ACCESS, FILE, PARAMS) \ + CMC_(CMC_(CMC_EXT_CMC_DEQUE_INIT_, ACCESS), CMC_(_, FILE))(PARAMS) -#define CMC_EXT_CMC_DEQUE_INIT_HEADER(PARAMS) \ +#define CMC_EXT_CMC_DEQUE_INIT_PUBLIC_HEADER(PARAMS) \ CMC_EXT_CMC_DEQUE_INIT_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS)) -#define CMC_EXT_CMC_DEQUE_INIT_SOURCE(PARAMS) \ +#define CMC_EXT_CMC_DEQUE_INIT_PUBLIC_SOURCE(PARAMS) \ CMC_EXT_CMC_DEQUE_INIT_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS)) +/* INIT Extension can't be used with opaque struct */ +#define CMC_EXT_CMC_DEQUE_INIT_PRIVATE_HEADER(PARAMS) +#define CMC_EXT_CMC_DEQUE_INIT_PRIVATE_SOURCE(PARAMS) + #define CMC_EXT_CMC_DEQUE_INIT_HEADER_(PFX, SNAME, V) \ \ struct SNAME CMC_(PFX, _init)(size_t capacity, struct CMC_DEF_FVAL(SNAME) * f_val); \ @@ -98,15 +105,24 @@ /** * ITER + * + * \param ACCESS Either PUBLIC or PRIVATE + * \param FILE Either HEADER or SOURCE + * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V) */ -#define CMC_EXT_CMC_DEQUE_ITER(PARAMS) \ - CMC_EXT_CMC_DEQUE_ITER_HEADER(PARAMS) \ - CMC_EXT_CMC_DEQUE_ITER_SOURCE(PARAMS) +#define CMC_EXT_CMC_DEQUE_ITER(ACCESS, FILE, PARAMS) \ + CMC_(CMC_(CMC_EXT_CMC_DEQUE_ITER_, ACCESS), CMC_(_, FILE))(PARAMS) -#define CMC_EXT_CMC_DEQUE_ITER_HEADER(PARAMS) \ +#define CMC_EXT_CMC_DEQUE_ITER_PUBLIC_HEADER(PARAMS) \ CMC_EXT_CMC_DEQUE_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS)) -#define CMC_EXT_CMC_DEQUE_ITER_SOURCE(PARAMS) \ +#define CMC_EXT_CMC_DEQUE_ITER_PUBLIC_SOURCE(PARAMS) \ + CMC_EXT_CMC_DEQUE_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS)) + +#define CMC_EXT_CMC_DEQUE_ITER_PRIVATE_HEADER(PARAMS) \ + CMC_EXT_CMC_DEQUE_ITER_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS)) + +#define CMC_EXT_CMC_DEQUE_ITER_PRIVATE_SOURCE(PARAMS) \ CMC_EXT_CMC_DEQUE_ITER_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS)) #define CMC_EXT_CMC_DEQUE_ITER_HEADER_(PFX, SNAME, V) \ @@ -363,15 +379,24 @@ /** * STR + * + * \param ACCESS Either PUBLIC or PRIVATE + * \param FILE Either HEADER or SOURCE + * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V) */ -#define CMC_EXT_CMC_DEQUE_STR(PARAMS) \ - CMC_EXT_CMC_DEQUE_STR_HEADER(PARAMS) \ - CMC_EXT_CMC_DEQUE_STR_SOURCE(PARAMS) +#define CMC_EXT_CMC_DEQUE_STR(ACCESS, FILE, PARAMS) \ + CMC_(CMC_(CMC_EXT_CMC_DEQUE_STR_, ACCESS), CMC_(_, FILE))(PARAMS) -#define CMC_EXT_CMC_DEQUE_STR_HEADER(PARAMS) \ +#define CMC_EXT_CMC_DEQUE_STR_PUBLIC_HEADER(PARAMS) \ CMC_EXT_CMC_DEQUE_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS)) -#define CMC_EXT_CMC_DEQUE_STR_SOURCE(PARAMS) \ +#define CMC_EXT_CMC_DEQUE_STR_PUBLIC_SOURCE(PARAMS) \ + CMC_EXT_CMC_DEQUE_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS)) + +#define CMC_EXT_CMC_DEQUE_STR_PRIVATE_HEADER(PARAMS) \ + CMC_EXT_CMC_DEQUE_STR_HEADER_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS)) + +#define CMC_EXT_CMC_DEQUE_STR_PRIVATE_SOURCE(PARAMS) \ CMC_EXT_CMC_DEQUE_STR_SOURCE_(CMC_PARAM_PFX(PARAMS), CMC_PARAM_SNAME(PARAMS), CMC_PARAM_V(PARAMS)) #define CMC_EXT_CMC_DEQUE_STR_HEADER_(PFX, SNAME, V) \ diff --git a/src/macro_collections.h b/src/macro_collections.h index 73c4654..9fe5cb9 100644 --- a/src/macro_collections.h +++ b/src/macro_collections.h @@ -16,9 +16,10 @@ * from any given sub-library. They are: * * - C_MACRO_COLLECTIONS - * - C_MACRO_COLLECTIONS_GEN - * - C_MACRO_COLLECTIONS_GEN_HEADER - * - C_MACRO_COLLECTIONS_GEN_SOURCE + * - C_MACRO_COLLECTIONS_INLINE + * - C_MACRO_COLLECTIONS_EXTENDED + * - C_MACRO_COLLECTIONS_EXTENDED_HEADER + * - C_MACRO_COLLECTIONS_EXTENDED_SOURCE * - C_MACRO_COLLECTIONS_ALL * - C_MACRO_COLLECTIONS_ALL_HEADER * - C_MACRO_COLLECTIONS_ALL_SOURCE @@ -88,15 +89,32 @@ * \param LIB The collection's sub-library * \param COLLECTION The name of the collection in all uppercase * \param PART The part of the collection (either CORE or one available at EXT) + * \param ACCESS Either PUBLIC or PRIVATE * \param FILE Either HEADER or SOURCE * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V) */ -#define C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \ - C_MACRO_COLLECTIONS_(LIB, COLLECTION, PART, FILE)(PARAMS) -#define C_MACRO_COLLECTIONS_(LIB, COLLECTION, PART, FILE) CMC_##LIB##_##COLLECTION##_##PART##_##FILE +#define C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \ + C_MACRO_COLLECTIONS_(LIB, COLLECTION, PART, ACCESS, FILE)(PARAMS) + +#define C_MACRO_COLLECTIONS_(LIB, COLLECTION, PART, ACCESS, FILE) \ + CMC_##LIB##_##COLLECTION##_##PART##_##ACCESS##_##FILE /** - * C_MACRO_COLLECTIONS_GEN + * C_MACRO_COLLECTIONS_INLINE + * + * Generates both HEADER and SOURCE one after the other of a certain PART of a certain LIB. + * + * \param LIB The collection's sub-library + * \param COLLECTION The name of the collection in all uppercase + * \param PART The part of the collection (either CORE or one available at EXT) + * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V) + */ +#define C_MACRO_COLLECTIONS_INLINE(LIB, COLLECTION, PART, PARAMS) \ + C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, PUBLIC, HEADER, PARAMS) \ + C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, PUBLIC, SOURCE, PARAMS) + +/** + * C_MACRO_COLLECTIONS_EXTENDED * * Generate the CORE of a collection along with one or more part from EXT. The * headers are generated first, then the source code. @@ -106,37 +124,39 @@ * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V) * \param PARTS A non-empty tuple of all desired EXT parts */ -#define C_MACRO_COLLECTIONS_GEN(LIB, COLLECTION, PARAMS, PARTS) \ - C_MACRO_COLLECTIONS_GEN_HEADER(LIB, COLLECTION, PARAMS, PARTS) \ - C_MACRO_COLLECTIONS_GEN_SOURCE(LIB, COLLECTION, PARAMS, PARTS) +#define C_MACRO_COLLECTIONS_EXTENDED(LIB, COLLECTION, PARAMS, PARTS) \ + C_MACRO_COLLECTIONS_EXTENDED_HEADER(LIB, COLLECTION, PUBLIC, PARAMS, PARTS) \ + C_MACRO_COLLECTIONS_EXTENDED_SOURCE(LIB, COLLECTION, PUBLIC, PARAMS, PARTS) /** - * C_MACRO_COLLECTIONS_GEN_HEADER + * C_MACRO_COLLECTIONS_EXTENDED_HEADER * * Generate all headers of CORE and the specified header parts of a collection. * * \param LIB The collection's sub-library * \param COLLECTION The name of the collection in all uppercase + * \param ACCESS Either PUBLIC or PRIVATE * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V) * \param PARTS A non-empty tuple of all desired EXT parts */ -#define C_MACRO_COLLECTIONS_GEN_HEADER(LIB, COLLECTION, PARAMS, PARTS) \ - C_MACRO_COLLECTIONS(LIB, COLLECTION, CORE_PUBLIC, HEADER, PARAMS) \ - CMC_MAP(CMC_(EXT_, LIB), COLLECTION, HEADER, PARAMS, CMC_EVAL PARTS) +#define C_MACRO_COLLECTIONS_EXTENDED_HEADER(LIB, COLLECTION, ACCESS, PARAMS, PARTS) \ + C_MACRO_COLLECTIONS(LIB, COLLECTION, CORE, ACCESS, HEADER, PARAMS) \ + CMC_MAP(CMC_(EXT_, LIB), COLLECTION, ACCESS, HEADER, PARAMS, CMC_EVAL PARTS) /** - * C_MACRO_COLLECTIONS_GEN_SOURCE + * C_MACRO_COLLECTIONS_EXTENDED_SOURCE * * Generate all sources of CORE and the specified source parts of a collection. * * \param LIB The collection's sub-library * \param COLLECTION The name of the collection in all uppercase + * \param ACCESS Either PUBLIC or PRIVATE * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V) * \param PARTS A non-empty tuple of all desired EXT parts */ -#define C_MACRO_COLLECTIONS_GEN_SOURCE(LIB, COLLECTION, PARAMS, PARTS) \ - C_MACRO_COLLECTIONS(LIB, COLLECTION, CORE_PUBLIC, SOURCE, PARAMS) \ - CMC_MAP(CMC_(EXT_, LIB), COLLECTION, SOURCE, PARAMS, CMC_EVAL PARTS) +#define C_MACRO_COLLECTIONS_EXTENDED_SOURCE(LIB, COLLECTION, ACCESS, PARAMS, PARTS) \ + C_MACRO_COLLECTIONS(LIB, COLLECTION, CORE, ACCESS, SOURCE, PARAMS) \ + CMC_MAP(CMC_(EXT_, LIB), COLLECTION, ACCESS, SOURCE, PARAMS, CMC_EVAL PARTS) /** * C_MACRO_COLLECTIONS_ALL @@ -146,11 +166,11 @@ * * \param LIB The collection's library * \param COLLECTION The name of the collection in all uppercase - * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V + * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V) */ #define C_MACRO_COLLECTIONS_ALL(LIB, COLLECTION, PARAMS) \ - C_MACRO_COLLECTIONS_ALL_HEADER(LIB, COLLECTION, PARAMS) \ - C_MACRO_COLLECTIONS_ALL_SOURCE(LIB, COLLECTION, PARAMS) + C_MACRO_COLLECTIONS_ALL_HEADER(LIB, COLLECTION, PUBLIC, PARAMS) \ + C_MACRO_COLLECTIONS_ALL_SOURCE(LIB, COLLECTION, PUBLIC, PARAMS) /** * C_MACRO_COLLECTIONS_ALL_HEADER @@ -159,11 +179,12 @@ * * \param LIB The collection's library * \param COLLECTION The name of the collection in all uppercase - * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V + * \param ACCESS Either PUBLIC or PRIVATE + * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V) */ -#define C_MACRO_COLLECTIONS_ALL_HEADER(LIB, COLLECTION, PARAMS) \ - C_MACRO_COLLECTIONS(LIB, COLLECTION, CORE_PUBLIC, HEADER, PARAMS) \ - CMC_MAP(CMC_(EXT_, LIB), COLLECTION, HEADER, PARAMS, C_MACRO_COLLECTIONS_PARTS(LIB, COLLECTION)) +#define C_MACRO_COLLECTIONS_ALL_HEADER(LIB, COLLECTION, ACCESS, PARAMS) \ + C_MACRO_COLLECTIONS(LIB, COLLECTION, CORE, ACCESS, HEADER, PARAMS) \ + CMC_MAP(CMC_(EXT_, LIB), COLLECTION, ACCESS, HEADER, PARAMS, C_MACRO_COLLECTIONS_PARTS(LIB, COLLECTION)) /** * C_MACRO_COLLECTIONS_ALL_SOURCE @@ -172,11 +193,12 @@ * * \param LIB The collection's library * \param COLLECTION The name of the collection in all uppercase + * \param ACCESS Either PUBLIC or PRIVATE * \param PARAMS A tuple of form (PFX, SNAME, SIZE, K, V */ -#define C_MACRO_COLLECTIONS_ALL_SOURCE(LIB, COLLECTION, PARAMS) \ - C_MACRO_COLLECTIONS(LIB, COLLECTION, CORE_PUBLIC, SOURCE, PARAMS) \ - CMC_MAP(CMC_(EXT_, LIB), COLLECTION, SOURCE, PARAMS, C_MACRO_COLLECTIONS_PARTS(LIB, COLLECTION)) +#define C_MACRO_COLLECTIONS_ALL_SOURCE(LIB, COLLECTION, ACCESS, PARAMS) \ + C_MACRO_COLLECTIONS(LIB, COLLECTION, CORE, ACCESS, SOURCE, PARAMS) \ + CMC_MAP(CMC_(EXT_, LIB), COLLECTION, ACCESS, SOURCE, PARAMS, C_MACRO_COLLECTIONS_PARTS(LIB, COLLECTION)) /** * C_MACRO_COLLECTIONS_PARTS @@ -209,40 +231,37 @@ 7, 6, 5, 4, 3, 2, 1, 0 /* Generates the FILE for each part (__VA_ARGS__) of a collection */ -#define CMC_MAP(LIB, COLLECTION, FILE, PARAMS, ...) \ +#define CMC_MAP(LIB, COLLECTION, ACCESS, FILE, PARAMS, ...) \ CMC_(CMC_MAP_, CMC_NARG(__VA_ARGS__)) \ - (LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__) + (LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__) -#define CMC_MAP_0(LIB, COLLECTION, FILE, PARAMS, PART, ...) -#define CMC_MAP_1(LIB, COLLECTION, FILE, PARAMS, PART, ...) \ - C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \ - CMC_MAP_0(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__) -#define CMC_MAP_2(LIB, COLLECTION, FILE, PARAMS, PART, ...) \ - C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \ - CMC_MAP_1(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__) -#define CMC_MAP_3(LIB, COLLECTION, FILE, PARAMS, PART, ...) \ - C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \ - CMC_MAP_2(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__) -#define CMC_MAP_4(LIB, COLLECTION, FILE, PARAMS, PART, ...) \ - C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \ - CMC_MAP_3(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__) -#define CMC_MAP_5(LIB, COLLECTION, FILE, PARAMS, PART, ...) \ - C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \ - CMC_MAP_4(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__) -#define CMC_MAP_6(LIB, COLLECTION, FILE, PARAMS, PART, ...) \ - C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \ - CMC_MAP_5(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__) -#define CMC_MAP_7(LIB, COLLECTION, FILE, PARAMS, PART, ...) \ - C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \ - CMC_MAP_6(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__) -#define CMC_MAP_8(LIB, COLLECTION, FILE, PARAMS, PART, ...) \ - C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \ - CMC_MAP_7(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__) -#define CMC_MAP_9(LIB, COLLECTION, FILE, PARAMS, PART, ...) \ - C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \ - CMC_MAP_8(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__) -#define CMC_MAP_10(LIB, COLLECTION, FILE, PARAMS, PART, ...) \ - C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, FILE, PARAMS) \ - CMC_MAP_9(LIB, COLLECTION, FILE, PARAMS, __VA_ARGS__) +#define CMC_MAP_9(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \ + C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \ + CMC_MAP_8(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__) +#define CMC_MAP_8(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \ + C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \ + CMC_MAP_7(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__) +#define CMC_MAP_7(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \ + C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \ + CMC_MAP_6(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__) +#define CMC_MAP_6(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \ + C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \ + CMC_MAP_5(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__) +#define CMC_MAP_5(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \ + C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \ + CMC_MAP_4(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__) +#define CMC_MAP_4(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \ + C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \ + CMC_MAP_3(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__) +#define CMC_MAP_3(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \ + C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \ + CMC_MAP_2(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__) +#define CMC_MAP_2(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \ + C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \ + CMC_MAP_1(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__) +#define CMC_MAP_1(LIB, COLLECTION, ACCESS, FILE, PARAMS, PART, ...) \ + C_MACRO_COLLECTIONS(LIB, COLLECTION, PART, ACCESS, FILE, PARAMS) \ + CMC_MAP_0(LIB, COLLECTION, ACCESS, FILE, PARAMS, __VA_ARGS__) +#define CMC_MAP_0(LIB, COLLECTION, ACCESS, FILE, PARAMS, ...) #endif /* CMC_MACRO_COLLECTIONS_H */