Update vnode (vtype_variable)
This commit is contained in:
parent
2b1bccb7e8
commit
0180dd1abd
@ -80,10 +80,10 @@ typedef struct libcdsb_string vtype_string;
|
||||
typedef struct libcdsb_variable vtype_variable;
|
||||
|
||||
|
||||
extern const char* libcdsb_vtype_name (vtype t) Warn_unused_result__;
|
||||
extern const char* libcdsb_vtype_stringify(vtype_variable value) Warn_unused_result__;
|
||||
extern const char* libcdsb_vtype_name(vtype t) Warn_unused_result__;
|
||||
|
||||
inline vtype_variable libcdsb_variable_build(void* value, vtype t) Always_inline__;
|
||||
extern const char* libcdsb_variable_stringify(vtype_variable value) Warn_unused_result__;
|
||||
inline vtype_variable libcdsb_variable_build (void* value, vtype t) Always_inline__;
|
||||
|
||||
/*#####################################################################################################################*/
|
||||
|
||||
|
@ -61,7 +61,7 @@ typedef vtype_hash hash_t;
|
||||
extern const size_t LIBCDSB_BUILTIN_VTYPE_SIZES[19];
|
||||
|
||||
extern int libcdsb_builtin_variable_compare(vtype_variable s0, vtype_variable s1) pure__ wur__;
|
||||
extern hash_t libcdsb_builtin_vtype_hash (const void* value, vtype type) pure__ wur__;
|
||||
extern hash_t libcdsb_builtin_variable_hash (vtype_variable value) pure__ wur__;
|
||||
|
||||
ainline(stack_t* libcdsb_builtin_stack_insert(stack_t* x, void* v)) {
|
||||
stack_t* p = x->prev;
|
||||
@ -92,11 +92,11 @@ ainline(stack_t* libcdsb_builtin_stack_insert(stack_t* x, void* v)) {
|
||||
#define strndup libcdsb_strndup
|
||||
#define memndup libcdsb_memndup
|
||||
|
||||
#define vtype_stringify libcdsb_vtype_stringify
|
||||
#define vtype_name libcdsb_vtype_name
|
||||
#define vtype_hash libcdsb_builtin_vtype_hash
|
||||
#define vtype_size(type) (LIBCDSB_BUILTIN_VTYPE_SIZES[type])
|
||||
|
||||
#define variable_compare libcdsb_builtin_variable_compare
|
||||
#define variable_stringify libcdsb_variable_stringify
|
||||
#define variable_hash libcdsb_builtin_variable_hash
|
||||
#define variable_compare libcdsb_builtin_variable_compare
|
||||
|
||||
#endif /* LIBCDSB_SRC_INTERNAL_INCLUDE */
|
||||
|
@ -19,53 +19,51 @@ typedef union {
|
||||
|
||||
typedef void* vnode_t;
|
||||
|
||||
extern vnode_t libcdsb_builtin_vnode_create (const void* value, vtype type) wur__;
|
||||
extern vnode_t libcdsb_builtin_vnode_create_target(vtype target_type, const void* value, vtype type) wur__;
|
||||
|
||||
extern void libcdsb_builtin_vnode_free(vnode_t* x, vtype type) Nonnull__(1);
|
||||
extern vnode_t libcdsb_builtin_vnode_create ( vtype_variable) wur__;
|
||||
extern vnode_t libcdsb_builtin_vnode_create_ex(vtype xt, vtype_variable) wur__;
|
||||
|
||||
extern vtype_variable libcdsb_builtin_vnode_peek(const vnode_t* x, vtype type) pure__ wur__ Nonnull__(1);
|
||||
extern void libcdsb_builtin_vnode_free( vnode_t* x, vtype type) Nonnull__(1);
|
||||
|
||||
|
||||
ainline(void libcdsb_builtin_vnode_attach(vnode_t* node, const void* value, vtype type)) {
|
||||
if (type < VTYPE_STRING) {
|
||||
*node = libcdsb_builtin_vnode_create(value, type);
|
||||
} else if (sizeof(str_t) == sizeof(void*) && type == VTYPE_STRING) {
|
||||
*node = *(char**)value;
|
||||
ainline(void libcdsb_builtin_vnode_attach(vnode_t* node, vtype_variable value)) {
|
||||
if (value.type < VTYPE_STRING) {
|
||||
*node = libcdsb_builtin_vnode_create(value);
|
||||
} else if (sizeof(str_t) == sizeof(void*) && value.type == VTYPE_STRING) {
|
||||
*node = *(char**)value.pointer;
|
||||
} else {
|
||||
*node = malloc(vtype_size(type));
|
||||
memcpy(*node, value, vtype_size(type));
|
||||
*node = malloc(vtype_size(value.type));
|
||||
memcpy(*node, value.pointer, vtype_size(value.type));
|
||||
}
|
||||
}
|
||||
|
||||
ainline(void libcdsb_builtin_vnode_tattach(vnode_t* node, vtype target_type, const void* value, vtype type)) {
|
||||
if (type < VTYPE_STRING) {
|
||||
*node = libcdsb_builtin_vnode_create_target(target_type, value, type);
|
||||
ainline(void libcdsb_builtin_vnode_attach_ex(vnode_t* node, vtype target, vtype_variable value)) {
|
||||
if (value.type < VTYPE_STRING) {
|
||||
*node = libcdsb_builtin_vnode_create_ex(target, value);
|
||||
} else {
|
||||
type_assert(target_type, type);
|
||||
type_assert(target, value.type);
|
||||
|
||||
if (sizeof(str_t) == sizeof(void*) && type == VTYPE_STRING) {
|
||||
*node = *(char**)value;
|
||||
if (sizeof(str_t) == sizeof(void*) && value.type == VTYPE_STRING) {
|
||||
*node = *(char**)value.pointer;
|
||||
} else {
|
||||
*node = malloc(vtype_size(type));
|
||||
memcpy(*node, value, vtype_size(type));
|
||||
*node = malloc(vtype_size(value.type));
|
||||
memcpy(*node, value.pointer, vtype_size(value.type));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define vnode_create libcdsb_builtin_vnode_create
|
||||
#define vnode_tcreate libcdsb_builtin_vnode_create_target
|
||||
#define vnode_attach libcdsb_builtin_vnode_attach
|
||||
#define vnode_tattach libcdsb_builtin_vnode_tattach
|
||||
#define vnode_peek libcdsb_builtin_vnode_peek
|
||||
#define vnode_free libcdsb_builtin_vnode_free
|
||||
#define vnode_create libcdsb_builtin_vnode_create
|
||||
#define vnode_attach libcdsb_builtin_vnode_attach
|
||||
#define vnode_create_ex libcdsb_builtin_vnode_create_ex
|
||||
#define vnode_attach_ex libcdsb_builtin_vnode_attach_ex
|
||||
|
||||
#define vnode_hash(vnode, type) vtype_hash(vnode_peek(vnode, type).pointer, type)
|
||||
#define vnode_compare(s0, t0, s1, t1) variable_compare(vnode_peek(s0, t0), vnode_peek(s1, t1))
|
||||
#define vnode_compare_eq(s0, s1, t) variable_compare(vnode_peek(s0, t ), vnode_peek(s1, t ))
|
||||
#define vnode_duplicate(vnode, type) vnode_create(vnode_peek(vnode, type).pointer, type)
|
||||
#define vnode_tduplicate(target_type, vnode, type) vnode_tcreate(target_type, vnode_peek(vnode, type), type)
|
||||
#define vnode_peek libcdsb_builtin_vnode_peek
|
||||
#define vnode_free libcdsb_builtin_vnode_free
|
||||
|
||||
#define vnode_stringify(n, t) vtype_stringify(vnode_peek(n, t))
|
||||
#define vnode_hash(n, t) variable_hash(vnode_peek(n, t))
|
||||
#define vnode_compare(s0, t0, s1, t1) variable_compare(vnode_peek(s0, t0), vnode_peek(s1, t1))
|
||||
#define vnode_stringify(n, t) variable_stringify(vnode_peek(n, t))
|
||||
|
||||
#define vnode_duplicate(n, t) vnode_create(vnode_peek(n, t))
|
||||
#define vnode_duplicate_ex(xt, n, t) vnode_create_ex(xt, vnode_peek(n, t))
|
||||
|
||||
#endif /* LIBCDSB_SRC_INTERNAL_VNODE_H */
|
||||
|
@ -13,10 +13,10 @@ hash_t array_hash(const arr_t* s) {
|
||||
hash_t hash = 0;
|
||||
|
||||
if (s->size > 0)
|
||||
hash = vtype_hash(s->mem, s->type);
|
||||
hash = variable_hash(libcdsb_variable_build(s->mem, s->type));
|
||||
|
||||
if (s->size > 1)
|
||||
hash += vtype_hash(array_internal_at(s, s->size - 1), s->type);
|
||||
hash += variable_hash(libcdsb_variable_build(array_internal_at(s, s->size - 1), s->type));
|
||||
|
||||
hash ^= s->size;
|
||||
|
||||
|
@ -10,11 +10,11 @@ ssize_t libcdsb_array_insert(arr_t* x, vtype_variable var) {
|
||||
vnode_t n;
|
||||
|
||||
i = x->size;
|
||||
n = vnode_tcreate(x->type, var.pointer, var.type);
|
||||
n = vnode_create_ex(x->type, var);
|
||||
x->mem = realloc(x->mem, ++x->size * vtype_size(x->type));
|
||||
|
||||
if (var.type < VTYPE_STRING) {
|
||||
n = vnode_tcreate(x->type, var.pointer, var.type);
|
||||
n = vnode_create_ex(x->type, var);
|
||||
memcpy(array_internal_at(x, i), vnode_peek(&n, x->type).pointer, vtype_size(x->type));
|
||||
|
||||
if (vtype_size(x->type) > sizeof(vnode_t))
|
||||
@ -37,7 +37,7 @@ ssize_t libcdsb_array_attach(arr_t* x, vtype_variable var) {
|
||||
x->mem = realloc(x->mem, ++x->size * vtype_size(x->type));
|
||||
|
||||
if (var.type < VTYPE_STRING) {
|
||||
n = vnode_tcreate(x->type, var.pointer, var.type);
|
||||
n = vnode_create_ex(x->type, var);
|
||||
memcpy(array_internal_at(x, i), vnode_peek(&n, x->type).pointer, vtype_size(x->type));
|
||||
|
||||
if (vtype_size(x->type) > sizeof(vnode_t))
|
||||
|
@ -9,7 +9,7 @@ int libcdsb_dict_find(dict_t* x, vtype_variable kvar, void* dt, dict_access_call
|
||||
vtype_variable k, v;
|
||||
|
||||
if (x->capacity) {
|
||||
c = *(p = x->nodes + (vtype_hash(kvar.pointer, kvar.type) % x->capacity));
|
||||
c = *(p = x->nodes + (variable_hash(kvar) % x->capacity));
|
||||
|
||||
while (!is_null(c)) {
|
||||
k = vnode_peek(&c->key, c->key_type);
|
||||
|
@ -57,7 +57,7 @@ bool libcdsb_dict_update(dict_t* x, vtype_variable key, vtype_variable value, vo
|
||||
if (!x->capacity || (double)x->size / x->capacity > REBUILD_POINT_MAX)
|
||||
libcdsb_builtin_rehash(x, x->capacity + CAPACITY_BLOCK);
|
||||
|
||||
c = *(p = x->nodes + (vtype_hash(key.pointer, key.type) % x->capacity));
|
||||
c = *(p = x->nodes + (variable_hash(key) % x->capacity));
|
||||
|
||||
while (!is_null(c)) {
|
||||
k = vnode_peek(&c->key, c->key_type);
|
||||
@ -67,7 +67,8 @@ bool libcdsb_dict_update(dict_t* x, vtype_variable key, vtype_variable value, vo
|
||||
|
||||
vnode_free(&c->value, c->value_type);
|
||||
|
||||
c->value = vnode_create(value.pointer, c->value_type = value.type);
|
||||
c->value = vnode_create(value);
|
||||
c->value_type = value.type;
|
||||
|
||||
return true;
|
||||
} else c = c->prev;
|
||||
@ -75,9 +76,11 @@ bool libcdsb_dict_update(dict_t* x, vtype_variable key, vtype_variable value, vo
|
||||
|
||||
c = malloc(sizeof(*c));
|
||||
|
||||
c->prev = *p;
|
||||
c->key = vnode_create(key.pointer, c->key_type = key.type);
|
||||
c->value = vnode_create(value.pointer, c->value_type = value.type);
|
||||
c->prev = *p;
|
||||
c->key = vnode_create(key);
|
||||
c->value = vnode_create(value);
|
||||
c->key_type = key.type;
|
||||
c->value_type = value.type;
|
||||
|
||||
*p = c;
|
||||
++x->size;
|
||||
@ -93,7 +96,7 @@ bool libcdsb_dict_inject(dict_t* x, vtype_variable key, vtype_variable value, vo
|
||||
if (!x->capacity || (double)x->size / x->capacity > REBUILD_POINT_MAX)
|
||||
libcdsb_builtin_rehash(x, x->capacity + CAPACITY_BLOCK);
|
||||
|
||||
c = *(p = x->nodes + (vtype_hash(key.pointer, key.type) % x->capacity));
|
||||
c = *(p = x->nodes + (variable_hash(key) % x->capacity));
|
||||
|
||||
while (!is_null(c)) {
|
||||
k = vnode_peek(&c->key, c->key_type);
|
||||
@ -104,16 +107,23 @@ bool libcdsb_dict_inject(dict_t* x, vtype_variable key, vtype_variable value, vo
|
||||
vnode_free(&c->key, c->key_type);
|
||||
vnode_free(&c->value, c->value_type);
|
||||
|
||||
vnode_attach(&c->key, key.pointer, c->key_type = key.type);
|
||||
vnode_attach(&c->value, value.pointer, c->value_type = value.type);
|
||||
vnode_attach(&c->key, key);
|
||||
vnode_attach(&c->value, value);
|
||||
|
||||
c->key_type = key.type;
|
||||
c->value_type = value.type;
|
||||
|
||||
return true;
|
||||
} else c = c->prev;
|
||||
}
|
||||
|
||||
(c = malloc(sizeof(*c)))->prev = *p;
|
||||
vnode_attach(&c->key, key.pointer, c->key_type = key.type);
|
||||
vnode_attach(&c->value, value.pointer, c->value_type = value.type);
|
||||
|
||||
vnode_attach(&c->key, key);
|
||||
vnode_attach(&c->value, value);
|
||||
|
||||
c->key_type = key.type;
|
||||
c->value_type = value.type;
|
||||
|
||||
*p = c;
|
||||
++x->size;
|
||||
|
@ -45,7 +45,8 @@ bool libcdsb_list_insert(list_t* x, ssize_t i, vtype_variable value, int ins, vo
|
||||
vnode_free(&c->node, c->type);
|
||||
}
|
||||
|
||||
c->node = vnode_create(value.pointer, c->type = value.type);
|
||||
c->node = vnode_create(value);
|
||||
c->type = value.type;
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -93,7 +94,8 @@ bool libcdsb_list_attach(list_t* x, ssize_t i, vtype_variable value, int ins, vo
|
||||
vnode_free(&c->node, c->type);
|
||||
}
|
||||
|
||||
vnode_attach(&c->node, value.pointer, c->type = value.type);
|
||||
vnode_attach(&c->node, value);
|
||||
c->type = value.type;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -4,7 +4,7 @@
|
||||
#include "include.h"
|
||||
|
||||
static inline int libcdsb_builtin_compare(const mnode_t* s0, const mnode_t* s1, vtype t) {
|
||||
int c = vnode_compare_eq(&s0->key, &s1->key, t);
|
||||
int c = vnode_compare(&s0->key, t, &s1->key, t);
|
||||
|
||||
return !c ? vnode_compare(&s0->value, s0->type, &s1->value, s1->type) : c;
|
||||
}
|
||||
|
@ -20,7 +20,8 @@ bool libcdsb_map_update(map_t* x, vtype_variable key, vtype_variable value, void
|
||||
|
||||
vnode_free(&n->value, n->type);
|
||||
|
||||
n->value = vnode_create(value.pointer, n->type = value.type);
|
||||
n->value = vnode_create(value);
|
||||
n->type = value.type;
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -38,8 +39,9 @@ bool libcdsb_map_update(map_t* x, vtype_variable key, vtype_variable value, void
|
||||
|
||||
} else n = x->root = mnode_create(nullptr, mnode_empty, 0);
|
||||
|
||||
n->key = vnode_tcreate(x->type, key.pointer, key.type);
|
||||
n->value = vnode_create(value.pointer, n->type = value.type);
|
||||
n->key = vnode_create_ex(x->type, key);
|
||||
n->value = vnode_create(value);
|
||||
n->type = value.type;
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -52,10 +54,9 @@ bool libcdsb_map_inject(map_t* x, vtype_variable key, vtype_variable value, void
|
||||
vnode_t kn;
|
||||
vtype_variable k;
|
||||
|
||||
vnode_tattach(&kn, x->type, key.pointer, key.type);
|
||||
n = x->root;
|
||||
key.type = x->type;
|
||||
key.pointer = vnode_peek(&kn, key.type).pointer;
|
||||
vnode_attach_ex(&kn, x->type, key);
|
||||
n = x->root;
|
||||
key = vnode_peek(&kn, x->type);
|
||||
|
||||
if (!mnode_is_empty(n)) {
|
||||
do {
|
||||
@ -69,8 +70,9 @@ bool libcdsb_map_inject(map_t* x, vtype_variable key, vtype_variable value, void
|
||||
vnode_free(&n->key, x->type);
|
||||
vnode_free(&n->value, n->type);
|
||||
|
||||
n->key = kn;
|
||||
vnode_attach(&n->value, value.pointer, n->type = value.type);
|
||||
n->key = kn;
|
||||
n->type = value.type;
|
||||
vnode_attach(&n->value, value);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -88,7 +90,8 @@ bool libcdsb_map_inject(map_t* x, vtype_variable key, vtype_variable value, void
|
||||
|
||||
} else n = x->root = mnode_create(kn, mnode_empty, 0);
|
||||
|
||||
vnode_attach(&n->value, value.pointer, n->type = value.type);
|
||||
vnode_attach(&n->value, value);
|
||||
n->type = value.type;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -30,7 +30,7 @@ bool libcdsb_vset_insert(set_t* x, vtype_variable value) {
|
||||
|
||||
} else n = x->root = rbnode_create(nullptr, rbnode_empty, 0);
|
||||
|
||||
n->value = vnode_tcreate(x->type, value.pointer, value.type);
|
||||
n->value = vnode_create_ex(x->type, value);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -42,7 +42,7 @@ bool libcdsb_vset_attach(set_t* x, vtype_variable value) {
|
||||
rbnode_t* p;
|
||||
vnode_t vn;
|
||||
|
||||
vnode_tattach(&vn, x->type, value.pointer, value.type);
|
||||
vnode_attach_ex(&vn, x->type, value);
|
||||
n = x->root;
|
||||
value.type = x->type;
|
||||
value.pointer = vnode_peek(&vn, value.type).pointer;
|
||||
|
@ -62,7 +62,7 @@ const char* libcdsb_vtype_name(vtype t) {
|
||||
}
|
||||
|
||||
|
||||
const char* libcdsb_vtype_stringify(vtype_variable value) {
|
||||
const char* libcdsb_variable_stringify(vtype_variable value) {
|
||||
if (is_null(value.pointer) || (value.type == VTYPE_POINTER && is_null(*(void**)value.pointer))) return "null";
|
||||
if (value.type == VTYPE_BOOLEAN) return (*(vtype_bool*)value.pointer) ? "true" : "false";
|
||||
if (value.type == VTYPE_STRING) return *(char**)value.pointer;
|
||||
|
125
src/vnode.c
125
src/vnode.c
@ -15,7 +15,6 @@ static vtype libcdsb_builtin_round(u64_t* x, ldbl_t v) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static vnode_t libcdsb_builtin_create_value(vtype xt, const void* v, vtype t) {
|
||||
var_t _;
|
||||
|
||||
@ -82,7 +81,6 @@ static vnode_t libcdsb_builtin_create_value(vtype xt, const void* v, vtype t) {
|
||||
return _.ptr;
|
||||
}
|
||||
|
||||
|
||||
static vnode_t libcdsb_builtin_create_float(vtype xt, const void* v, vtype t) {
|
||||
var_t _;
|
||||
|
||||
@ -131,68 +129,107 @@ static vnode_t libcdsb_builtin_create_float(vtype xt, const void* v, vtype t) {
|
||||
|
||||
/*#####################################################################################################################*/
|
||||
|
||||
vnode_t libcdsb_builtin_vnode_create(const void* v, vtype t) {
|
||||
vnode_t libcdsb_builtin_vnode_create(vtype_variable var) {
|
||||
var_t _ = { .ptr = 0 };
|
||||
|
||||
switch (t) { default: abort();
|
||||
switch (var.type) { default: abort();
|
||||
|
||||
case VTYPE_INT8:
|
||||
case VTYPE_UINT8: _.u8 = *(u8_t*)v;
|
||||
case VTYPE_UINT8: _.u8 = *(u8_t*)var.pointer;
|
||||
break;
|
||||
|
||||
case VTYPE_INT16:
|
||||
case VTYPE_UINT16: _.u16 = *(u16_t*)v;
|
||||
case VTYPE_UINT16: _.u16 = *(u16_t*)var.pointer;
|
||||
break;
|
||||
|
||||
case VTYPE_INT32:
|
||||
case VTYPE_UINT32: _.u32 = *(u32_t*)v;
|
||||
case VTYPE_UINT32: _.u32 = *(u32_t*)var.pointer;
|
||||
break;
|
||||
|
||||
case VTYPE_INT64:
|
||||
case VTYPE_UINT64: if (is_x64) _.u64 = *(u64_t*)v;
|
||||
else _.ptr = memndup(v, sizeof(u64_t));
|
||||
case VTYPE_UINT64: if (is_x64) _.u64 = *(u64_t*)var.pointer;
|
||||
else _.ptr = memndup(var.pointer, sizeof(u64_t));
|
||||
break;
|
||||
|
||||
case VTYPE_FLOAT: if (is_permissible(fl_t)) _.f = *(fl_t*)v;
|
||||
else _.ptr = memndup(v, sizeof(fl_t));
|
||||
case VTYPE_FLOAT: if (is_permissible(fl_t)) _.f = *(fl_t*)var.pointer;
|
||||
else _.ptr = memndup(var.pointer, sizeof(fl_t));
|
||||
break;
|
||||
|
||||
case VTYPE_DOUBLE: if (is_permissible(dbl_t)) _.d = *(dbl_t*)v;
|
||||
else _.ptr = memndup(v, sizeof(dbl_t));
|
||||
case VTYPE_DOUBLE: if (is_permissible(dbl_t)) _.d = *(dbl_t*)var.pointer;
|
||||
else _.ptr = memndup(var.pointer, sizeof(dbl_t));
|
||||
break;
|
||||
|
||||
case VTYPE_LDOUBLE: if (is_permissible(ldbl_t)) _.ld = *(ldbl_t*)v;
|
||||
else _.ptr = memndup(v, sizeof(ldbl_t));
|
||||
case VTYPE_LDOUBLE: if (is_permissible(ldbl_t)) _.ld = *(ldbl_t*)var.pointer;
|
||||
else _.ptr = memndup(var.pointer, sizeof(ldbl_t));
|
||||
break;
|
||||
|
||||
|
||||
case VTYPE_BOOLEAN: _.b = *(bool*)v;
|
||||
case VTYPE_BOOLEAN: _.b = *(bool*)var.pointer;
|
||||
break;
|
||||
|
||||
case VTYPE_POINTER: _.ptr = *(void**)v;
|
||||
case VTYPE_POINTER: _.ptr = *(void**)var.pointer;
|
||||
break;
|
||||
|
||||
case VTYPE_STRING: if (sizeof(str_t) == sizeof(void*)) {
|
||||
_.ptr = strdup(*(char**)v);
|
||||
} else _.ptr = string_duplicate(v);
|
||||
_.ptr = strdup(*(char**)var.pointer);
|
||||
} else _.ptr = string_duplicate(var.pointer);
|
||||
break;
|
||||
|
||||
case VTYPE_MAP: _.ptr = map_duplicate(v);
|
||||
case VTYPE_MAP: _.ptr = map_duplicate(var.pointer);
|
||||
break;
|
||||
|
||||
case VTYPE_ARRAY: _.ptr = array_duplicate(v);
|
||||
case VTYPE_ARRAY: _.ptr = array_duplicate(var.pointer);
|
||||
break;
|
||||
|
||||
case VTYPE_LIST: _.ptr = list_duplicate(v);
|
||||
case VTYPE_LIST: _.ptr = list_duplicate(var.pointer);
|
||||
break;
|
||||
|
||||
case VTYPE_SET: _.ptr = vset_duplicate(v);
|
||||
case VTYPE_SET: _.ptr = vset_duplicate(var.pointer);
|
||||
break;
|
||||
}
|
||||
|
||||
return _.ptr;
|
||||
}
|
||||
|
||||
vnode_t libcdsb_builtin_vnode_create_ex(vtype xt, vtype_variable var) {
|
||||
var_t _ = { .ptr = 0 };
|
||||
|
||||
if (xt <= VTYPE_LDOUBLE) {
|
||||
if (var.type >= VTYPE_STRING) var.type = VTYPE_POINTER;
|
||||
|
||||
if (xt <= VTYPE_INT64)
|
||||
return libcdsb_builtin_create_value(xt, var.pointer, var.type);
|
||||
return libcdsb_builtin_create_float(xt, var.pointer, var.type);
|
||||
} else if (var.type == VTYPE_POINTER && (var.type = xt) > VTYPE_STRING) {
|
||||
var.pointer = *(void**)var.pointer;
|
||||
}
|
||||
|
||||
type_assert(xt, var.type);
|
||||
|
||||
switch (xt) { default: abort();
|
||||
case VTYPE_STRING: if (sizeof(str_t) == sizeof(void*)) {
|
||||
_.ptr = strdup(*(char**)var.pointer);
|
||||
} else _.ptr = string_duplicate(var.pointer);
|
||||
break;
|
||||
|
||||
case VTYPE_MAP: _.ptr = map_duplicate(var.pointer);
|
||||
break;
|
||||
|
||||
case VTYPE_ARRAY: _.ptr = array_duplicate(var.pointer);
|
||||
break;
|
||||
|
||||
case VTYPE_LIST: _.ptr = list_duplicate(var.pointer);
|
||||
break;
|
||||
|
||||
case VTYPE_SET: _.ptr = vset_duplicate(var.pointer);
|
||||
break;
|
||||
|
||||
case VTYPE_DICT: _.ptr = dict_duplicate(var.pointer);
|
||||
break;
|
||||
}
|
||||
|
||||
return _.ptr;
|
||||
}
|
||||
|
||||
vtype_variable libcdsb_builtin_vnode_peek(const vnode_t* x, vtype t) {
|
||||
vtype_variable var = { .type = t };
|
||||
@ -230,7 +267,6 @@ vtype_variable libcdsb_builtin_vnode_peek(const vnode_t* x, vtype t) {
|
||||
return var;
|
||||
}
|
||||
|
||||
|
||||
void libcdsb_builtin_vnode_free(vnode_t* x, vtype t) {
|
||||
|
||||
switch (t) { default: abort();
|
||||
@ -268,44 +304,3 @@ void libcdsb_builtin_vnode_free(vnode_t* x, vtype t) {
|
||||
|
||||
*x = 0;
|
||||
}
|
||||
|
||||
|
||||
vnode_t libcdsb_builtin_vnode_create_target(vtype xt, const void* v, vtype t) {
|
||||
var_t _ = { .ptr = 0 };
|
||||
|
||||
if (xt <= VTYPE_LDOUBLE) {
|
||||
if (t >= VTYPE_STRING) t = VTYPE_POINTER;
|
||||
|
||||
if (xt <= VTYPE_INT64)
|
||||
return libcdsb_builtin_create_value(xt, v, t);
|
||||
return libcdsb_builtin_create_float(xt, v, t);
|
||||
} else if (t == VTYPE_POINTER && (t = xt) > VTYPE_STRING) {
|
||||
v = *(void**)v;
|
||||
}
|
||||
|
||||
type_assert(xt, t);
|
||||
|
||||
switch (xt) { default: abort();
|
||||
case VTYPE_STRING: if (sizeof(str_t) == sizeof(void*)) {
|
||||
_.ptr = strdup(*(char**)v);
|
||||
} else _.ptr = string_duplicate(v);
|
||||
break;
|
||||
|
||||
case VTYPE_MAP: _.ptr = map_duplicate(v);
|
||||
break;
|
||||
|
||||
case VTYPE_ARRAY: _.ptr = array_duplicate(v);
|
||||
break;
|
||||
|
||||
case VTYPE_LIST: _.ptr = list_duplicate(v);
|
||||
break;
|
||||
|
||||
case VTYPE_SET: _.ptr = vset_duplicate(v);
|
||||
break;
|
||||
|
||||
case VTYPE_DICT: _.ptr = dict_duplicate(v);
|
||||
break;
|
||||
}
|
||||
|
||||
return _.ptr;
|
||||
}
|
||||
|
33
src/vtype.c
33
src/vtype.c
@ -116,38 +116,37 @@ int libcdsb_builtin_variable_compare(vtype_variable s0, vtype_variable s1) {
|
||||
|
||||
/*#####################################################################################################################*/
|
||||
|
||||
hash_t libcdsb_builtin_vtype_hash(const void* v, vtype t) {
|
||||
|
||||
switch (t) { default: abort();
|
||||
hash_t libcdsb_builtin_variable_hash(vtype_variable value) {
|
||||
switch (value.type) { default: abort();
|
||||
|
||||
case VTYPE_BOOLEAN:
|
||||
case VTYPE_INT8:
|
||||
case VTYPE_UINT8: return (hash_t)(*(u8_t*)v);
|
||||
case VTYPE_UINT8: return (hash_t)(*(u8_t*)value.pointer);
|
||||
|
||||
case VTYPE_INT16:
|
||||
case VTYPE_UINT16: return (hash_t)(*(u16_t*)v);
|
||||
case VTYPE_UINT16: return (hash_t)(*(u16_t*)value.pointer);
|
||||
|
||||
case VTYPE_INT32:
|
||||
case VTYPE_UINT32:
|
||||
x86_ptr: return (hash_t)(*(u32_t*)v);
|
||||
x86_ptr: return (hash_t)(*(u32_t*)value.pointer);
|
||||
|
||||
case VTYPE_POINTER: if (!is_x64) goto x86_ptr;
|
||||
case VTYPE_INT64:
|
||||
case VTYPE_UINT64: if (sizeof(hash_t) == sizeof(u64_t)) {
|
||||
return (hash_t)(*(u64_t*)v);
|
||||
return (hash_t)(*(u64_t*)value.pointer);
|
||||
} else {
|
||||
return (hash_t)(*(u32_t*)v) ^ (*((u32_t*)v + 1));
|
||||
return (hash_t)(*(u32_t*)value.pointer) ^ (*((u32_t*)value.pointer + 1));
|
||||
}
|
||||
|
||||
case VTYPE_STRING: return string_hash(v);
|
||||
case VTYPE_ARRAY: return array_hash(v);
|
||||
case VTYPE_LIST: return list_hash(v);
|
||||
case VTYPE_MAP: return map_hash(v);
|
||||
case VTYPE_SET: return vset_hash(v);
|
||||
case VTYPE_DICT: return dict_hash(v);
|
||||
case VTYPE_STRING: return string_hash(value.pointer);
|
||||
case VTYPE_ARRAY: return array_hash(value.pointer);
|
||||
case VTYPE_LIST: return list_hash(value.pointer);
|
||||
case VTYPE_MAP: return map_hash(value.pointer);
|
||||
case VTYPE_SET: return vset_hash(value.pointer);
|
||||
case VTYPE_DICT: return dict_hash(value.pointer);
|
||||
|
||||
case VTYPE_FLOAT: return libcdsb_builtin_hash_float(*(fl_t*)v);
|
||||
case VTYPE_DOUBLE: return libcdsb_builtin_hash_float(*(dbl_t*)v);
|
||||
case VTYPE_LDOUBLE: return libcdsb_builtin_hash_float(*(ldbl_t*)v);
|
||||
case VTYPE_FLOAT: return libcdsb_builtin_hash_float(*(fl_t*)value.pointer);
|
||||
case VTYPE_DOUBLE: return libcdsb_builtin_hash_float(*(dbl_t*)value.pointer);
|
||||
case VTYPE_LDOUBLE: return libcdsb_builtin_hash_float(*(ldbl_t*)value.pointer);
|
||||
}
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ void print_container_value(const ssize_t* index, const void* value, const vtype
|
||||
printf("\e[%dG ", hpos+1);
|
||||
}
|
||||
|
||||
printf("\e[31m%24s\e[m", libcdsb_vtype_stringify(libcdsb_variable_build((void*)value, type)));
|
||||
printf("\e[31m%24s\e[m", libcdsb_variable_stringify(libcdsb_variable_build((void*)value, type)));
|
||||
|
||||
if (print_type) {
|
||||
printf(" \e[36m(\e[m\e[32;1m%s\e[m\e[36m)\e[m", libcdsb_vtype_name(type));
|
||||
|
Loading…
Reference in New Issue
Block a user