Update map (vtype_variable)
This commit is contained in:
parent
6fc4be2b75
commit
7657e72c4f
@ -8,7 +8,7 @@
|
|||||||
#ifndef LIBCDSB_MAP_H
|
#ifndef LIBCDSB_MAP_H
|
||||||
#define LIBCDSB_MAP_H
|
#define LIBCDSB_MAP_H
|
||||||
|
|
||||||
typedef int (*map_access_callback)(const void* key, vtype key_type, void* value, vtype value_type, void* data);
|
typedef int (*map_access_callback)(vtype_variable key, vtype_variable value, void* data);
|
||||||
|
|
||||||
/*#####################################################################################################################*/
|
/*#####################################################################################################################*/
|
||||||
|
|
||||||
@ -16,10 +16,10 @@ extern void map_init(vtype_map* x, vtype key_type) Nonnull__(1);
|
|||||||
|
|
||||||
/*#####################################################################################################################*/
|
/*#####################################################################################################################*/
|
||||||
|
|
||||||
#define map_pop(x, key, data, callback) libcdsb_map_find (x, _LIBCDSB_value_pointer(key), _LIBCDSB_vtypeof(key), data, callback, 1)
|
#define map_pop(x, key, data, callback) libcdsb_map_find (x, libcdsb_variable_build(_LIBCDSB_value_pointer(key), _LIBCDSB_vtypeof(key)), data, callback, 1)
|
||||||
#define map_get(x, key, data, callback) libcdsb_map_find (x, _LIBCDSB_value_pointer(key), _LIBCDSB_vtypeof(key), data, callback, 0)
|
#define map_get(x, key, data, callback) libcdsb_map_find (x, libcdsb_variable_build(_LIBCDSB_value_pointer(key), _LIBCDSB_vtypeof(key)), data, callback, 0)
|
||||||
#define map_update(x, key, value) libcdsb_map_update (x, _LIBCDSB_value_pointer(key), _LIBCDSB_vtypeof(key), _LIBCDSB_value_pointer(value), _LIBCDSB_vtypeof(value), 0, 0)
|
#define map_update(x, key, value) libcdsb_map_update (x, libcdsb_variable_build(_LIBCDSB_value_pointer(key), _LIBCDSB_vtypeof(key)), libcdsb_variable_build(_LIBCDSB_value_pointer(value), _LIBCDSB_vtypeof(value)), 0, 0)
|
||||||
#define map_inject(x, key, value) libcdsb_map_inject (x, _LIBCDSB_value_pointer(key), _LIBCDSB_vtypeof(key), _LIBCDSB_value_pointer(value), _LIBCDSB_vtypeof(value), 0, 0)
|
#define map_inject(x, key, value) libcdsb_map_inject (x, libcdsb_variable_build(_LIBCDSB_value_pointer(key), _LIBCDSB_vtypeof(key)), libcdsb_variable_build(_LIBCDSB_value_pointer(value), _LIBCDSB_vtypeof(value)), 0, 0)
|
||||||
#define map_foreach(x, data, callback) libcdsb_map_foreach(x, data, callback, RBFOREACH_UNSPECIFIED, 0)
|
#define map_foreach(x, data, callback) libcdsb_map_foreach(x, data, callback, RBFOREACH_UNSPECIFIED, 0)
|
||||||
#define map_remove(x, key) map_pop (x, key, 0, 0)
|
#define map_remove(x, key) map_pop (x, key, 0, 0)
|
||||||
|
|
||||||
@ -27,9 +27,9 @@ extern void map_init(vtype_map* x, vtype key_type) Nonnull__(1);
|
|||||||
|
|
||||||
/*#####################################################################################################################*/
|
/*#####################################################################################################################*/
|
||||||
|
|
||||||
extern bool libcdsb_map_update (vtype_map* x, const void* key, vtype key_type, const void* value, vtype value_type, void* data, map_access_callback) Nonnull__(1);
|
extern bool libcdsb_map_update (vtype_map* x, vtype_variable key, vtype_variable value, void* data, map_access_callback) Nonnull__(1);
|
||||||
extern bool libcdsb_map_inject (vtype_map* x, const void* key, vtype key_type, const void* value, vtype value_type, void* data, map_access_callback) Nonnull__(1);
|
extern bool libcdsb_map_inject (vtype_map* x, vtype_variable key, vtype_variable value, void* data, map_access_callback) Nonnull__(1);
|
||||||
extern int libcdsb_map_find (vtype_map* x, const void* key, vtype key_type, void* data, map_access_callback, bool cut) Nonnull__(1);
|
extern int libcdsb_map_find (vtype_map* x, vtype_variable key, void* data, map_access_callback, bool cut) Nonnull__(1);
|
||||||
extern int libcdsb_map_foreach(vtype_map* x, void* data, map_access_callback, rbforeach_t, bool flush) Nonnull__(1,3);
|
extern int libcdsb_map_foreach(vtype_map* x, void* data, map_access_callback, rbforeach_t, bool flush) Nonnull__(1,3);
|
||||||
|
|
||||||
#endif /* LIBCDSB_MAP_H */
|
#endif /* LIBCDSB_MAP_H */
|
||||||
|
@ -22,7 +22,8 @@ static int libcdsb_builtin_foreach(map_t* x, void* data, map_access_callback cal
|
|||||||
if (!mnode_is_empty(n->right)) cur = stack_insert(cur, n->right);
|
if (!mnode_is_empty(n->right)) cur = stack_insert(cur, n->right);
|
||||||
|
|
||||||
if (!r) {
|
if (!r) {
|
||||||
r = callback(vnode_peek(&n->key, x->type), x->type, vnode_peek(&n->value, n->type), n->type, data);
|
r = callback(libcdsb_variable_build(vnode_peek(&n->key, x->type), x->type),
|
||||||
|
libcdsb_variable_build(vnode_peek(&n->value, n->type), n->type), data);
|
||||||
} else {
|
} else {
|
||||||
stack_flush(&z);
|
stack_flush(&z);
|
||||||
return r;
|
return r;
|
||||||
@ -45,7 +46,7 @@ static int libcdsb_builtin_foreach(map_t* x, void* data, map_access_callback cal
|
|||||||
|
|
||||||
/*#####################################################################################################################*/
|
/*#####################################################################################################################*/
|
||||||
|
|
||||||
int libcdsb_map_find(map_t* x, const void* k, vtype t, void* _, map_access_callback callback, bool cut) {
|
int libcdsb_map_find(map_t* x, vtype_variable kvar, void* _, map_access_callback callback, bool cut) {
|
||||||
mnode_t* c;
|
mnode_t* c;
|
||||||
void *key;
|
void *key;
|
||||||
int cmp;
|
int cmp;
|
||||||
@ -54,10 +55,11 @@ int libcdsb_map_find(map_t* x, const void* k, vtype t, void* _, map_access_callb
|
|||||||
|
|
||||||
while (!mnode_is_empty(c)) {
|
while (!mnode_is_empty(c)) {
|
||||||
key = vnode_peek(&c->key, x->type);
|
key = vnode_peek(&c->key, x->type);
|
||||||
cmp = vtype_compare(k, t, key, x->type);
|
cmp = vtype_compare(kvar.pointer, kvar.type, key, x->type);
|
||||||
|
|
||||||
if (cmp == 0) {
|
if (cmp == 0) {
|
||||||
cmp = (callback) ? callback(key, x->type, vnode_peek(&c->value, c->type), c->type, _) : 0;
|
cmp = (callback) ? callback(libcdsb_variable_build(key, x->type),
|
||||||
|
libcdsb_variable_build(vnode_peek(&c->value, c->type), c->type), _) : 0;
|
||||||
|
|
||||||
if (cut) {
|
if (cut) {
|
||||||
c = mnode_delete(&x->root, c);
|
c = mnode_delete(&x->root, c);
|
||||||
@ -96,7 +98,8 @@ int libcdsb_map_foreach(map_t* x, void* data, map_access_callback callback, rbfo
|
|||||||
|
|
||||||
while ((n = stack_pop(&iter))) {
|
while ((n = stack_pop(&iter))) {
|
||||||
if (!r) {
|
if (!r) {
|
||||||
r = callback(vnode_peek(&n->key, x->type), x->type, vnode_peek(&n->value, n->type), n->type, data);
|
r = callback(libcdsb_variable_build(vnode_peek(&n->key, x->type), x->type),
|
||||||
|
libcdsb_variable_build(vnode_peek(&n->value, n->type), n->type), data);
|
||||||
} else if (!flush) {
|
} else if (!flush) {
|
||||||
stack_flush(&iter);
|
stack_flush(&iter);
|
||||||
return r;
|
return r;
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include "include.h"
|
#include "include.h"
|
||||||
|
|
||||||
bool libcdsb_map_update(map_t* x, const void* k, vtype kt, const void* v, vtype vt, void* dt, map_access_callback callback) {
|
bool libcdsb_map_update(map_t* x, vtype_variable key, vtype_variable value, void* dt, map_access_callback callback) {
|
||||||
int cmp;
|
int cmp;
|
||||||
mnode_t* n;
|
mnode_t* n;
|
||||||
mnode_t* p;
|
mnode_t* p;
|
||||||
@ -11,15 +11,15 @@ bool libcdsb_map_update(map_t* x, const void* k, vtype kt, const void* v, vtype
|
|||||||
if (!mnode_is_empty(n = x->root)) {
|
if (!mnode_is_empty(n = x->root)) {
|
||||||
do {
|
do {
|
||||||
p = n;
|
p = n;
|
||||||
cmp = vtype_compare(k, kt, vnode_peek(&n->key, kt), kt);
|
cmp = vtype_compare(key.pointer, key.type, vnode_peek(&n->key, key.type), key.type);
|
||||||
|
|
||||||
if (cmp == 0) {
|
if (cmp == 0) {
|
||||||
if (callback) callback(vnode_peek(&n->key, x->type), x->type,
|
if (callback) callback(libcdsb_variable_build(vnode_peek(&n->key, x->type), x->type),
|
||||||
vnode_peek(&n->value, n->type), n->type, dt);
|
libcdsb_variable_build(vnode_peek(&n->value, n->type), n->type), dt);
|
||||||
|
|
||||||
vnode_free(&n->value, n->type);
|
vnode_free(&n->value, n->type);
|
||||||
|
|
||||||
n->value = vnode_create(v, n->type = vt);
|
n->value = vnode_create(value.pointer, n->type = value.type);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -37,39 +37,38 @@ bool libcdsb_map_update(map_t* x, const void* k, vtype kt, const void* v, vtype
|
|||||||
|
|
||||||
} else n = x->root = mnode_create(nullptr, mnode_empty, 0);
|
} else n = x->root = mnode_create(nullptr, mnode_empty, 0);
|
||||||
|
|
||||||
n->key = vnode_tcreate(x->type, k, kt);
|
n->key = vnode_tcreate(x->type, key.pointer, key.type);
|
||||||
n->value = vnode_create(v, vt);
|
n->value = vnode_create(value.pointer, n->type = value.type);
|
||||||
n->type = vt;
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool libcdsb_map_inject(map_t* x, const void* k, vtype kt, const void* v, vtype vt, void* dt, map_access_callback callback) {
|
bool libcdsb_map_inject(map_t* x, vtype_variable key, vtype_variable value, void* dt, map_access_callback callback) {
|
||||||
int cmp;
|
int cmp;
|
||||||
mnode_t* n;
|
mnode_t* n;
|
||||||
mnode_t* p;
|
mnode_t* p;
|
||||||
vnode_t kn;
|
vnode_t kn;
|
||||||
|
|
||||||
vnode_tattach(&kn, x->type, k, kt);
|
vnode_tattach(&kn, x->type, key.pointer, key.type);
|
||||||
n = x->root;
|
n = x->root;
|
||||||
kt = x->type;
|
key.type = x->type;
|
||||||
k = vnode_peek(&kn, kt);
|
key.pointer = vnode_peek(&kn, key.type);
|
||||||
|
|
||||||
if (!mnode_is_empty(n)) {
|
if (!mnode_is_empty(n)) {
|
||||||
do {
|
do {
|
||||||
p = n;
|
p = n;
|
||||||
cmp = vtype_compare(k, kt, vnode_peek(&n->key, kt), kt);
|
cmp = vtype_compare(key.pointer, key.type, vnode_peek(&n->key, key.type), key.type);
|
||||||
|
|
||||||
if (cmp == 0) {
|
if (cmp == 0) {
|
||||||
if (callback) callback(vnode_peek(&n->key, x->type), x->type,
|
if (callback) callback(libcdsb_variable_build(vnode_peek(&n->key, x->type), x->type),
|
||||||
vnode_peek(&n->value, n->type), n->type, dt);
|
libcdsb_variable_build(vnode_peek(&n->value, n->type), n->type), dt);
|
||||||
|
|
||||||
vnode_free(&n->key, x->type);
|
vnode_free(&n->key, x->type);
|
||||||
vnode_free(&n->value, n->type);
|
vnode_free(&n->value, n->type);
|
||||||
|
|
||||||
n->key = kn;
|
n->key = kn;
|
||||||
vnode_attach(&n->value, v, n->type = vt);
|
vnode_attach(&n->value, value.pointer, n->type = value.type);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -87,7 +86,7 @@ bool libcdsb_map_inject(map_t* x, const void* k, vtype kt, const void* v, vtype
|
|||||||
|
|
||||||
} else n = x->root = mnode_create(kn, mnode_empty, 0);
|
} else n = x->root = mnode_create(kn, mnode_empty, 0);
|
||||||
|
|
||||||
vnode_attach(&n->value, v, n->type = vt);
|
vnode_attach(&n->value, value.pointer, n->type = value.type);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user