diff --git a/m-array.h b/m-array.h index 1c57560d..603937bb 100644 --- a/m-array.h +++ b/m-array.h @@ -84,8 +84,9 @@ ) // Compute alloc from the requested size. -#define ARRAYI_EXPECTED_SIZE 8 -#define ARRAYI_INC_ALLOC_SIZE(n) (M_MAX(ARRAYI_EXPECTED_SIZE, (n))*2) +// NOTE: EXPECTED_SIZE can be overloaded by the given oplist. +#define ARRAYI_INC_ALLOC_SIZE(oplist, n) \ + (M_MAX(M_GET_EXPECTED_SIZE oplist, (n))*2) // Internal definition. #define ARRAYI_DEF2(name, type, oplist) \ @@ -149,7 +150,7 @@ && d->size <= d->alloc && s->size <= s->alloc); \ if (d == s) return; \ if (s->size > d->alloc) { \ - size_t alloc = ARRAYI_INC_ALLOC_SIZE(s->size); \ + size_t alloc = ARRAYI_INC_ALLOC_SIZE(oplist, s->size); \ type *ptr = M_GET_REALLOC oplist (type, d->ptr, alloc); \ if (ptr == NULL) { \ M_MEMORY_FULL(sizeof (type) * alloc); \ @@ -219,7 +220,7 @@ assert (v != NULL && v->size <= v->alloc); \ if (v->size >= v->alloc) { \ assert(v->size == v->alloc); \ - size_t alloc = ARRAYI_INC_ALLOC_SIZE(v->alloc); \ + size_t alloc = ARRAYI_INC_ALLOC_SIZE(oplist, v->alloc); \ assert (alloc > v->size); \ type *ptr = M_GET_REALLOC oplist (type, v->ptr, alloc); \ if (ptr == NULL) { \ @@ -262,7 +263,7 @@ assert (v != NULL && key <= v->size && v->size <= v->alloc); \ if (v->size >= v->alloc) { \ assert(v->size == v->alloc); \ - size_t alloc = ARRAYI_INC_ALLOC_SIZE(v->alloc); \ + size_t alloc = ARRAYI_INC_ALLOC_SIZE(oplist, v->alloc); \ assert (alloc > v->size); \ type *ptr = M_GET_REALLOC oplist (type, v->ptr, alloc); \ if (ptr == NULL) { \ @@ -314,7 +315,7 @@ if (v->size <= size) { \ /* Increase size of array */ \ if (size > v->alloc) { \ - size_t alloc = ARRAYI_INC_ALLOC_SIZE (size) ; \ + size_t alloc = ARRAYI_INC_ALLOC_SIZE(oplist, size) ; \ type *ptr = M_GET_REALLOC oplist (type, v->ptr, alloc); \ if (ptr == NULL) { \ M_MEMORY_FULL(sizeof (type) * alloc); \ @@ -388,7 +389,7 @@ assert(i < v->size && j <= v->size && i < j); \ size_t size = v->size + (j-i); \ if (size > v->alloc) { \ - size_t alloc = ARRAYI_INC_ALLOC_SIZE (size) ; \ + size_t alloc = ARRAYI_INC_ALLOC_SIZE(oplist, size) ; \ type *ptr = M_GET_REALLOC oplist (type, v->ptr, alloc); \ if (ptr == NULL) { \ M_MEMORY_FULL(sizeof (type) * alloc); \ diff --git a/m-core.h b/m-core.h index ed9d2d73..c0ca267d 100644 --- a/m-core.h +++ b/m-core.h @@ -664,6 +664,7 @@ #define M_IN_STR_IN_STR(a) ,a, #define M_SEPARATOR_SEPARATOR(a) ,a, #define M_EXT_ALGO_EXT_ALGO(a) ,a, +#define M_EXPECTED_SIZE_EXPECTED_SIZE(a) ,a, /* From an oplist - an unorded list of methods : like "INIT(mpz_init),CLEAR(mpz_clear),SET(mpz_set)" - Return the given method in the oplist or the default method. @@ -717,6 +718,7 @@ #define M_GET_IN_STR(...) M_GET_METHOD(IN_STR, M_NO_DEFAULT, __VA_ARGS__) #define M_GET_SEPARATOR(...) M_GET_METHOD(SEPARATOR, ',', __VA_ARGS__) #define M_GET_EXT_ALGO(...) M_GET_METHOD(EXT_ALGO, M_NO_EXT_ALGO, __VA_ARGS__) +#define M_GET_EXPECTED_SIZE(...) M_GET_METHOD(EXPECTED_SIZE, 8, __VA_ARGS__) /* Define the default method. NOTE: MEMSET_DEFAULT & MEMCPY_DEFAULT are NOT compatible with the '[1]' tricks