Fix allow_realloc for tree

This commit is contained in:
Patrick Pelissier committed 2022-07-30 16:14:03 +02:00
1 parent ecebd62f86
commit 65b49268d3
1 file changed
+7 -6
+7 -6
View File
@@ -69,7 +69,7 @@
M_ASSERT( (tree)->size >= 0 && (tree)->size <= (tree)->capacity); \ M_ASSERT( (tree)->size >= 0 && (tree)->size <= (tree)->capacity); \
M_ASSERT( (tree)->capacity >= 0 ); \ M_ASSERT( (tree)->capacity >= 0 ); \
M_ASSERT( (tree)->capacity == 0 || (tree)->tab != NULL); \ M_ASSERT( (tree)->capacity == 0 || (tree)->tab != NULL); \
M_ASSERT( (tree)->allow_realloc == 1 || (tree)->allow_realloc == 32 ); \ M_ASSERT( (tree)->allow_realloc == 0 || (tree)->allow_realloc == INT32_MAX ); \
M_ASSERT( (tree)->free_index >= M_TR33_NO_NODE && (tree)->free_index < (tree)->capacity); \ M_ASSERT( (tree)->free_index >= M_TR33_NO_NODE && (tree)->free_index < (tree)->capacity); \
M_ASSERT( (tree)->root_index >= M_TR33_NO_NODE && (tree)->root_index < (tree)->capacity); \ M_ASSERT( (tree)->root_index >= M_TR33_NO_NODE && (tree)->root_index < (tree)->capacity); \
M_ASSERT( (tree)->free_index < 0 || (tree)->tab[(tree)->free_index].parent == M_TR33_NO_NODE); \ M_ASSERT( (tree)->free_index < 0 || (tree)->tab[(tree)->free_index].parent == M_TR33_NO_NODE); \
@@ -159,7 +159,7 @@ typedef int32_t m_tr33_index_t;
+ capacity is the allocated size of the array 'tab' \ + capacity is the allocated size of the array 'tab' \
+ root_index is the index of the "first" root in the tree. \ + root_index is the index of the "first" root in the tree. \
+ free_index is the list of free nodes in the array 'tab'. \ + free_index is the list of free nodes in the array 'tab'. \
+ allow_realloc is a bool encoded as true=1 and false=32 \ + allow_realloc is a bool encoded as true=0 and false=INT32_MAX \
+ tab is a pointer to the allocated nodes. \ + tab is a pointer to the allocated nodes. \
*/ \ */ \
typedef struct M_C(name, _s) { \ typedef struct M_C(name, _s) { \
@@ -167,7 +167,7 @@ typedef int32_t m_tr33_index_t;
m_tr33_index_t capacity; \ m_tr33_index_t capacity; \
m_tr33_index_t root_index; \ m_tr33_index_t root_index; \
m_tr33_index_t free_index; \ m_tr33_index_t free_index; \
unsigned allow_realloc; \ uint32_t allow_realloc; \
M_C(name, _node_ct) *tab; \ M_C(name, _node_ct) *tab; \
} tree_t[1]; \ } tree_t[1]; \
\ \
@@ -192,13 +192,14 @@ typedef int32_t m_tr33_index_t;
/* Define the core & unique methods of a tree */ /* Define the core & unique methods of a tree */
#define M_TR33_DEF_P4_CORE(name, type, oplist, tree_t, it_t) \ #define M_TR33_DEF_P4_CORE(name, type, oplist, tree_t, it_t) \
/* Initialize a generic tree (empty) */ \
static inline void \ static inline void \
M_C(name, _init)(tree_t tree) { \ M_C(name, _init)(tree_t tree) { \
tree->size = 0; \ tree->size = 0; \
tree->capacity = 0; \ tree->capacity = 0; \
tree->root_index = M_TR33_NO_NODE; \ tree->root_index = M_TR33_NO_NODE; \
tree->free_index = M_TR33_NO_NODE; \ tree->free_index = M_TR33_NO_NODE; \
tree->allow_realloc = true; \ tree->allow_realloc = 0; \
tree->tab = NULL; \ tree->tab = NULL; \
M_TR33_CONTRACT(tree); \ M_TR33_CONTRACT(tree); \
} \ } \
@@ -282,7 +283,7 @@ typedef int32_t m_tr33_index_t;
static inline void \ static inline void \
M_C(name, _lock)(tree_t tree, bool lock) { \ M_C(name, _lock)(tree_t tree, bool lock) { \
M_TR33_CONTRACT(tree); \ M_TR33_CONTRACT(tree); \
tree->allow_realloc = lock ? 32 : 1; \ tree->allow_realloc = lock ? INT32_MAX : 0; \
M_TR33_CONTRACT(tree); \ M_TR33_CONTRACT(tree); \
} \ } \
\ \
@@ -293,7 +294,7 @@ typedef int32_t m_tr33_index_t;
/* No more enough space: realloc the array */ \ /* No more enough space: realloc the array */ \
size_t alloc = M_CALL_INC_ALLOC(oplist, (size_t) tree->capacity); \ size_t alloc = M_CALL_INC_ALLOC(oplist, (size_t) tree->capacity); \
/* Take into account if realloc is allowed */ \ /* Take into account if realloc is allowed */ \
alloc <<= tree->allow_realloc; \ alloc += tree->allow_realloc; \
if (M_UNLIKELY (alloc >= INT32_MAX)) { \ if (M_UNLIKELY (alloc >= INT32_MAX)) { \
M_MEMORY_FULL(sizeof (struct M_C(name, _node_s)) * alloc); \ M_MEMORY_FULL(sizeof (struct M_C(name, _node_s)) * alloc); \
return M_TR33_NO_NODE; \ return M_TR33_NO_NODE; \