Maintenance: continue splitting huge macros into smaller ones.

This commit is contained in:
Patrick Pelissier committed 2023-03-02 00:39:08 +01:00
1 parent e48dcdeecc
commit afff412f7a
3 files changed
+75 -31

No files matched your search

+20 -13
View File
@@ -114,6 +114,7 @@
,M_IF_METHOD(DEL, oplist)(DEL(M_GET_DEL oplist),) \ ,M_IF_METHOD(DEL, oplist)(DEL(M_GET_DEL oplist),) \
) )
/* Max depth of the binary tree /* Max depth of the binary tree
It is at worst twice the depth of a perfectly even tree with maximum elements. It is at worst twice the depth of a perfectly even tree with maximum elements.
The maximum number of elements is the max of size_t. The maximum number of elements is the max of size_t.
@@ -175,6 +176,15 @@ typedef enum {
- node_t: alias for the node of an element of the container - node_t: alias for the node of an element of the container
*/ */
#define M_RBTR33_DEF_P3(name, type, oplist, tree_t, node_t, it_t) \ #define M_RBTR33_DEF_P3(name, type, oplist, tree_t, node_t, it_t) \
M_RBTR33_DEF_TYPE(name, type, oplist, tree_t, node_t, it_t) \
M_RBTR33_DEF_MEMPOOL(name, type, oplist, tree_t, node_t, it_t) \
M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \
M_RBTR33_DEF_CORE(name, type, oplist, tree_t, node_t, it_t) \
M_RBTR33_DEF_IO(name, type, oplist, tree_t, node_t, it_t) \
M_EMPLACE_QUEUE_DEF(name, tree_t, M_C(name, _emplace), oplist, M_EMPLACE_QUEUE_GENE)
/* Define the types associated to a R/B Tree */
#define M_RBTR33_DEF_TYPE(name, type, oplist, tree_t, node_t, it_t) \
\ \
/* Node of Red/Black tree. \ /* Node of Red/Black tree. \
Each node has up to two child, a color (Red or black) \ Each node has up to two child, a color (Red or black) \
@@ -205,7 +215,9 @@ typedef enum {
typedef type M_C(name, _subtype_ct); \ typedef type M_C(name, _subtype_ct); \
typedef tree_t M_C(name, _ct); \ typedef tree_t M_C(name, _ct); \
typedef it_t M_C(name, _it_ct); \ typedef it_t M_C(name, _it_ct); \
\
/* Define the mempool encapsulation */
#define M_RBTR33_DEF_MEMPOOL(name, type, oplist, tree_t, node_t, it_t) \
/* Link with fast memory allocator if requested */ \ /* Link with fast memory allocator if requested */ \
M_IF_METHOD(MEMPOOL, oplist)( \ M_IF_METHOD(MEMPOOL, oplist)( \
/* Definition of the memory pool of this kind of node */ \ /* Definition of the memory pool of this kind of node */ \
@@ -222,23 +234,17 @@ typedef enum {
} \ } \
\ \
, /* No mempool allocation */ \ , /* No mempool allocation */ \
/* Callic allocator function (common case) */ \ /* Classic Allocator function (common case) */ \
static inline node_t *M_C3(m_rbtr33_,name,_new)(void) { \ static inline node_t *M_C3(m_rbtr33_,name,_new)(void) { \
return M_CALL_NEW(oplist, node_t); \ return M_CALL_NEW(oplist, node_t); \
} \ } \
/* Callic deallocator function (common case) */ \ /* Classic deallocator function (common case) */ \
static inline void M_C3(m_rbtr33_,name,_del)(node_t *ptr) { \ static inline void M_C3(m_rbtr33_,name,_del)(node_t *ptr) { \
M_CALL_DEL(oplist, ptr); \ M_CALL_DEL(oplist, ptr); \
} ) \ } ) \
\
/* Check if the given oplist is compatible with the given type */ \
M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \
\
/* Generate all functions */ \
M_RBTR33_DEF_P4(name, type, oplist, tree_t, node_t, it_t)
/* Define the core functions */
#define M_RBTR33_DEF_P4(name, type, oplist, tree_t, node_t, it_t) \ #define M_RBTR33_DEF_CORE(name, type, oplist, tree_t, node_t, it_t) \
\ \
static inline void \ static inline void \
M_C(name, _init)(tree_t tree) \ M_C(name, _init)(tree_t tree) \
@@ -1013,7 +1019,9 @@ typedef enum {
return M_HASH_FINAL (hash); \ return M_HASH_FINAL (hash); \
} \ } \
, /* NO HASH METHOD */ ) \ , /* NO HASH METHOD */ ) \
\
/* Define the I/O functions */
#define M_RBTR33_DEF_IO(name, type, oplist, tree_t, node_t, it_t) \
M_IF_METHOD(GET_STR, oplist)( \ M_IF_METHOD(GET_STR, oplist)( \
static inline void M_C(name, _get_str)(m_string_t str, \ static inline void M_C(name, _get_str)(m_string_t str, \
tree_t const t1, bool append) { \ tree_t const t1, bool append) { \
@@ -1165,7 +1173,6 @@ typedef enum {
} \ } \
, /* no in_serial */ ) \ , /* no in_serial */ ) \
\ \
M_EMPLACE_QUEUE_DEF(name, tree_t, M_C(name, _emplace), oplist, M_EMPLACE_QUEUE_GENE)
// TODO: specialized _sort shall do nothing, but shall check the requested order. How ? // TODO: specialized _sort shall do nothing, but shall check the requested order. How ?
+28 -11
View File
@@ -31,14 +31,6 @@
M_BEGIN_PROTECTED_CODE M_BEGIN_PROTECTED_CODE
/* Define the oplist of a shared pointer.
USAGE: SHARED_OPLIST(name [, oplist_of_the_type]) */
#define M_SHARED_PTR_OPLIST(...) \
M_SHAR3D_PTR_OPLIST_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \
((__VA_ARGS__, M_BASIC_OPLIST ), \
(__VA_ARGS__ )))
/* Define shared pointer and its function. /* Define shared pointer and its function.
USAGE: SHARED_PTR_DEF(name, type, [, oplist]) */ USAGE: SHARED_PTR_DEF(name, type, [, oplist]) */
#define M_SHARED_PTR_DEF(name, ...) \ #define M_SHARED_PTR_DEF(name, ...) \
@@ -56,6 +48,14 @@ M_BEGIN_PROTECTED_CODE
M_END_PROTECTED_CODE M_END_PROTECTED_CODE
/* Define the oplist of a shared pointer.
USAGE: SHARED_OPLIST(name [, oplist_of_the_type]) */
#define M_SHARED_PTR_OPLIST(...) \
M_SHAR3D_PTR_OPLIST_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \
((__VA_ARGS__, M_BASIC_OPLIST ), \
(__VA_ARGS__ )))
/* Define relaxed shared pointer and its function (thread unsafe). /* Define relaxed shared pointer and its function (thread unsafe).
USAGE: SHARED_PTR_RELAXED_DEF(name, type, [, oplist]) */ USAGE: SHARED_PTR_RELAXED_DEF(name, type, [, oplist]) */
#define M_SHARED_PTR_RELAXED_DEF(name, ...) \ #define M_SHARED_PTR_RELAXED_DEF(name, ...) \
@@ -142,6 +142,8 @@ static inline int m_shar3d_integer_add(int *p, int val) { int r = *p; *p += val
static inline int m_shar3d_integer_sub(int *p, int val) { int r = *p; *p -= val; return r; } static inline int m_shar3d_integer_sub(int *p, int val) { int r = *p; *p -= val; return r; }
static inline int m_shar3d_integer_cref(int *p) { return *p; } static inline int m_shar3d_integer_cref(int *p) { return *p; }
/*****************************************************************************/
/* Contract of a shared pointer */ /* Contract of a shared pointer */
#define M_SHAR3D_CONTRACT(shared, cpt_oplist) do { \ #define M_SHAR3D_CONTRACT(shared, cpt_oplist) do { \
M_ASSERT(shared != NULL); \ M_ASSERT(shared != NULL); \
@@ -161,6 +163,12 @@ static inline int m_shar3d_integer_cref(int *p) { return *p; }
/* Code generation */ /* Code generation */
#define M_SHAR3D_PTR_DEF_P3(name, type, oplist, cpt_oplist, shared_t) \ #define M_SHAR3D_PTR_DEF_P3(name, type, oplist, cpt_oplist, shared_t) \
M_SHAR3D_PTR_DEF_TYPE(name, type, oplist, cpt_oplist, shared_t) \
M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \
M_SHAR3D_PTR_DEF_CORE(name, type, oplist, cpt_oplist, shared_t) \
/* Define the types */
#define M_SHAR3D_PTR_DEF_TYPE(name, type, oplist, cpt_oplist, shared_t) \
\ \
typedef struct M_C(name, _s){ \ typedef struct M_C(name, _s){ \
type *data; /* Pointer to the data */ \ type *data; /* Pointer to the data */ \
@@ -177,8 +185,9 @@ static inline int m_shar3d_integer_cref(int *p) { return *p; }
type data; \ type data; \
struct M_C(name, _s) ptr; \ struct M_C(name, _s) ptr; \
} M_C(name, combine_ct)[1]; \ } M_C(name, combine_ct)[1]; \
\
M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \ /* Define the core functions */
#define M_SHAR3D_PTR_DEF_CORE(name, type, oplist, cpt_oplist, shared_t) \
\ \
static inline void \ static inline void \
M_C(name, _init)(shared_t shared) \ M_C(name, _init)(shared_t shared) \
@@ -373,6 +382,12 @@ static inline int m_shar3d_integer_cref(int *p) { return *p; }
M_STATIC_FAILURE(M_LIB_NOT_AN_OPLIST, "(SHARED_RESOURCE_DEF): the given argument is not a valid oplist: " #oplist) M_STATIC_FAILURE(M_LIB_NOT_AN_OPLIST, "(SHARED_RESOURCE_DEF): the given argument is not a valid oplist: " #oplist)
#define M_SHAR3D_RESOURCE_DEF_P3(name, type, oplist, shared_t, it_t) \ #define M_SHAR3D_RESOURCE_DEF_P3(name, type, oplist, shared_t, it_t) \
M_SHAR3D_RESOURCE_DEF_TYPE(name, type, oplist, shared_t, it_t) \
M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \
M_SHAR3D_RESOURCE_DEF_CORE(name, type, oplist, shared_t, it_t) \
/* Define the types */
#define M_SHAR3D_RESOURCE_DEF_TYPE(name, type, oplist, shared_t, it_t) \
\ \
/* Create an aligned type to avoid false sharing between threads */ \ /* Create an aligned type to avoid false sharing between threads */ \
typedef struct M_C(name, _atype_s) { \ typedef struct M_C(name, _atype_s) { \
@@ -393,7 +408,9 @@ static inline int m_shar3d_integer_cref(int *p) { return *p; }
\ \
/* Internal Types for oplist */ \ /* Internal Types for oplist */ \
typedef shared_t M_C(name, _ct); \ typedef shared_t M_C(name, _ct); \
\
/* Define the core functions */
#define M_SHAR3D_RESOURCE_DEF_CORE(name, type, oplist, shared_t, it_t) \
static inline void \ static inline void \
M_C(name, _init)(shared_t s, size_t n) \ M_C(name, _init)(shared_t s, size_t n) \
{ \ { \
+27 -7
View File
@@ -168,6 +168,12 @@ M_BEGIN_PROTECTED_CODE
/* Expand the type and the functions of a SPSC snapshot */ /* Expand the type and the functions of a SPSC snapshot */
#define M_SNAPSH0T_SPSC_DEF_P3(name, type, oplist, snapshot_t) \ #define M_SNAPSH0T_SPSC_DEF_P3(name, type, oplist, snapshot_t) \
M_SNAPSH0T_SPSC_DEF_TYPE(name, type, oplist, snapshot_t) \
M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \
M_SNAPSH0T_SPSC_DEF_CORE(name, type, oplist, snapshot_t) \
/* Define the type */
#define M_SNAPSH0T_SPSC_DEF_TYPE(name, type, oplist, snapshot_t) \
\ \
/* Create an aligned type to avoid false sharing between threads */ \ /* Create an aligned type to avoid false sharing between threads */ \
typedef struct M_C(name, _aligned_type_s) { \ typedef struct M_C(name, _aligned_type_s) { \
@@ -185,8 +191,9 @@ M_BEGIN_PROTECTED_CODE
/* Define internal types for oplist */ \ /* Define internal types for oplist */ \
typedef snapshot_t M_C(name, _ct); \ typedef snapshot_t M_C(name, _ct); \
typedef type M_C(name, _subtype_ct); \ typedef type M_C(name, _subtype_ct); \
\
M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \ /* Define the core functions */
#define M_SNAPSH0T_SPSC_DEF_CORE(name, type, oplist, snapshot_t) \
\ \
static inline void \ static inline void \
M_C(name, _init)(snapshot_t snap) \ M_C(name, _init)(snapshot_t snap) \
@@ -603,6 +610,12 @@ m_snapsh0t_mrsw_read_end(m_snapsh0t_mrsw_ct s, unsigned int idx)
/* Expand the type and the functions of a SPMC snapshot */ /* Expand the type and the functions of a SPMC snapshot */
#define M_SNAPSH0T_SPMC_DEF_P3(name, type, oplist, snapshot_t) \ #define M_SNAPSH0T_SPMC_DEF_P3(name, type, oplist, snapshot_t) \
M_SNAPSH0T_SPMC_DEF_TYPE(name, type, oplist, snapshot_t) \
M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \
M_SNAPSH0T_SPMC_DEF_CORE(name, type, oplist, snapshot_t) \
/* Define the type */
#define M_SNAPSH0T_SPMC_DEF_TYPE(name, type, oplist, snapshot_t) \
\ \
/* Create an aligned type to avoid false sharing between threads */ \ /* Create an aligned type to avoid false sharing between threads */ \
typedef struct M_C(name, _aligned_type_s) { \ typedef struct M_C(name, _aligned_type_s) { \
@@ -618,8 +631,9 @@ m_snapsh0t_mrsw_read_end(m_snapsh0t_mrsw_ct s, unsigned int idx)
/* Define internal types for oplist */ \ /* Define internal types for oplist */ \
typedef snapshot_t M_C(name, _ct); \ typedef snapshot_t M_C(name, _ct); \
typedef type M_C(name, _subtype_ct); \ typedef type M_C(name, _subtype_ct); \
\
M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \ /* Define the core functions */
#define M_SNAPSH0T_SPMC_DEF_CORE(name, type, oplist, snapshot_t) \
\ \
static inline void \ static inline void \
M_C(name, _init)(snapshot_t snap, size_t nReader) \ M_C(name, _init)(snapshot_t snap, size_t nReader) \
@@ -712,8 +726,13 @@ m_snapsh0t_mrsw_read_end(m_snapsh0t_mrsw_ct s, unsigned int idx)
/* Expand the type and the functions of a MPMC snapshot */ /* Expand the type and the functions of a MPMC snapshot */
#define M_SNAPSH0T_MPMC_DEF_P3(name, type, oplist, snapshot_t) \ #define M_SNAPSH0T_MPMC_DEF_P3(name, type, oplist, snapshot_t) \
\
M_SNAPSH0T_SPMC_DEF_P1((M_C(name, _mrsw), type, oplist, M_C(name, _mrsw_pct))) \ M_SNAPSH0T_SPMC_DEF_P1((M_C(name, _mrsw), type, oplist, M_C(name, _mrsw_pct))) \
M_SNAPSH0T_MPMC_DEF_TYPE(name, type, oplist, snapshot_t) \
M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \
M_SNAPSH0T_MPMC_DEF_CORE(name, type, oplist, snapshot_t) \
/* Define the types */
#define M_SNAPSH0T_MPMC_DEF_TYPE(name, type, oplist, snapshot_t) \
\ \
typedef struct M_C(name, _s) { \ typedef struct M_C(name, _s) { \
M_C(name, _mrsw_pct) core; \ M_C(name, _mrsw_pct) core; \
@@ -722,8 +741,9 @@ m_snapsh0t_mrsw_read_end(m_snapsh0t_mrsw_ct s, unsigned int idx)
/* Define internal types for oplist */ \ /* Define internal types for oplist */ \
typedef snapshot_t M_C(name, _ct); \ typedef snapshot_t M_C(name, _ct); \
typedef type M_C(name, _subtype_ct); \ typedef type M_C(name, _subtype_ct); \
\
M_CHECK_COMPATIBLE_OPLIST(name, 1, type, oplist) \ /* Define the core functions */
#define M_SNAPSH0T_MPMC_DEF_CORE(name, type, oplist, snapshot_t) \
\ \
static inline void \ static inline void \
M_C(name, _init)(snapshot_t snap, size_t nReader, size_t nWriter) \ M_C(name, _init)(snapshot_t snap, size_t nReader, size_t nWriter) \