Skip to content

Commit

Permalink
support memory context for arrays
Browse files Browse the repository at this point in the history
  • Loading branch information
hugoArregui committed Mar 15, 2024
1 parent ae721c5 commit 3c6b179
Showing 1 changed file with 21 additions and 4 deletions.
25 changes: 21 additions & 4 deletions stb_ds.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ COMPILE-TIME OPTIONS
By default stb_ds uses stdlib realloc() and free() for memory management. You can
substitute your own functions instead by defining these symbols. You must either
define both, or neither. Note that at the moment, 'context' will always be NULL.
@TODO add an array/hash initialization function that takes a memory context pointer.
@TODO add a hash initialization function that takes a memory context pointer.
#define STBDS_UNIT_TESTS
Expand Down Expand Up @@ -78,6 +78,10 @@ DOCUMENTATION
Functions (actually macros)
arrinit:
void arrinit(T*, void* context, size_t capacity);
Initialize array with memory context and capacity
arrfree:
void arrfree(T*);
Frees the array.
Expand Down Expand Up @@ -371,6 +375,7 @@ CREDITS
Per Vognsen -- idea for hash table API/implementation
Rafael Sachetto -- arrpop()
github:HeroicKatora -- arraddn() reworking
github:hugoArregui -- arrinit()
Bugfixes:
Andy Durdin
Expand All @@ -395,6 +400,7 @@ CREDITS
#include <string.h>

#ifndef STBDS_NO_SHORT_NAMES
#define arrinit stbds_arrinit
#define arrlen stbds_arrlen
#define arrlenu stbds_arrlenu
#define arrput stbds_arrput
Expand Down Expand Up @@ -491,6 +497,7 @@ extern void stbds_unit_tests(void);
// Everything below here is implementation details
//

extern void * stbds_arrgrowf_ctx(void* ctx, void *a, size_t elemsize, size_t addlen, size_t min_cap);
extern void * stbds_arrgrowf(void *a, size_t elemsize, size_t addlen, size_t min_cap);
extern void stbds_arrfreef(void *a);
extern void stbds_hmfree_func(void *p, size_t elemsize);
Expand Down Expand Up @@ -540,6 +547,7 @@ extern void * stbds_shmode_func(size_t elemsize, int mode);
#define stbds_arrcap(a) ((a) ? stbds_header(a)->capacity : 0)
#define stbds_arrlen(a) ((a) ? (ptrdiff_t) stbds_header(a)->length : 0)
#define stbds_arrlenu(a) ((a) ? stbds_header(a)->length : 0)
#define stbds_arrinit(a, ctx, c) ((a) = stbds_arrgrowf_ctx_wrapper(ctx, a, sizeof *(a), 0, (c)))
#define stbds_arrput(a,v) (stbds_arrmaybegrow(a,1), (a)[stbds_header(a)->length++] = (v))
#define stbds_arrpush stbds_arrput // synonym
#define stbds_arrpop(a) (stbds_header(a)->length--, (a)[stbds_header(a)->length])
Expand Down Expand Up @@ -660,6 +668,7 @@ typedef struct
size_t capacity;
void * hash_table;
ptrdiff_t temp;
void *context;
} stbds_array_header;

typedef struct stbds_string_block
Expand Down Expand Up @@ -693,6 +702,9 @@ enum
template<class T> static T * stbds_arrgrowf_wrapper(T *a, size_t elemsize, size_t addlen, size_t min_cap) {
return (T*)stbds_arrgrowf((void *)a, elemsize, addlen, min_cap);
}
template<class T> static T * stbds_arrgrowf_ctx_wrapper(void* ctx, T *a, size_t elemsize, size_t addlen, size_t min_cap) {
return (T*)stbds_arrgrowf_ctx(ctx, (void *)a, elemsize, addlen, min_cap);
}
template<class T> static T * stbds_hmget_key_wrapper(T *a, size_t elemsize, void *key, size_t keysize, int mode) {
return (T*)stbds_hmget_key((void*)a, elemsize, key, keysize, mode);
}
Expand Down Expand Up @@ -758,8 +770,7 @@ size_t stbds_rehash_items;

//int *prev_allocs[65536];
//int num_prev;

void *stbds_arrgrowf(void *a, size_t elemsize, size_t addlen, size_t min_cap)
void *stbds_arrgrowf_ctx(void* ctx, void *a, size_t elemsize, size_t addlen, size_t min_cap)
{
stbds_array_header temp={0}; // force debugging
void *b;
Expand All @@ -782,13 +793,14 @@ void *stbds_arrgrowf(void *a, size_t elemsize, size_t addlen, size_t min_cap)
//if (num_prev < 65536) if (a) prev_allocs[num_prev++] = (int *) ((char *) a+1);
//if (num_prev == 2201)
// num_prev = num_prev;
b = STBDS_REALLOC(NULL, (a) ? stbds_header(a) : 0, elemsize * min_cap + sizeof(stbds_array_header));
b = STBDS_REALLOC(ctx, (a) ? stbds_header(a) : 0, elemsize * min_cap + sizeof(stbds_array_header));
//if (num_prev < 65536) prev_allocs[num_prev++] = (int *) (char *) b;
b = (char *) b + sizeof(stbds_array_header);
if (a == NULL) {
stbds_header(b)->length = 0;
stbds_header(b)->hash_table = 0;
stbds_header(b)->temp = 0;
stbds_header(b)->context = ctx;
} else {
STBDS_STATS(++stbds_array_grow);
}
Expand All @@ -797,6 +809,11 @@ void *stbds_arrgrowf(void *a, size_t elemsize, size_t addlen, size_t min_cap)
return b;
}

void *stbds_arrgrowf(void *a, size_t elemsize, size_t addlen, size_t min_cap)
{
return stbds_arrgrowf_ctx((a) ? stbds_header(a)->context : 0, a, elemsize, addlen, min_cap);
}

void stbds_arrfreef(void *a)
{
STBDS_FREE(NULL, stbds_header(a));
Expand Down

0 comments on commit 3c6b179

Please sign in to comment.