Changed evstring to use capacity instead of size
Run tests / Run tests (push) Failing after 9s

This commit is contained in:
2026-05-03 23:52:41 +03:00
parent 0f62e962c9
commit 396e2c1e52
+19 -18
View File
@@ -40,7 +40,7 @@
/*! /*!
* \brief Rate at which an evstring grows whenever a resize is needed * \brief Rate at which an evstring grows whenever a resize is needed
*/ */
#define EV_STR_GROWTH_FACTOR 3 / 2 #define EV_STR_GROWTH_FACTOR 2
#endif #endif
typedef char *evstring; typedef char *evstring;
@@ -54,7 +54,7 @@ TYPEDATA_GEN(evstring_error_t, DEFAULT(EV_STR_ERR_NONE));
struct evstr_meta_t { struct evstr_meta_t {
EV_DEBUG(u64 magic;) EV_DEBUG(u64 magic;)
u64 length; u64 length;
u64 size; u64 capacity;
enum { enum {
EV_STR_ALLOCATION_TYPE_STACK, EV_STR_ALLOCATION_TYPE_STACK,
EV_STR_ALLOCATION_TYPE_HEAP EV_STR_ALLOCATION_TYPE_HEAP
@@ -67,7 +67,7 @@ struct evstr_meta_t {
(( struct { struct evstr_meta_t meta; char data[len]; } ) { \ (( struct { struct evstr_meta_t meta; char data[len]; } ) { \
EV_DEBUG(.meta.magic = EV_STR_evstring_MAGIC,) \ EV_DEBUG(.meta.magic = EV_STR_evstring_MAGIC,) \
.meta.length = len-1, \ .meta.length = len-1, \
.meta.size = len, \ .meta.capacity = len, \
.meta.allocationType = EV_STR_ALLOCATION_TYPE_STACK, \ .meta.allocationType = EV_STR_ALLOCATION_TYPE_STACK, \
.data = str \ .data = str \
}).data }).data
@@ -249,9 +249,10 @@ evstring_new_impl(
const char *data, const char *data,
u64 len) u64 len)
{ {
u64 size = sizeof(struct evstr_meta_t) + len + 1; u64 str_cap = len + 1;
u64 alloc_size = sizeof(struct evstr_meta_t) + str_cap;
void *p = ev_str_malloc(size); void *p = ev_str_malloc(alloc_size);
assert(p); // Raised if malloc fails assert(p); // Raised if malloc fails
struct evstr_meta_t *meta = (struct evstr_meta_t *)p; struct evstr_meta_t *meta = (struct evstr_meta_t *)p;
@@ -260,7 +261,7 @@ EV_DEBUG
meta->magic = EV_STR_evstring_MAGIC; meta->magic = EV_STR_evstring_MAGIC;
) )
meta->length = len; meta->length = len;
meta->size = size; meta->capacity = str_cap;
meta->allocationType = EV_STR_ALLOCATION_TYPE_HEAP; meta->allocationType = EV_STR_ALLOCATION_TYPE_HEAP;
evstring s = (evstring)(meta + 1); evstring s = (evstring)(meta + 1);
@@ -343,9 +344,9 @@ evstring_getLength(
} }
evstring_error_t evstring_error_t
evstring_setSize( evstring_setCapacity(
evstring *s, evstring *s,
size_t newsize) size_t new_capacity)
{ {
evstr_asserttype(*s); evstr_asserttype(*s);
struct evstr_meta_t *meta = META(*s); struct evstr_meta_t *meta = META(*s);
@@ -353,12 +354,12 @@ evstring_setSize(
return EV_STR_ERR_OOM; return EV_STR_ERR_OOM;
} }
if(meta->size == newsize) { if(meta->capacity == new_capacity) {
return EV_STR_ERR_NONE; return EV_STR_ERR_NONE;
} }
void *buf = (void*)meta; void *buf = (void*)meta;
void *tmp = ev_str_realloc(buf, sizeof(struct evstr_meta_t) + newsize); void *tmp = ev_str_realloc(buf, sizeof(struct evstr_meta_t) + new_capacity);
if (!tmp) { if (!tmp) {
return EV_STR_ERR_OOM; return EV_STR_ERR_OOM;
@@ -370,7 +371,7 @@ evstring_setSize(
*s = (evstring)(meta+1); *s = (evstring)(meta+1);
} }
meta->size = newsize; meta->capacity = new_capacity;
return EV_STR_ERR_NONE; return EV_STR_ERR_NONE;
} }
@@ -379,7 +380,7 @@ evstring_grow(
evstring *s) evstring *s)
{ {
evstr_asserttype(*s); evstr_asserttype(*s);
return evstring_setSize(s, META(*s)->size * EV_STR_GROWTH_FACTOR); return evstring_setCapacity(s, META(*s)->capacity * EV_STR_GROWTH_FACTOR);
} }
evstring_error_t evstring_error_t
@@ -393,8 +394,8 @@ evstring_setLength(
return EV_STR_ERR_NONE; return EV_STR_ERR_NONE;
} }
u64 required_size = sizeof(struct evstr_meta_t) + newlen + 1; u64 required_capacity = newlen + 1;
while(required_size > meta->size) { while(required_capacity > meta->capacity) {
evstring_error_t grow_err = evstring_grow(s); evstring_error_t grow_err = evstring_grow(s);
if(grow_err) { if(grow_err) {
return grow_err; return grow_err;
@@ -441,8 +442,8 @@ evstring_push_impl(
struct evstr_meta_t *meta = META(*s); struct evstr_meta_t *meta = META(*s);
// TODO Find a more efficient approach? // TODO Find a more efficient approach?
u64 required_size = sizeof(struct evstr_meta_t) + meta->length + sz + 1; u64 required_capacity = meta->length + sz + 1;
while(required_size > meta->size) { // `<=` because of the null terminator while(required_capacity > meta->capacity) { // `<=` because of the null terminator
evstring_error_t grow_err = evstring_grow(s); evstring_error_t grow_err = evstring_grow(s);
if(grow_err != EV_STR_ERR_NONE) { if(grow_err != EV_STR_ERR_NONE) {
return grow_err; return grow_err;
@@ -520,7 +521,7 @@ evstring_getSpace(
{ {
evstr_asserttype(s); evstr_asserttype(s);
struct evstr_meta_t *meta = META(s); struct evstr_meta_t *meta = META(s);
return meta->size - meta->length - 1 - sizeof(struct evstr_meta_t); return meta->capacity - meta->length - 1;
} }
evstring_error_t evstring_error_t
@@ -529,7 +530,7 @@ evstring_addSpace(
u64 space) u64 space)
{ {
evstr_asserttype(*s); evstr_asserttype(*s);
return evstring_setSize(s, META(*s)->size + space); return evstring_setCapacity(s, META(*s)->capacity + space);
} }
evstring_view evstring_view