Refactor usage of the stack_t initialization

This commit is contained in:
Gregory Lirent 2022-08-18 03:15:57 +03:00
parent e8d3b55ec9
commit c9ec0d110f
7 changed files with 133 additions and 91 deletions

View File

@ -18,11 +18,12 @@ static inline void lnode_swap(lnode_t* s0, lnode_t* s1) {
void list_sort(list_t* x) { void list_sort(list_t* x) {
stack_t z = { .prev = 0, .value = x->last}; stack_t z;
lnode_t *l; lnode_t *l;
lnode_t *r; lnode_t *r;
stack_push(&z, x->first); stack_init(&z);
stack_push_many(&z, 2, x->last, x->first);
while (z.value) { while (z.value) {

View File

@ -19,37 +19,35 @@ static inline hash_t mnode_hash(const mnode_t* s, vtype t) {
hash_t map_hash(const map_t* s) { hash_t map_hash(const map_t* s) {
stack_t z;
mnode_t *c0, *c1; mnode_t *c0, *c1;
hash_t hash, v; hash_t hash, v;
stack_t z;
if (mnode_is_empty(s->root)) return 0; if (mnode_is_empty(s->root))
return 0;
z.prev = 0; stack_init(&z);
hash = 1; stack_push(&z, s->root->left);
c1 = s->root;
if (!rbnode_is_empty(z.value = c1->left)) { hash = 1;
if (!mnode_is_empty(c0 = stack_pop(&z))) {
do { do {
c0 = stack_pop(&z);
++hash; ++hash;
if (!mnode_is_empty(c0->right)) stack_push(&z, c0->right);
if (!mnode_is_empty(c0->right)) stack_push(&z, c1 = c0->right);
if (!mnode_is_empty(c0->left)) stack_push(&z, c1 = c0->left); if (!mnode_is_empty(c0->left)) stack_push(&z, c1 = c0->left);
} while (!is_null(z.value)); } while (!is_null(c0 = stack_pop(&z)));
} }
v = mnode_hash(c1, s->type); v = mnode_hash(c1, s->type);
c1 = s->root; stack_push(&z, s->root->right);
if (!rbnode_is_empty(z.value = c1->right)) { if (!mnode_is_empty(c0 = stack_pop(&z))) {
do { do {
c0 = stack_pop(&z);
++hash; ++hash;
if (!mnode_is_empty(c0->right)) stack_push(&z, c1 = c0->right); if (!mnode_is_empty(c0->right)) stack_push(&z, c1 = c0->right);
if (!mnode_is_empty(c0->left)) stack_push(&z, c1 = c0->left); if (!mnode_is_empty(c0->left)) stack_push(&z, c0->left);
} while (!is_null(z.value)); } while (!is_null(c0 = stack_pop(&z)));
} }
v += mnode_hash(c1, s->type); v += mnode_hash(c1, s->type);
@ -98,10 +96,15 @@ void map_free(map_t* x) {
/*#####################################################################################################################*/ /*#####################################################################################################################*/
size_t map_size(const map_t* x) { size_t map_size(const map_t* x) {
stack_t z = { .prev = 0, .value = x->root }; stack_t z;
size_t n = 0; size_t n;
rbnode_t* c; rbnode_t* c;
stack_init(&z);
stack_push(&z, x->root);
n = 0;
if (!mnode_is_empty(x->root)) { if (!mnode_is_empty(x->root)) {
while ((c = stack_pop(&z))) { while ((c = stack_pop(&z))) {
++n; ++n;
@ -116,20 +119,20 @@ size_t map_size(const map_t* x) {
/*#####################################################################################################################*/ /*#####################################################################################################################*/
int map_compare(const map_t* s0, const map_t* s1) { int map_compare(const map_t* s0, const map_t* s1) {
stack_t z;
mnode_t *c0, *c1; mnode_t *c0, *c1;
stack_t z; int cmp;
int c = 0;
if (s0 == s1 || s0->root == s1->root) if (s0 == s1 || s0->root == s1->root)
return 0; return 0;
if (s0->type != s1->type) if (s0->type != s1->type)
return s0->type - s1->type; return s0->type - s1->type;
z.prev = 0; stack_init(&z);
z.value = 0;
stack_push_many(&z, 2, (void*)s1, (void*)s0); stack_push_many(&z, 2, (void*)s1, (void*)s0);
cmp = 0;
do { do {
c0 = stack_pop(&z); c0 = stack_pop(&z);
c1 = stack_pop(&z); c1 = stack_pop(&z);
@ -139,18 +142,18 @@ int map_compare(const map_t* s0, const map_t* s1) {
stack_flush(&z); stack_flush(&z);
return mnode_is_empty(c0) ? -1 : 1; return mnode_is_empty(c0) ? -1 : 1;
} }
} else if ((c = mnode_compare(c0, c1, s0->type))) { } else if ((cmp = mnode_compare(c0, c1, s0->type))) {
if (c0->left == c1->right) { // == mnode_empty if (c0->left == c1->right) { // == mnode_empty
c = mnode_compare(c0->right, c1, s0->type); cmp = mnode_compare(c0->right, c1, s0->type);
if (!c) c = mnode_compare(c0, c1->left, s0->type); if (!cmp) cmp = mnode_compare(c0, c1->left, s0->type);
} else if (c0->right == c1->left) { // == mnode_empty } else if (c0->right == c1->left) { // == mnode_empty
c = mnode_compare(c0, c1->right, s0->type); cmp = mnode_compare(c0, c1->right, s0->type);
if (!c) c = mnode_compare(c0->left, c1, s0->type); if (!cmp) cmp = mnode_compare(c0->left, c1, s0->type);
} }
if (c) { if (cmp) {
stack_flush(&z); stack_flush(&z);
return c; return cmp;
} }
} else stack_push_many(&z, 4, c1->right, c0->right, c1->left, c0->left); } else stack_push_many(&z, 4, c1->right, c0->right, c1->left, c0->left);

View File

@ -20,7 +20,10 @@ static inline mnode_t* mnode_duplicate(const mnode_t* s, mnode_t* p, const vtype
map_t map_copy(const map_t* s) { map_t map_copy(const map_t* s) {
map_t x; map_t x;
stack_t z = { .prev = 0, .value = s->root }; stack_t z;
stack_init(&z);
stack_push(&z, s->root);
x.type = s->type; x.type = s->type;
@ -52,9 +55,13 @@ map_t map_copy(const map_t* s) {
map_t* map_duplicate(const map_t* s) { map_t* map_duplicate(const map_t* s) {
map_t* x = malloc(sizeof(*x)); map_t* x;
stack_t z = { .prev = 0, .value = s->root }; stack_t z;
stack_init(&z);
stack_push(&z, s->root);
x = malloc(sizeof(*x));
x->type = s->type; x->type = s->type;
if (!mnode_is_empty(s->root)) { if (!mnode_is_empty(s->root)) {
@ -85,7 +92,10 @@ map_t* map_duplicate(const map_t* s) {
void map_copy_init(map_t* x, const map_t* s) { void map_copy_init(map_t* x, const map_t* s) {
stack_t z = { .prev = 0, .value = s->root }; stack_t z;
stack_init(&z);
stack_push(&z, s->root);
x->type = s->type; x->type = s->type;

View File

@ -80,11 +80,17 @@ int libcdsb_map_find(map_t* x, const void* k, vtype t, void* _, map_access_callb
int libcdsb_map_foreach(map_t* x, void* dt, map_access_callback callback, bool flush) { int libcdsb_map_foreach(map_t* x, void* dt, map_access_callback callback, bool flush) {
stack_t z = { .prev = 0, .value = x->root }; stack_t z;
int r = 0; int r;
mnode_t* c; mnode_t* c;
if (mnode_is_empty(x->root)) return 0; stack_init(&z);
stack_push(&z, x->root);
r = 0;
if (mnode_is_empty(x->root))
return 0;
while ((c = stack_pop(&z))) { while ((c = stack_pop(&z))) {
if ((r = callback(vnode_peek(&c->key, x->type), x->type, vnode_peek(&c->value, c->type), c->type, dt))) if ((r = callback(vnode_peek(&c->key, x->type), x->type, vnode_peek(&c->value, c->type), c->type, dt)))

View File

@ -18,37 +18,35 @@ static inline hash_t rbnode_hash(const rbnode_t* s, vtype t) {
hash_t vset_hash(const set_t* s) { hash_t vset_hash(const set_t* s) {
stack_t z;
rbnode_t *c0, *c1; rbnode_t *c0, *c1;
hash_t hash, v; hash_t hash, v;
stack_t z;
if (rbnode_is_empty(s->root)) return 0; if (rbnode_is_empty(s->root))
return 0;
z.prev = 0; stack_init(&z);
hash = 1; stack_push(&z, s->root->left);
c1 = s->root;
if (!rbnode_is_empty(z.value = c1->left)) { hash = 1;
if (!rbnode_is_empty(c0 = stack_pop(&z))) {
do { do {
c0 = stack_pop(&z);
++hash; ++hash;
if (!rbnode_is_empty(c0->right)) stack_push(&z, c0->right);
if (!rbnode_is_empty(c0->right)) stack_push(&z, c1 = c0->right);
if (!rbnode_is_empty(c0->left)) stack_push(&z, c1 = c0->left); if (!rbnode_is_empty(c0->left)) stack_push(&z, c1 = c0->left);
} while (!is_null(z.value)); } while (!is_null(c0 = stack_pop(&z)));
} }
v = rbnode_hash(c1, s->type); v = rbnode_hash(c1, s->type);
c1 = s->root; stack_push(&z, s->root->right);
if (!rbnode_is_empty(z.value = c1->right)) { if (!rbnode_is_empty(c0 = stack_pop(&z))) {
do { do {
c0 = stack_pop(&z);
++hash; ++hash;
if (!rbnode_is_empty(c0->right)) stack_push(&z, c1 = c0->right); if (!rbnode_is_empty(c0->right)) stack_push(&z, c1 = c0->right);
if (!rbnode_is_empty(c0->left)) stack_push(&z, c1 = c0->left); if (!rbnode_is_empty(c0->left)) stack_push(&z, c0->left);
} while (!is_null(z.value)); } while (!is_null(c0 = stack_pop(&z)));
} }
v += rbnode_hash(c1, s->type); v += rbnode_hash(c1, s->type);
@ -96,10 +94,15 @@ void vset_free(set_t* x) {
/*#####################################################################################################################*/ /*#####################################################################################################################*/
size_t vset_size(const set_t* x) { size_t vset_size(const set_t* x) {
stack_t z = { .prev = 0, .value = x->root }; stack_t z;
size_t n = 0; size_t n;
rbnode_t* c; rbnode_t* c;
stack_init(&z);
stack_push(&z, x->root);
n = 0;
if (!rbnode_is_empty(x->root)) { if (!rbnode_is_empty(x->root)) {
while ((c = stack_pop(&z))) { while ((c = stack_pop(&z))) {
++n; ++n;
@ -114,20 +117,20 @@ size_t vset_size(const set_t* x) {
/*#####################################################################################################################*/ /*#####################################################################################################################*/
int vset_compare(const set_t* s0, const set_t* s1) { int vset_compare(const set_t* s0, const set_t* s1) {
stack_t z;
rbnode_t *c0, *c1; rbnode_t *c0, *c1;
stack_t z; int cmp;
int c = 0;
if (s0 == s1 || s0->root == s1->root) if (s0 == s1 || s0->root == s1->root)
return 0; return 0;
if (s0->type != s1->type) if (s0->type != s1->type)
return s0->type - s1->type; return s0->type - s1->type;
z.prev = 0; stack_init(&z);
z.value = 0;
stack_push_many(&z, 2, (void*)s1, (void*)s0); stack_push_many(&z, 2, (void*)s1, (void*)s0);
cmp = 0;
do { do {
c0 = stack_pop(&z); c0 = stack_pop(&z);
c1 = stack_pop(&z); c1 = stack_pop(&z);
@ -137,18 +140,18 @@ int vset_compare(const set_t* s0, const set_t* s1) {
stack_flush(&z); stack_flush(&z);
return rbnode_is_empty(c0) ? -1 : 1; return rbnode_is_empty(c0) ? -1 : 1;
} }
} else if ((c = rbnode_compare(c0, c1, s0->type))) { } else if ((cmp = rbnode_compare(c0, c1, s0->type))) {
if (c0->left == c1->right) { // == rbnode_empty if (c0->left == c1->right) { // == rbnode_empty
c = rbnode_compare(c0->right, c1, s0->type); cmp = rbnode_compare(c0->right, c1, s0->type);
if (!c) c = rbnode_compare(c0, c1->left, s0->type); if (!cmp) cmp = rbnode_compare(c0, c1->left, s0->type);
} else if (c0->right == c1->left) { // == rbnode_empty } else if (c0->right == c1->left) { // == rbnode_empty
c = rbnode_compare(c0, c1->right, s0->type); cmp = rbnode_compare(c0, c1->right, s0->type);
if (!c) c = rbnode_compare(c0->left, c1, s0->type); if (!cmp) cmp = rbnode_compare(c0->left, c1, s0->type);
} }
if (c) { if (cmp) {
stack_flush(&z); stack_flush(&z);
return c; return cmp;
} }
} else stack_push_many(&z, 4, c1->right, c0->right, c1->left, c0->left); } else stack_push_many(&z, 4, c1->right, c0->right, c1->left, c0->left);

View File

@ -6,12 +6,16 @@
set_t vset_copy(const set_t* s) { set_t vset_copy(const set_t* s) {
set_t x = { .type = s->type }; set_t x;
stack_t z = { .prev = 0, .value = s->root }; stack_t z;
vtype t = s->type;
stack_init(&z);
stack_push(&z, s->root);
x.type = s->type;
if (!rbnode_is_empty(s->root)) { if (!rbnode_is_empty(s->root)) {
x.root = rbnode_create(vnode_duplicate(&s->root->value, t), rbnode_empty, 0); x.root = rbnode_create(vnode_duplicate(&s->root->value, s->type), rbnode_empty, 0);
stack_push(&z, x.root); stack_push(&z, x.root);
do { do {
@ -19,12 +23,12 @@ set_t vset_copy(const set_t* s) {
rbnode_t *p1 = stack_pop(&z); rbnode_t *p1 = stack_pop(&z);
if (!rbnode_is_empty(p1->left)) { if (!rbnode_is_empty(p1->left)) {
p0->left = rbnode_create(vnode_duplicate(&p1->left->value, t), p0, p1->left->colored); p0->left = rbnode_create(vnode_duplicate(&p1->left->value, s->type), p0, p1->left->colored);
stack_push_many(&z, 2, p1->left, p0->left); stack_push_many(&z, 2, p1->left, p0->left);
} }
if (!rbnode_is_empty(p1->right)) { if (!rbnode_is_empty(p1->right)) {
p0->right = rbnode_create(vnode_duplicate(&p1->right->value, t), p0, p1->right->colored); p0->right = rbnode_create(vnode_duplicate(&p1->right->value, s->type), p0, p1->right->colored);
stack_push_many(&z, 2, p1->right, p0->right); stack_push_many(&z, 2, p1->right, p0->right);
} }
@ -38,12 +42,17 @@ set_t vset_copy(const set_t* s) {
set_t* vset_duplicate(const set_t* s) { set_t* vset_duplicate(const set_t* s) {
set_t* x = malloc(sizeof(*x)); set_t* x;
stack_t z = { .prev = 0, .value = s->root }; stack_t z;
vtype t = x->type = s->type;
stack_init(&z);
stack_push(&z, s->root);
x = malloc(sizeof(*x));
x->type = s->type;
if (!rbnode_is_empty(s->root)) { if (!rbnode_is_empty(s->root)) {
x->root = rbnode_create(vnode_duplicate(&s->root->value, t), rbnode_empty, 0); x->root = rbnode_create(vnode_duplicate(&s->root->value, s->type), rbnode_empty, 0);
stack_push(&z, x->root); stack_push(&z, x->root);
do { do {
@ -51,12 +60,12 @@ set_t* vset_duplicate(const set_t* s) {
rbnode_t *p1 = stack_pop(&z); rbnode_t *p1 = stack_pop(&z);
if (!rbnode_is_empty(p1->left)) { if (!rbnode_is_empty(p1->left)) {
p0->left = rbnode_create(vnode_duplicate(&p1->left->value, t), p0, p1->left->colored); p0->left = rbnode_create(vnode_duplicate(&p1->left->value, s->type), p0, p1->left->colored);
stack_push_many(&z, 2, p1->left, p0->left); stack_push_many(&z, 2, p1->left, p0->left);
} }
if (!rbnode_is_empty(p1->right)) { if (!rbnode_is_empty(p1->right)) {
p0->right = rbnode_create(vnode_duplicate(&p1->right->value, t), p0, p1->right->colored); p0->right = rbnode_create(vnode_duplicate(&p1->right->value, s->type), p0, p1->right->colored);
stack_push_many(&z, 2, p1->right, p0->right); stack_push_many(&z, 2, p1->right, p0->right);
} }
@ -70,11 +79,15 @@ set_t* vset_duplicate(const set_t* s) {
void vset_copy_init(set_t* x, const set_t* s) { void vset_copy_init(set_t* x, const set_t* s) {
stack_t z = { .prev = 0, .value = s->root }; stack_t z;
vtype t = x->type = s->type;
stack_init(&z);
stack_push(&z, s->root);
x->type = s->type;
if (!rbnode_is_empty(s->root)) { if (!rbnode_is_empty(s->root)) {
x->root = rbnode_create(vnode_duplicate(&s->root->value, t), rbnode_empty, 0); x->root = rbnode_create(vnode_duplicate(&s->root->value, s->type), rbnode_empty, 0);
stack_push(&z, x->root); stack_push(&z, x->root);
do { do {
@ -82,12 +95,12 @@ void vset_copy_init(set_t* x, const set_t* s) {
rbnode_t *p1 = stack_pop(&z); rbnode_t *p1 = stack_pop(&z);
if (!rbnode_is_empty(p1->left)) { if (!rbnode_is_empty(p1->left)) {
p0->left = rbnode_create(vnode_duplicate(&p1->left->value, t), p0, p1->left->colored); p0->left = rbnode_create(vnode_duplicate(&p1->left->value, s->type), p0, p1->left->colored);
stack_push_many(&z, 2, p1->left, p0->left); stack_push_many(&z, 2, p1->left, p0->left);
} }
if (!rbnode_is_empty(p1->right)) { if (!rbnode_is_empty(p1->right)) {
p0->right = rbnode_create(vnode_duplicate(&p1->right->value, t), p0, p1->right->colored); p0->right = rbnode_create(vnode_duplicate(&p1->right->value, s->type), p0, p1->right->colored);
stack_push_many(&z, 2, p1->right, p0->right); stack_push_many(&z, 2, p1->right, p0->right);
} }

View File

@ -71,11 +71,17 @@ int libcdsb_vset_find(vtype_set* x, const void* v, vtype t, void* _, vset_access
int libcdsb_vset_foreach(set_t* x, void* data, vset_access_callback callback, bool flush) { int libcdsb_vset_foreach(set_t* x, void* data, vset_access_callback callback, bool flush) {
stack_t z = { .prev = 0, .value = x->root }; stack_t z;
int r = 0; int r;
rbnode_t* c; rbnode_t* c;
if (rbnode_is_empty(x->root)) return 0; stack_init(&z);
stack_push(&z, x->root);
r = 0;
if (rbnode_is_empty(x->root))
return 0;
while ((c = stack_pop(&z))) { while ((c = stack_pop(&z))) {
if ((r = callback(vnode_peek(&c->value, x->type), x->type, data))) if ((r = callback(vnode_peek(&c->value, x->type), x->type, data)))