114 lines
3.1 KiB
C
114 lines
3.1 KiB
C
|
|
/* This software is licensed by the MIT License, see LICENSE file */
|
||
|
|
/* Copyright © 2022 Gregory Lirent */
|
||
|
|
|
||
|
|
#include "include.h"
|
||
|
|
|
||
|
|
/*#####################################################################################################################*/
|
||
|
|
|
||
|
|
static inline mnode_t* mnode_duplicate(const mnode_t* s, mnode_t* p, const vtype t) {
|
||
|
|
mnode_t* x;
|
||
|
|
|
||
|
|
x = mnode_create(vnode_duplicate(&s->key, t), p, s->colored);
|
||
|
|
x->type = s->type;
|
||
|
|
x->value = vnode_duplicate(&s->value, s->type);
|
||
|
|
|
||
|
|
return x;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*#####################################################################################################################*/
|
||
|
|
|
||
|
|
map_t map_copy(const map_t* s) {
|
||
|
|
|
||
|
|
map_t x;
|
||
|
|
stack_t z = { .prev = 0, .value = s->root };
|
||
|
|
|
||
|
|
x.type = s->type;
|
||
|
|
|
||
|
|
if (!mnode_is_empty(s->root)) {
|
||
|
|
x.root = mnode_duplicate(s->root, mnode_empty, s->type);
|
||
|
|
stack_push(&z, x.root);
|
||
|
|
|
||
|
|
do {
|
||
|
|
mnode_t *p0 = stack_pop(&z);
|
||
|
|
mnode_t *p1 = stack_pop(&z);
|
||
|
|
|
||
|
|
if (!mnode_is_empty(p1->left)) {
|
||
|
|
p0->left = mnode_duplicate(p1->left, p0, s->type);
|
||
|
|
stack_push_many(&z, 2, p1->left, p0->left);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!mnode_is_empty(p1->right)) {
|
||
|
|
p0->right = mnode_duplicate(p1->right, p0, s->type);
|
||
|
|
stack_push_many(&z, 2, p1->right, p0->right);
|
||
|
|
}
|
||
|
|
|
||
|
|
} while (!is_null(z.value));
|
||
|
|
|
||
|
|
} else x.root = mnode_empty;
|
||
|
|
|
||
|
|
return x;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
map_t* map_duplicate(const map_t* s) {
|
||
|
|
|
||
|
|
map_t* x = malloc(sizeof(*x));
|
||
|
|
stack_t z = { .prev = 0, .value = s->root };
|
||
|
|
|
||
|
|
x->type = s->type;
|
||
|
|
|
||
|
|
if (!mnode_is_empty(s->root)) {
|
||
|
|
x->root = mnode_duplicate(s->root, mnode_empty, s->type);
|
||
|
|
stack_push(&z, x->root);
|
||
|
|
|
||
|
|
do {
|
||
|
|
mnode_t *p0 = stack_pop(&z);
|
||
|
|
mnode_t *p1 = stack_pop(&z);
|
||
|
|
|
||
|
|
if (!mnode_is_empty(p1->left)) {
|
||
|
|
p0->left = mnode_duplicate(p1->left, p0, s->type);
|
||
|
|
stack_push_many(&z, 2, p1->left, p0->left);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!mnode_is_empty(p1->right)) {
|
||
|
|
p0->right = mnode_duplicate(p1->right, p0, s->type);
|
||
|
|
stack_push_many(&z, 2, p1->right, p0->right);
|
||
|
|
}
|
||
|
|
|
||
|
|
} while (!is_null(z.value));
|
||
|
|
|
||
|
|
} else x->root = mnode_empty;
|
||
|
|
|
||
|
|
return x;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
void map_copy_init(map_t* x, const map_t* s) {
|
||
|
|
|
||
|
|
stack_t z = { .prev = 0, .value = s->root };
|
||
|
|
|
||
|
|
x->type = s->type;
|
||
|
|
|
||
|
|
if (!mnode_is_empty(s->root)) {
|
||
|
|
x->root = mnode_duplicate(s->root, mnode_empty, s->type);
|
||
|
|
stack_push(&z, x->root);
|
||
|
|
|
||
|
|
do {
|
||
|
|
mnode_t *p0 = stack_pop(&z);
|
||
|
|
mnode_t *p1 = stack_pop(&z);
|
||
|
|
|
||
|
|
if (!mnode_is_empty(p1->left)) {
|
||
|
|
p0->left = mnode_duplicate(p1->left, p0, s->type);
|
||
|
|
stack_push_many(&z, 2, p1->left, p0->left);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!mnode_is_empty(p1->right)) {
|
||
|
|
p0->right = mnode_duplicate(p1->right, p0, s->type);
|
||
|
|
stack_push_many(&z, 2, p1->right, p0->right);
|
||
|
|
}
|
||
|
|
|
||
|
|
} while (!is_null(z.value));
|
||
|
|
|
||
|
|
} else x->root = mnode_empty;
|
||
|
|
}
|