add another bag optimization

This commit is contained in:
Jethro Grassie 2020-10-11 20:18:49 -04:00
parent 016a4468eb
commit b1c473f903
No known key found for this signature in database
GPG key ID: DE8ED755616565BB

View file

@ -40,6 +40,7 @@ struct gbag_t
size_t max; size_t max;
size_t ref; size_t ref;
char * b; char * b;
char * e;
char * n; char * n;
char * ni; char * ni;
char * no; char * no;
@ -56,6 +57,7 @@ gbag_new(gbag_t **out, size_t count, size_t size,
gb->max = count; gb->max = count;
gb->ref = 0; gb->ref = 0;
gb->b = (char*) calloc(gb->max, gb->z); gb->b = (char*) calloc(gb->max, gb->z);
gb->e = gb->b;
gb->n = gb->b; gb->n = gb->b;
gb->ni = gb->b; gb->ni = gb->b;
gb->no = (char*) calloc(1, size); gb->no = (char*) calloc(1, size);
@ -82,6 +84,7 @@ gbag_free(gbag_t *gb)
gb->max = 0; gb->max = 0;
gb->ref = 0; gb->ref = 0;
gb->b = NULL; gb->b = NULL;
gb->e = NULL;
gb->n = NULL; gb->n = NULL;
gb->ni = NULL; gb->ni = NULL;
gb->rc = NULL; gb->rc = NULL;
@ -113,6 +116,8 @@ scan:
gb->ref++; gb->ref++;
rv = gb->n; rv = gb->n;
gb->n += gb->z; gb->n += gb->z;
if (rv >= gb->e)
gb->e = gb->n;
return rv; return rv;
} }
gb->n += gb->z; gb->n += gb->z;
@ -141,6 +146,7 @@ grow:
gb->ref++; gb->ref++;
gb->b = b; gb->b = b;
gb->n = rv + gb->z; gb->n = rv + gb->z;
gb->e = gb->n;
return rv; return rv;
} }
return NULL; return NULL;
@ -149,6 +155,8 @@ grow:
void void
gbag_put(gbag_t *gb, void *item) gbag_put(gbag_t *gb, void *item)
{ {
if (gb->e > gb->b && item + gb->z == gb->e)
gb->e -= gb->z;
if (gb->rc) if (gb->rc)
gb->rc(item); gb->rc(item);
memset(item, 0, gb->z); memset(item, 0, gb->z);
@ -189,7 +197,7 @@ void *
gbag_first(gbag_t *gb) gbag_first(gbag_t *gb)
{ {
char *s = gb->b; char *s = gb->b;
char *e = gb->b + (gb->max * gb->z); char *e = gb->e;
gb->ni = s; gb->ni = s;
while (s < e) while (s < e)
{ {
@ -206,7 +214,7 @@ gbag_next(gbag_t *gb, void* from)
{ {
if (from) if (from)
gb->ni = ((char*)from) + gb->z; gb->ni = ((char*)from) + gb->z;
char *e = gb->b + (gb->max * gb->z); char *e = gb->e;
char *s = gb->ni; char *s = gb->ni;
while (s < e) while (s < e)
{ {