Update set tests
This commit is contained in:
		
							parent
							
								
									d57f5ed2c6
								
							
						
					
					
						commit
						f8878390a7
					
				@ -6,8 +6,10 @@
 | 
				
			|||||||
int main(int argc, char** argv) {
 | 
					int main(int argc, char** argv) {
 | 
				
			||||||
    test_init(argc, argv);
 | 
					    test_init(argc, argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    set_t x = vset_random(36, 0.1);
 | 
					    set_t x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while(vset_remove_random(&x, 0.1)) {}
 | 
					    vset_init(&x, random_uint8()%VTYPE_LDOUBLE + 1);
 | 
				
			||||||
    vset_free(&x);
 | 
					
 | 
				
			||||||
 | 
					    visual_push(&x, random_uint8()%17 + 16);
 | 
				
			||||||
 | 
					    visual_remove(&x);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -8,188 +8,11 @@
 | 
				
			|||||||
#include "../../include/test.h"
 | 
					#include "../../include/test.h"
 | 
				
			||||||
#include "../../include/time.h"
 | 
					#include "../../include/time.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
vtype_string* string_duplicate(const vtype_string* x) { return 0; }
 | 
					extern void vset_push_random(set_t* x, _Bool silent, unsigned int hpos);
 | 
				
			||||||
vtype_array*  array_duplicate (const vtype_array*  x) { return 0; }
 | 
					extern void vset_remove_random(set_t* x, _Bool silent, unsigned int hpos);
 | 
				
			||||||
vtype_list*   list_duplicate  (const vtype_list*   x) { return 0; }
 | 
					 | 
				
			||||||
vtype_map*    map_duplicate   (const vtype_map*    x) { return 0; }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void string_free(vtype_string* x) {}
 | 
					extern void vset_print(set_t* x, const char* prefix, unsigned int hpos);
 | 
				
			||||||
void array_free (vtype_array*  x) {}
 | 
					extern void vset_info(const set_t* x, unsigned int hpos);
 | 
				
			||||||
void list_free  (vtype_list*   x) {}
 | 
					extern void vset_rbtree_print(set_t *x, const char* prefix, unsigned int hpos);
 | 
				
			||||||
void map_free   (vtype_map*    x) {}
 | 
					extern void visual_push(set_t* x, size_t n);
 | 
				
			||||||
 | 
					extern void visual_remove(set_t* x);
 | 
				
			||||||
int string_compare(const vtype_string* s0, const vtype_string* s1) { return random_int8(); }
 | 
					 | 
				
			||||||
int array_compare (const vtype_array*  s0, const vtype_array*  s1) { return random_int8(); }
 | 
					 | 
				
			||||||
int list_compare  (const vtype_list*   s0, const vtype_list*   s1) { return random_int8(); }
 | 
					 | 
				
			||||||
int map_compare   (const vtype_map*    s0, const vtype_map*    s1) { return random_int8(); }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int vset_node_print(const void* v, vtype t, void* _) {
 | 
					 | 
				
			||||||
    print_container_value(0, v, t, false);
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void vset_print(set_t* x, const char* prefix) {
 | 
					 | 
				
			||||||
    print_container_values_prefix("Set", prefix);
 | 
					 | 
				
			||||||
    vset_foreach(x, 0, vset_node_print);
 | 
					 | 
				
			||||||
    put_separator();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void vset_info(const set_t* x) {
 | 
					 | 
				
			||||||
    print_container_info("Set", "nodes", &x->type, vset_size(x), -1);
 | 
					 | 
				
			||||||
    put_separator();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void rbtree_print(const rbnode_t* s, vtype t, const char* ind, bool br) {
 | 
					 | 
				
			||||||
    if (!ind) {
 | 
					 | 
				
			||||||
        ind = "\e[36m";
 | 
					 | 
				
			||||||
        br  = 1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    size_t n = strlen(ind);
 | 
					 | 
				
			||||||
    char x[n + 10];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (rbnode_is_empty(s)) return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    memcpy(x, ind, n);
 | 
					 | 
				
			||||||
    memcpy(x + n, "     \0  ", 9);
 | 
					 | 
				
			||||||
    fputs(ind, stdout);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (br) {
 | 
					 | 
				
			||||||
        fputs("\e[m\e[36;1mR\e[m\e[36m────\e[m", stdout);
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        fputs("\e[m\e[36;1mL\e[m\e[36m────\e[m", stdout);
 | 
					 | 
				
			||||||
        memcpy(x + n, "│", 3);
 | 
					 | 
				
			||||||
        x[n + 5] = ' ';
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fputs((s->colored) ? "\e[31;1m" : "\e[37m", stdout);
 | 
					 | 
				
			||||||
    printf("%s\e[m\n", libcdsb_vtype_stringify(vnode_peek(&s->value, t), t));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    rbtree_print(s->left,  t, x, false);
 | 
					 | 
				
			||||||
    rbtree_print(s->right, t, x, true);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void vset_push_random(set_t* x, double pause) {
 | 
					 | 
				
			||||||
    var_t _;
 | 
					 | 
				
			||||||
    vtype t;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    printf("\e[s\e[36mTry to insert into set (\e[m\e[32;1m%s\e[m\e[36m)\e[m:\n", libcdsb_vtype_name(x->type));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    switch (random_uint8()%13) {
 | 
					 | 
				
			||||||
        default:
 | 
					 | 
				
			||||||
        case   0: _.b   = random_boolean(); print_container_value(0, &_, t = VTYPE_BOOLEAN, 1); break;
 | 
					 | 
				
			||||||
        case   1: _.u8  = random_uint8();   print_container_value(0, &_, t = VTYPE_UINT8,   1); break;
 | 
					 | 
				
			||||||
        case   2: _.u16 = random_uint16();  print_container_value(0, &_, t = VTYPE_UINT16,  1); break;
 | 
					 | 
				
			||||||
        case   3: _.u32 = random_uint32();  print_container_value(0, &_, t = VTYPE_UINT32,  1); break;
 | 
					 | 
				
			||||||
        case   4: _.u64 = random_uint64();  print_container_value(0, &_, t = VTYPE_UINT64,  1); break;
 | 
					 | 
				
			||||||
        case   5: _.u8  = random_int8();    print_container_value(0, &_, t = VTYPE_INT8,    1); break;
 | 
					 | 
				
			||||||
        case   6: _.u16 = random_int16();   print_container_value(0, &_, t = VTYPE_INT16,   1); break;
 | 
					 | 
				
			||||||
        case   7: _.u32 = random_int32();   print_container_value(0, &_, t = VTYPE_INT32,   1); break;
 | 
					 | 
				
			||||||
        case   8: _.u64 = random_int64();   print_container_value(0, &_, t = VTYPE_INT64,   1); break;
 | 
					 | 
				
			||||||
        case   9: _.f   = random_float();   print_container_value(0, &_, t = VTYPE_FLOAT,   1); break;
 | 
					 | 
				
			||||||
        case  10: _.d   = random_double();  print_container_value(0, &_, t = VTYPE_DOUBLE,  1); break;
 | 
					 | 
				
			||||||
        case  11: _.ld  = random_ldouble(); print_container_value(0, &_, t = VTYPE_LDOUBLE, 1); break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case  12: if (sizeof(void*) == 8) {
 | 
					 | 
				
			||||||
            _.u64 = random_uint64();  print_container_value(0, &_, t = VTYPE_POINTER,  1); break;
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            _.u32 = random_uint32();  print_container_value(0, &_, t = VTYPE_POINTER,  1); break;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (libcdsb_vset_insert(x, &_, t)) {
 | 
					 | 
				
			||||||
        puts("\e[32;1mSUCCESS\e[m");
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        puts("\e[31;1mFAILURE\e[m");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    put_separator();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    rbtree_print(x->root, x->type, 0, 0);
 | 
					 | 
				
			||||||
    put_separator();
 | 
					 | 
				
			||||||
    psleep(pause * 1000000);
 | 
					 | 
				
			||||||
    fputs("\e[u\e[J", stdout);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int vset_node_remove_random(const void* v, vtype t, void* data) {
 | 
					 | 
				
			||||||
    struct {
 | 
					 | 
				
			||||||
        size_t n;
 | 
					 | 
				
			||||||
        set_t* set;
 | 
					 | 
				
			||||||
        double pause;
 | 
					 | 
				
			||||||
    } *d = data;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!d->n--) {
 | 
					 | 
				
			||||||
        print_container_value(0, v, t, 1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (libcdsb_vset_find(0, d->set, v, t, 1)) {
 | 
					 | 
				
			||||||
            puts("\e[32;1mSUCCESS\e[m");
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            puts("\e[31;1mFAILURE\e[m");
 | 
					 | 
				
			||||||
            abort();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        put_separator();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        rbtree_print(d->set->root, d->set->type, 0, 0);
 | 
					 | 
				
			||||||
        put_separator();
 | 
					 | 
				
			||||||
        psleep(d->pause * 1000000);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static bool vset_remove_random(set_t* x, double pause) {
 | 
					 | 
				
			||||||
    struct {
 | 
					 | 
				
			||||||
        size_t n;
 | 
					 | 
				
			||||||
        set_t* set;
 | 
					 | 
				
			||||||
        double pause;
 | 
					 | 
				
			||||||
    } d;
 | 
					 | 
				
			||||||
    d.n     = vset_size(x);
 | 
					 | 
				
			||||||
    d.set   = x;
 | 
					 | 
				
			||||||
    d.pause = pause;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    printf("\e[s\e[36mTry to remove value from set (\e[m\e[32;1m%s\e[m\e[36m)\e[m:\n", libcdsb_vtype_name(x->type));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (d.n) {
 | 
					 | 
				
			||||||
        d.n = random_uint32()%d.n;
 | 
					 | 
				
			||||||
    } else goto end_;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!vset_foreach(x, &d, vset_node_remove_random)) {
 | 
					 | 
				
			||||||
  end_:
 | 
					 | 
				
			||||||
        puts("\e[u\e[J\e[32;1mSet is empty\e[m");
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fputs("\e[u\e[J", stdout);
 | 
					 | 
				
			||||||
    return true;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static set_t vset_random(unsigned int n, double pause) {
 | 
					 | 
				
			||||||
    set_t x;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    switch (random_uint8()%12) {
 | 
					 | 
				
			||||||
        default:
 | 
					 | 
				
			||||||
        case  0: vset_init(&x, VTYPE_UINT8);   break;
 | 
					 | 
				
			||||||
        case  1: vset_init(&x, VTYPE_UINT16);  break;
 | 
					 | 
				
			||||||
        case  2: vset_init(&x, VTYPE_UINT32);  break;
 | 
					 | 
				
			||||||
        case  3: vset_init(&x, VTYPE_UINT64);  break;
 | 
					 | 
				
			||||||
        case  4: vset_init(&x, VTYPE_INT8);    break;
 | 
					 | 
				
			||||||
        case  5: vset_init(&x, VTYPE_INT16);   break;
 | 
					 | 
				
			||||||
        case  6: vset_init(&x, VTYPE_INT32);   break;
 | 
					 | 
				
			||||||
        case  7: vset_init(&x, VTYPE_INT64);   break;
 | 
					 | 
				
			||||||
        case  8: vset_init(&x, VTYPE_POINTER); break;
 | 
					 | 
				
			||||||
        case  9: vset_init(&x, VTYPE_FLOAT);   break;
 | 
					 | 
				
			||||||
        case 10: vset_init(&x, VTYPE_DOUBLE);  break;
 | 
					 | 
				
			||||||
        case 11: vset_init(&x, VTYPE_LDOUBLE); break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (n) {
 | 
					 | 
				
			||||||
        while (--n) vset_push_random(&x, pause);
 | 
					 | 
				
			||||||
        vset_push_random(&x, pause);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return x;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										82
									
								
								tests/src/set/src/io.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								tests/src/set/src/io.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,82 @@
 | 
				
			|||||||
 | 
					/* This software is licensed by the MIT License, see LICENSE file */
 | 
				
			||||||
 | 
					/*                                Copyright © 2022 Gregory Lirent */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "../plug.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int node_print_callback(const void* v, vtype t, void* _) {
 | 
				
			||||||
 | 
					    print_container_value(0, v, t, 0, *(unsigned int*)_);
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void rbtree_print(const rbnode_t* s, vtype t, const char* ind, bool br, unsigned int hpos) {
 | 
				
			||||||
 | 
					    if (!ind) {
 | 
				
			||||||
 | 
					        ind = "\e[36m";
 | 
				
			||||||
 | 
					        br  = 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    size_t n = strlen(ind);
 | 
				
			||||||
 | 
					    char x[n + 10];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (rbnode_is_empty(s)) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memcpy(x, ind, n);
 | 
				
			||||||
 | 
					    memcpy(x + n, "     \0  ", 9);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    printf("\e[%dG%s", hpos+1, ind);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (br) {
 | 
				
			||||||
 | 
					        fputs("\e[m\e[36;1mR\e[m\e[36m────\e[m", stdout);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        fputs("\e[m\e[36;1mL\e[m\e[36m────\e[m", stdout);
 | 
				
			||||||
 | 
					        memcpy(x + n, "│", 3);
 | 
				
			||||||
 | 
					        x[n + 5] = ' ';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fputs((s->colored) ? "\e[31;1m" : "\e[37m", stdout);
 | 
				
			||||||
 | 
					    printf("%s\e[m \e[36m\e[m\n", vnode_stringify(&s->value, t));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rbtree_print(s->left,  t, x, false, hpos);
 | 
				
			||||||
 | 
					    rbtree_print(s->right, t, x, true, hpos);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void vset_print(set_t* x, const char* prefix, unsigned int hpos) {
 | 
				
			||||||
 | 
					    print_container_values_prefix("Set", prefix, 0);
 | 
				
			||||||
 | 
					    vset_foreach(x, &hpos, node_print_callback);
 | 
				
			||||||
 | 
					    put_separator(0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void vset_info(const set_t* x, unsigned int hpos) {
 | 
				
			||||||
 | 
					    print_container_info("Set", "nodes", &x->type, vset_size(x), -1, 0);
 | 
				
			||||||
 | 
					    put_separator(0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void vset_rbtree_print(set_t *x, const char* prefix, unsigned int hpos) {
 | 
				
			||||||
 | 
					    print_container_values_prefix("Set", prefix, 0);
 | 
				
			||||||
 | 
					    rbtree_print(x->root, x->type, 0, 0, hpos);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void visual_push(set_t* x, size_t n) {
 | 
				
			||||||
 | 
					    while (n--) {
 | 
				
			||||||
 | 
					        fputs("\e[s", stdout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        vset_push_random(x, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        vset_info(x, 0);
 | 
				
			||||||
 | 
					        vset_rbtree_print(x, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        psleep(100000);
 | 
				
			||||||
 | 
					        fputs("\e[u\e[J", stdout);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void visual_remove(set_t* x) {
 | 
				
			||||||
 | 
					    while (!rbnode_is_empty(x->root)) {
 | 
				
			||||||
 | 
					        fputs("\e[s", stdout);
 | 
				
			||||||
 | 
					        vset_remove_random(x, 0, 0);
 | 
				
			||||||
 | 
					        vset_info(x, 0);
 | 
				
			||||||
 | 
					        vset_rbtree_print(x, 0, 0);
 | 
				
			||||||
 | 
					        psleep(100000);
 | 
				
			||||||
 | 
					        fputs("\e[u\e[J", stdout);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										20
									
								
								tests/src/set/src/plug.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								tests/src/set/src/plug.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					/* This software is licensed by the MIT License, see LICENSE file */
 | 
				
			||||||
 | 
					/*                                Copyright © 2022 Gregory Lirent */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "../../../../src/__internal/include.h"
 | 
				
			||||||
 | 
					#include "../../../include/random.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					vtype_string* string_duplicate(const vtype_string* x) { return 0; }
 | 
				
			||||||
 | 
					vtype_array*  array_duplicate (const vtype_array*  x) { return 0; }
 | 
				
			||||||
 | 
					vtype_list*   list_duplicate  (const vtype_list*   x) { return 0; }
 | 
				
			||||||
 | 
					vtype_map*    map_duplicate   (const vtype_map*    x) { return 0; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void string_free(vtype_string* x) {}
 | 
				
			||||||
 | 
					void array_free (vtype_array*  x) {}
 | 
				
			||||||
 | 
					void list_free  (vtype_list*   x) {}
 | 
				
			||||||
 | 
					void map_free   (vtype_map*    x) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int string_compare(const vtype_string* s0, const vtype_string* s1) { return random_int8(); }
 | 
				
			||||||
 | 
					int array_compare (const vtype_array*  s0, const vtype_array*  s1) { return random_int8(); }
 | 
				
			||||||
 | 
					int list_compare  (const vtype_list*   s0, const vtype_list*   s1) { return random_int8(); }
 | 
				
			||||||
 | 
					int map_compare   (const vtype_map*    s0, const vtype_map*    s1) { return random_int8(); }
 | 
				
			||||||
							
								
								
									
										52
									
								
								tests/src/set/src/random.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								tests/src/set/src/random.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					/* This software is licensed by the MIT License, see LICENSE file */
 | 
				
			||||||
 | 
					/*                                Copyright © 2022 Gregory Lirent */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "../plug.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int remove_callback(const void* v, vtype t, void* _) {
 | 
				
			||||||
 | 
					    struct { size_t n; set_t* x; unsigned int hp; } *d = _;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!d->n--) {
 | 
				
			||||||
 | 
					        print_container_value(0, v, t, 0, d->hp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (libcdsb_vset_find(d->x, v, t, 0, 0, 1) == 0) {
 | 
				
			||||||
 | 
					            printf("\e[%dG\e[32;1mSUCCESS\e[m\n", d->hp+1);
 | 
				
			||||||
 | 
					        } else printf("\e[%dG\e[31;1mFAILURE\e[m\n", d->hp+1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return -2;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void vset_push_random(set_t* x, _Bool silent, unsigned int hpos) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    value_t v = random_value();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!silent) {
 | 
				
			||||||
 | 
					        printf("\e[%dG\e[36mUpdate value in set (\e[m\e[32;1m%s\e[m\e[36m):\e[m\n", hpos+1, vtype_name(x->type));
 | 
				
			||||||
 | 
					        print_container_value(0, v.value, v.type, 1, hpos);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (libcdsb_vset_insert(x, v.value, v.type)) {
 | 
				
			||||||
 | 
					        if (!silent) printf("\e[%dG\e[32;1mSUCCESS\e[m\n", hpos+1);
 | 
				
			||||||
 | 
					    } else if (!silent) printf("\e[%dG\e[31;1mFAILURE\e[m\n", hpos+1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!silent) put_separator(0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void vset_remove_random(set_t* x, _Bool silent, unsigned int hpos) {
 | 
				
			||||||
 | 
					    struct { size_t n; set_t* x; unsigned int hp; } d = { .n = vset_size(x), .x = x, .hp = hpos };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!silent)
 | 
				
			||||||
 | 
					        printf("\e[%dG\e[36mTry to remove value from set (\e[m\e[32;1m%s\e[m\e[36m):\e[m\n", hpos+1, libcdsb_vtype_name(x->type));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (d.n) {
 | 
				
			||||||
 | 
					        d.n = random_uint32()%d.n;
 | 
				
			||||||
 | 
					        vset_foreach(x, &d, remove_callback);
 | 
				
			||||||
 | 
					    } else if (!silent) {
 | 
				
			||||||
 | 
					        printf("\e[%dG\e[32;1m\nFAILURE\e[m\n", hpos+1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!silent) put_separator(hpos);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user