WIP new architecture, tests will fail

This commit is contained in:
Leonardo Vencovsky committed 2020-09-29 17:08:40 -03:00
1 parent 1911415879
commit 4e194f28ee
5 files changed
+131 -91

No files matched your search

+3 -9
View File
@@ -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
+1 -1
View File
@@ -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)
{
+7 -5
View File
@@ -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 */
+40 -15
View File
@@ -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) \
+80 -61
View File
@@ -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 */