Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support memory context for arrays #1623

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
26 changes: 22 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 All @@ -712,6 +724,7 @@ template<class T> static T * stbds_shmode_func_wrapper(T *, size_t elemsize, int
return (T*)stbds_shmode_func(elemsize, mode);
}
#else
#define stbds_arrgrowf_ctx_wrapper stbds_arrgrowf_ctx
#define stbds_arrgrowf_wrapper stbds_arrgrowf
#define stbds_hmget_key_wrapper stbds_hmget_key
#define stbds_hmget_key_ts_wrapper stbds_hmget_key_ts
Expand Down Expand Up @@ -758,8 +771,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 +794,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 +810,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