Add move- and copy ctors to dict and guf_str

This commit is contained in:
jun 2025-03-20 15:29:18 +01:00
parent c039e24996
commit 534ff261ca
2 changed files with 115 additions and 3 deletions

View File

@ -127,6 +127,8 @@ GUF_DICT_KWRDS GUF_DICT_NAME *GUF_CAT(GUF_DICT_NAME, _try_init)(GUF_DICT_NAME *h
GUF_DICT_KWRDS GUF_DICT_NAME *GUF_CAT(GUF_DICT_NAME, _init)(GUF_DICT_NAME *ht, guf_allocator *alloc); GUF_DICT_KWRDS GUF_DICT_NAME *GUF_CAT(GUF_DICT_NAME, _init)(GUF_DICT_NAME *ht, guf_allocator *alloc);
GUF_DICT_KWRDS void GUF_CAT(GUF_DICT_NAME, _free)(GUF_DICT_NAME *ht, void *ctx); GUF_DICT_KWRDS void GUF_CAT(GUF_DICT_NAME, _free)(GUF_DICT_NAME *ht, void *ctx);
GUF_DICT_KWRDS GUF_DICT_NAME *GUF_CAT(GUF_DICT_NAME, _copy)(GUF_DICT_NAME *dst, const GUF_DICT_NAME *src, void *ctx);
GUF_DICT_KWRDS GUF_DICT_NAME *GUF_CAT(GUF_DICT_NAME, _move)(GUF_DICT_NAME *dst, GUF_DICT_NAME *src, void *ctx);
GUF_DICT_KWRDS void GUF_CAT(GUF_DICT_NAME, _try_insert)(GUF_DICT_NAME *ht, GUF_DICT_KEY_T *key, GUF_DICT_VAL_T *val, guf_cpy_opt key_opt, guf_cpy_opt val_opt, guf_err *err); GUF_DICT_KWRDS void GUF_CAT(GUF_DICT_NAME, _try_insert)(GUF_DICT_NAME *ht, GUF_DICT_KEY_T *key, GUF_DICT_VAL_T *val, guf_cpy_opt key_opt, guf_cpy_opt val_opt, guf_err *err);
GUF_DICT_KWRDS void GUF_CAT(GUF_DICT_NAME, _insert)(GUF_DICT_NAME *ht, GUF_DICT_KEY_T *key, GUF_DICT_VAL_T *val, guf_cpy_opt key_opt, guf_cpy_opt val_opt); GUF_DICT_KWRDS void GUF_CAT(GUF_DICT_NAME, _insert)(GUF_DICT_NAME *ht, GUF_DICT_KEY_T *key, GUF_DICT_VAL_T *val, guf_cpy_opt key_opt, guf_cpy_opt val_opt);
@ -173,10 +175,10 @@ GUF_DICT_KWRDS size_t GUF_CAT(GUF_DICT_NAME, _memory_usage)(const GUF_DICT_NAME
GUF_DICT_KWRDS bool GUF_CAT(GUF_DICT_NAME, _valid)(const GUF_DICT_NAME *ht); GUF_DICT_KWRDS bool GUF_CAT(GUF_DICT_NAME, _valid)(const GUF_DICT_NAME *ht);
GUF_DICT_KWRDS bool GUF_CAT(GUF_DICT_NAME, _debug_valid_size)(const GUF_DICT_NAME *ht); GUF_DICT_KWRDS bool GUF_CAT(GUF_DICT_NAME, _debug_valid_size)(const GUF_DICT_NAME *ht);
// #define GUF_DICT_IMPL /* DEBUGGGGGGGGG */ // #define GUF_DICT_IMPL /* DEBUGGGGGGGGG */
#if defined(GUF_DICT_IMPL) || defined(GUF_DICT_IMPL_STATIC) #if defined(GUF_DICT_IMPL) || defined(GUF_DICT_IMPL_STATIC)
#include <string.h>
#include "guf_assert.h" #include "guf_assert.h"
#include "guf_math.h" #include "guf_math.h"
@ -282,8 +284,6 @@ GUF_DICT_KWRDS size_t GUF_CAT(GUF_DICT_NAME, _memory_usage)(const GUF_DICT_NAME
return mem_kv_indices + mem_kv_elems; return mem_kv_indices + mem_kv_elems;
} }
GUF_DICT_KWRDS void GUF_CAT(GUF_DICT_NAME, _free)(GUF_DICT_NAME *ht, void *ctx) GUF_DICT_KWRDS void GUF_CAT(GUF_DICT_NAME, _free)(GUF_DICT_NAME *ht, void *ctx)
{ {
(void)ctx; (void)ctx;
@ -302,6 +302,69 @@ GUF_DICT_KWRDS void GUF_CAT(GUF_DICT_NAME, _free)(GUF_DICT_NAME *ht, void *ctx)
ht->max_probelen = 0; ht->max_probelen = 0;
} }
GUF_DICT_KWRDS GUF_DICT_NAME *GUF_CAT(GUF_DICT_NAME, _copy)(GUF_DICT_NAME *dst, const GUF_DICT_NAME *src, void *ctx)
{
(void)ctx;
GUF_ASSERT_RELEASE(dst);
GUF_ASSERT_RELEASE(GUF_CAT(GUF_DICT_NAME, _valid)(src));
GUF_ASSERT_RELEASE(dst != src);
dst->kv_indices = NULL;
dst->kv_indices_cap = dst->max_probelen = dst->num_tombstones = 0;
dst->kv_elems.allocator = NULL;
dst->kv_elems.data = NULL;
dst->kv_elems.capacity = dst->kv_elems.size = 0;
GUF_DICT_KV_DBUF *kv_elems_cpy = GUF_CAT(GUF_DICT_KV_DBUF, _copy)(&dst->kv_elems, &src->kv_elems, NULL);
if (!kv_elems_cpy) {
return NULL;
}
if (src->kv_indices) {
GUF_ASSERT(src->kv_indices_cap > 0);
const ptrdiff_t num_bytes = src->kv_indices_cap * sizeof(src->kv_indices[0]);
dst->kv_indices = src->kv_elems.allocator->alloc(num_bytes, src->kv_elems.allocator->ctx);
if (!dst->kv_indices) {
GUF_CAT(GUF_DICT_KV_DBUF, _free)(&dst->kv_elems, NULL);
return NULL;
}
memcpy(dst->kv_indices, src->kv_indices, num_bytes);
dst->kv_indices_cap = src->kv_indices_cap;
} else {
dst->kv_indices = NULL;
}
dst->max_probelen = src->max_probelen;
dst->num_tombstones = src->num_tombstones;
GUF_ASSERT(dst->kv_elems.size == src->kv_elems.size && dst->kv_elems.capacity == src->kv_elems.capacity && dst->kv_elems.allocator == src->kv_elems.allocator);
GUF_ASSERT(dst->kv_indices_cap == src->kv_indices_cap);
return dst;
}
GUF_DICT_KWRDS GUF_DICT_NAME *GUF_CAT(GUF_DICT_NAME, _move)(GUF_DICT_NAME *dst, GUF_DICT_NAME *src, void *ctx)
{
(void)ctx;
GUF_ASSERT_RELEASE(dst);
GUF_ASSERT_RELEASE(GUF_CAT(GUF_DICT_NAME, _valid)(src));
GUF_ASSERT_RELEASE(dst != src);
dst->kv_elems = src->kv_elems;
dst->kv_indices = src->kv_indices;
dst->kv_indices_cap = src->kv_indices_cap;
dst->max_probelen = src->max_probelen;
dst->num_tombstones = src->num_tombstones;
src->kv_indices = NULL;
src->kv_indices_cap = src->max_probelen = src->num_tombstones = 0;
src->kv_elems.allocator = NULL;
src->kv_elems.data = NULL;
src->kv_elems.capacity = src->kv_elems.size = 0;
return dst;
}
GUF_DICT_KWRDS ptrdiff_t GUF_CAT(GUF_DICT_NAME, _size)(const GUF_DICT_NAME *ht) GUF_DICT_KWRDS ptrdiff_t GUF_CAT(GUF_DICT_NAME, _size)(const GUF_DICT_NAME *ht)
{ {
GUF_ASSERT_RELEASE(GUF_CAT(GUF_DICT_NAME, _valid)(ht)); GUF_ASSERT_RELEASE(GUF_CAT(GUF_DICT_NAME, _valid)(ht));

View File

@ -87,6 +87,8 @@ GUF_STR_KWRDS guf_str guf_str_try_new(guf_str_view str_view, guf_allocator *allo
GUF_STR_KWRDS guf_str guf_str_new(guf_str_view str_view, guf_allocator *alloc); GUF_STR_KWRDS guf_str guf_str_new(guf_str_view str_view, guf_allocator *alloc);
GUF_STR_KWRDS void guf_str_free(guf_str *str, void *ctx); GUF_STR_KWRDS void guf_str_free(guf_str *str, void *ctx);
GUF_STR_KWRDS guf_str *guf_str_copy(guf_str *dst, const guf_str *src, void *ctx);
GUF_STR_KWRDS guf_str *guf_str_move(guf_str *dst, guf_str *src, void *ctx);
// TODO: // TODO:
GUF_STR_KWRDS guf_str guf_str_try_new_substr(guf_str_view str_view, ptrdiff_t pos, ptrdiff_t len, guf_allocator *alloc, guf_err *err); GUF_STR_KWRDS guf_str guf_str_try_new_substr(guf_str_view str_view, ptrdiff_t pos, ptrdiff_t len, guf_allocator *alloc, guf_err *err);
@ -550,6 +552,53 @@ GUF_STR_KWRDS void guf_str_free(guf_str *str, void *ctx)
} }
} }
GUF_STR_KWRDS guf_str *guf_str_copy(guf_str *dst, const guf_str *src, void *ctx)
{
(void)ctx;
GUF_ASSERT_RELEASE(dst);
GUF_ASSERT_RELEASE(guf_str_is_valid(src));
guf_str_init_empty(dst, src->allocator);
GUF_ASSERT(guf_str_is_short_internal_(dst));
if (!guf_str_is_short_internal_(src)) {
const size_t src_cap_with_null = guf_str_cap_internal_(src) + 1;
char *dst_cstr = src->allocator->alloc(src_cap_with_null, src->allocator->ctx);
if (!dst_cstr) {
*dst = guf_str_new_uninitialised();
return NULL;
}
dst->data.lng.c_str = dst_cstr;
dst->data.lng.capacity = src->data.lng.capacity;
dst->data.lng.size = src->data.lng.size;
} else {
dst->data.shrt.size = src->data.shrt.size;
}
const size_t src_len_with_null = guf_str_len_internal_(src) + 1;
GUF_ASSERT(src_len_with_null == (guf_str_len_internal_(dst) + 1));
GUF_ASSERT(guf_str_is_short(dst) == guf_str_is_short(src));
const char *src_cstr = guf_str_const_cstr(src);
char *dst_cstr = guf_str_cstr(dst);
GUF_ASSERT(src_cstr && dst_cstr);
memcpy(dst_cstr, src_cstr, src_len_with_null);
GUF_ASSERT(guf_str_is_valid(dst));
return dst;
}
GUF_STR_KWRDS guf_str *guf_str_move(guf_str *dst, guf_str *src, void *ctx)
{
(void)ctx;
GUF_ASSERT_RELEASE(dst);
GUF_ASSERT_RELEASE(guf_str_is_valid(src));
*dst = *src;
*src = guf_str_new_uninitialised();
return dst;
}
GUF_STR_KWRDS guf_str *guf_str_try_append_char(guf_str *str, char c, ptrdiff_t times, guf_err *err) GUF_STR_KWRDS guf_str *guf_str_try_append_char(guf_str *str, char c, ptrdiff_t times, guf_err *err)