示例#1
0
static void
test_rb(void) {
    //rbtree *tr = rb_cnew( 0, 0, 0, 0, 0, 0);
    rbtree *tr = rb_new();
    char keybuf[100];
    size_t valuebuf[] = { 1 };
    size_t *vp;
//    while (fscanf(stdin, "%s", keybuf) == 1) {
//        vp = rb_get(tr, keybuf);
//        if (vp)
//            *vp += 1;
//        else
//            rb_add(tr, keybuf, valuebuf);
//    }
//    this is another faster version
    while (fscanf(stdin, "%s", keybuf) == 1) {
        vp = rb_fget(tr, keybuf);
        *vp += 1;
    }
    rb_set(tr, "a", valuebuf);
    *valuebuf = 123456789;
    rb_add(tr, "b", valuebuf);
    *valuebuf = 2;
    rb_set(tr, "c", valuebuf);
    rb_set(tr, "d", valuebuf);
    *valuebuf = 987654321;
    rb_update(tr,"a",valuebuf);
    rb_set(tr, "e", valuebuf);

    rb_print(tr);
    rb_clear(tr);
    rb_clear(tr); //just for test
    rb_free(tr);
}
示例#2
0
文件: median.c 项目: elvinxiao/dml
void m_clear(MTrace * m){
    if (m->rb1){
        rb_clear(m->rb1);
    }
    if (m->rb2){
        rb_clear(m->rb2);
    }
    m->left_max  = NULL;
    m->right_min = NULL;
    m->cnt1 = m->cnt2 = 0;
}
示例#3
0
文件: rbtree.c 项目: elvinxiao/dml
/* -----------------------------------------------
 * brief : free the data space and tree node space
 *         destory the tree
 *         you can not use this tree again
 *         set tree to NULL after call rb_free!!! 
 * para t: rb tree
 * ----------------------------------------------- */
void rb_free(RBTree * t){
    if (!t) return ;
    rb_clear(t);
    free(t->rb_node_space);
    free(t->nil);
    t->root = t->nil = NULL;
    free(t);
}
END_TEST


START_TEST (test_clear)
{
    rb_append(rb, sample16, 16);
    ck_assert(rb_is_full(rb));

    rb_clear(rb);
    ck_assert(rb_is_empty(rb));
}
示例#5
0
文件: test-rbtree.c 项目: yanyg/ycc
int main()
{
	int i, val;
	struct node *p;
	struct rb_node *rb_node;

	RB_DECLARE(rb);

	srand( (unsigned int)time(NULL) );

	for (i = 0; i < 1024*1024; ++i) {
		p = node_alloc(rand()%100 + 100);
		rb_insert(&p->rb_node, &rb, compare_link, NULL);
	}

#ifndef NDEBUG
	printf("height: {%zu, %zu}\n", rb_height_min(&rb), rb_height_max(&rb));
#endif

	rb_node = rb_first(&rb);
	if (rb_node) {
		val = rb_entry(rb_node, struct node, rb_node)->val;
		rb_node = rb_next(rb_node);

		while (rb_node) {
			register int val_new = rb_entry(rb_node, struct node, rb_node)->val;
			if (val > val_new) {
				printf("error: %d, %d\n", val, val_new);
			}
			rb_node = rb_next(rb_node);
		}
	}
	rb_node = rb_first(&rb);
	printf("1 node_cnt: %d\n", node_cnt);
	i = 105;
	rb_erase_equal(&rb, compare, destroy, &i, NULL);
	printf("2 node_cnt: %d\n", node_cnt);
	rb_clear(&rb, destroy, NULL);
	printf("3 node_cnt: %d\n", node_cnt);
	rb_node = rb_first(&rb);
	if (rb_node) {
		printf("error: rb_node should be null\n");
	}


	return 0;
}
示例#6
0
文件: main.c 项目: godspeed1989/misc
int main()
{
	int i;
	rb_tree_t tree;
	rb_node_t *node;
	rb_tree_create(&tree, NULL);

	for (i = 0; i < MAX; i++)
		rb_insert(&tree, i, NULL);
	rb_clear(&tree);
	for (i = 0; i < MAX; i+=2)
		rb_insert(&tree, i, NULL);
	for (i = 0; i < MAX; i+=4)
	{
		node = rb_find(&tree, i);
		rb_delete(&tree, node, FALSE);
	}

	rb_tree_destroy(&tree);
	return 0;
}
int buffering_flush(neo4j_iostream_t *stream)
{
    struct buffering_iostream *ios = container_of(stream,
            struct buffering_iostream, _iostream);
    if (ios->delegate == NULL)
    {
        errno = EPIPE;
        return -1;
    }
    if (!rb_is_empty(ios->sndbuf))
    {
        struct iovec iov[2];
        unsigned int iovcnt = rb_data_iovec(ios->sndbuf, iov,
                rb_size(ios->sndbuf));
        size_t written;
        if (neo4j_ios_writev_all(ios->delegate, iov, iovcnt, &written))
        {
            rb_discard(ios->sndbuf, written);
            return -1;
        }
        rb_clear(ios->sndbuf);
    }
    return neo4j_ios_flush(ios->delegate);
}
示例#8
0
ICACHE_FLASH_ATTR
void parser_reset(parser *p) {
    rb_clear(p->buffer);
    p->state = PS_READY_FOR_COMMAND;
}
示例#9
0
文件: test.cpp 项目: nicreve/tools
int main(int argc, char *argv[])
{
    irb_tree_t irb_tree;
    irb_node_t *node;
    unsigned int key;
    #if 0
    for (int i = 0; i < KEY_POOL_CAPS; ++i) {
add_key:
        key = arc4random();
        for (int j = i - 1; j >= 0; j--) {
            if (key == key_pool[j]) {
                goto add_key;
            }
        }
        key_pool[i] = key;
    }
#else
    unsigned int j = 0;
    for (int i = 0; i < KEY_POOL_CAPS; ++i, ++j) {
add_key:
        if (arc4random() % 10 == 0) {
            ++j;
        }
        key_pool[i] = j;
    }
    unsigned int a, b;
    for (int i = 0; i < 30000; ++i) {
        do {
            a = arc4random() % KEY_POOL_CAPS;
            b = arc4random() % KEY_POOL_CAPS;
        } while (a == b);
        unsigned int tmp = key_pool[a];
        key_pool[a] = key_pool[b];
        key_pool[b] = tmp;
    }
#endif
    printf("Key pool init.\n");

    struct timeval rb1,rb2,rb3;

    irb_tree_init(&irb_tree, data_compare, data_destroy);
    gettimeofday(&rb1, NULL);
    for (int i = 0; i < KEY_POOL_CAPS; ++i) {
        data_node_t *data = (data_node_t *)malloc(sizeof(*data));
        data->key = key_pool[i];
        irb_insert(&(data->irb_node), &irb_tree);
    }
    gettimeofday(&rb2, NULL);
    timersub(&rb2, &rb1, &rb3);
    printf("IRBT INSERT %ld secs, %ld msecs.\n", rb3.tv_sec, rb3.tv_usec);
    printf("Min:%u\n", 
        irb_entry(irb_first(&irb_tree), data_node_t, irb_node)->key);
    printf("Max:%u\n", 
        irb_entry(irb_last(&irb_tree), data_node_t, irb_node)->key);
    
    gettimeofday(&rb1, NULL);
    irb_clear(&irb_tree);
    gettimeofday(&rb2, NULL);
    timersub(&rb2, &rb1, &rb3);
    printf("IRBT CLEAR %ld secs, %ld msecs.\n", rb3.tv_sec, rb3.tv_usec);

    rb_tree_t rb_tree;
    rb_tree_init(&rb_tree, data_compare2, data_destroy2);
    gettimeofday(&rb1, NULL);
    for (int i = 0; i < KEY_POOL_CAPS; ++i) {
        unsigned int *data = (unsigned int *)malloc(sizeof(unsigned int));
        *data = key_pool[i];
        rb_insert(data, &rb_tree);
    }
    gettimeofday(&rb2, NULL);
    timersub(&rb2, &rb1, &rb3);
    printf("RBT INSERT %ld secs, %ld msecs.\n", rb3.tv_sec, rb3.tv_usec);
    printf("Min:%u\n", 
        *(static_cast<unsigned int *>(rb_first(&rb_tree)->data)));
    printf("Max:%u\n", 
        *(static_cast<unsigned int *>(rb_last(&rb_tree)->data)));
    
    gettimeofday(&rb1, NULL);
    rb_clear(&rb_tree);
    gettimeofday(&rb2, NULL);
    timersub(&rb2, &rb1, &rb3);
    printf("RBT CLEAR %ld secs, %ld msecs.\n", rb3.tv_sec, rb3.tv_usec);


    std::set<unsigned int> rb_set;
    gettimeofday(&rb1, NULL);
    for (int i = 0; i < KEY_POOL_CAPS; ++i) {
        rb_set.insert(key_pool[i]);
    }
    gettimeofday(&rb2, NULL);
    timersub(&rb2, &rb1, &rb3);
    printf("RBSET INSERT %ld secs, %ld msecs.\n", rb3.tv_sec, rb3.tv_usec);
    gettimeofday(&rb1, NULL);
    rb_set.clear();
    gettimeofday(&rb2, NULL);
    timersub(&rb2, &rb1, &rb3);
    printf("RBSET CLEAR %ld secs, %ld msecs.\n", rb3.tv_sec, rb3.tv_usec);

    return 0;
}
示例#10
0
文件: test.cpp 项目: nicreve/tools
int main(int argc, char *argv[])
{
    rb_tree_t rb_tree;
    rb_node_t *node;
    unsigned int key_pool[KEY_POOL_CAPS];
    unsigned int key;
    for (int i = 0; i < KEY_POOL_CAPS; ++i) {
add_key:
        key = arc4random() % 3000;
        for (int j = i - 1; j >= 0; j--) {
            if (key == key_pool[j]) {
                goto add_key;
            }
        }
        key_pool[i] = key;
        printf("Add %u into key pool.\n", key_pool[i]);
    }
    
    rb_tree_init(&rb_tree, data_compare, data_destroy);
redo:
    for (int i = 0; i < KEY_POOL_CAPS; ++i) {
        data_node_t *data = (data_node_t *)malloc(sizeof(*data));
        data->key = key_pool[i];
        if (rb_insert(&(data->rb_node), &rb_tree)) {
            printf("Key %u already exist.\n", data->key);
        } else {
            printf("Add %u into tree.\n", data->key);
        }
    }
    printf("INIT: ************\n");
    printf("Min:%u\n", 
        rb_entry(rb_first(&rb_tree), data_node_t, rb_node)->key);
    printf("Max:%u\n", 
        rb_entry(rb_last(&rb_tree), data_node_t, rb_node)->key);
    printf("Trav with rb_next:\n");
    node = rb_first(&rb_tree);
    while (node) {
        printf("%u, ",rb_entry(node, data_node_t, rb_node)->key); 
        node = rb_next(node);
    }
    printf("\n");
    printf("Trav with rb_prev:\n");
    node = rb_last(&rb_tree);
    while (node) {
        printf("%u, ",rb_entry(node, data_node_t, rb_node)->key); 
        node = rb_prev(node);
    }
    printf("\n");

    printf("ERASE: ************\n");
    data_node_t search_node;
    for (int i = 0; i < 5; i++) {
        unsigned int j = arc4random() % KEY_POOL_CAPS;
        search_node.key = key_pool[j];
        rb_node_t *to_remove = rb_find(&(search_node.rb_node), &rb_tree);
        if (to_remove) {
            printf("Remove %u from tree.\n", search_node.key);
            rb_remove(to_remove, &rb_tree);
            free(rb_entry(to_remove, data_node_t, rb_node));
        } else {
            printf("Key %u not in tree.\n", search_node.key);
        }
    }
    printf("PRINT: ************\n");
    printf("Min:%u\n", 
        rb_entry(rb_first(&rb_tree), data_node_t, rb_node)->key);
    printf("Max:%u\n", 
        rb_entry(rb_last(&rb_tree), data_node_t, rb_node)->key);
    printf("Trav with rb_next:\n");
    node = rb_first(&rb_tree);
    while (node) {
        printf("%u, ",rb_entry(node, data_node_t, rb_node)->key); 
        node = rb_next(node);
    }
    printf("\n");
    printf("Trav with rb_prev:\n");
    node = rb_last(&rb_tree);
    while (node) {
        printf("%u, ",rb_entry(node, data_node_t, rb_node)->key); 
        node = rb_prev(node);
    }
    printf("\n");
    rb_clear(&rb_tree);
    printf("PRINT2: ************\n");
    node = rb_first(&rb_tree);
    if (node) {
        printf("Min:%u\n", 
        rb_entry(node, data_node_t, rb_node)->key);
    }

    node = rb_last(&rb_tree);
    if (node) {
        printf("Max:%u\n", 
        rb_entry(node, data_node_t, rb_node)->key);
    }
    printf("Trav with rb_next:\n");
    node = rb_first(&rb_tree);
    while (node) {
        printf("%u, ",rb_entry(node, data_node_t, rb_node)->key); 
        node = rb_next(node);
    }
    printf("\n");
    printf("Trav with rb_prev:\n");
    node = rb_last(&rb_tree);
    while (node) {
        printf("%u, ",rb_entry(node, data_node_t, rb_node)->key); 
        node = rb_prev(node);
    }
    printf("\n");
    goto redo;
    return 0;
}
ssize_t buffering_writev(neo4j_iostream_t *stream,
        const struct iovec *iov, unsigned int iovcnt)
{
    struct buffering_iostream *ios = container_of(stream,
            struct buffering_iostream, _iostream);
    if (ios->delegate == NULL)
    {
        errno = EPIPE;
        return -1;
    }
    if (ios->sndbuf == NULL)
    {
        return neo4j_ios_writev(ios->delegate, iov, iovcnt);
    }
    if (iovcnt > IOV_MAX-2)
    {
        iovcnt = IOV_MAX-2;
    }

    size_t nbyte = iovlen(iov, iovcnt);

    if (nbyte <= rb_space(ios->sndbuf))
    {
        return rb_appendv(ios->sndbuf, iov, iovcnt);
    }

    size_t buffered = rb_used(ios->sndbuf);

    ALLOC_IOVEC(diov, iovcnt+2);
    if (diov == NULL)
    {
        return -1;
    }
    unsigned int diovcnt = rb_data_iovec(ios->sndbuf, diov,
            rb_size(ios->sndbuf));
    memcpy(diov+diovcnt, iov, iovcnt * sizeof(struct iovec));

    ssize_t written = neo4j_ios_writev(ios->delegate, diov, diovcnt + iovcnt);
    if (written < 0)
    {
        goto cleanup;
    }

    if ((size_t)written < buffered)
    {
        rb_discard(ios->sndbuf, written);
        memcpy(diov, iov, iovcnt * sizeof(struct iovec));
        diovcnt = iovcnt;
        written = 0;
    }
    else
    {
        rb_clear(ios->sndbuf);
        written -= buffered;
        assert((size_t)written <= nbyte);
        diovcnt = iov_skip(diov, iov, iovcnt, written);
    }

    if (diovcnt == 0)
    {
        written = nbyte;
        goto cleanup;
    }

    written += rb_appendv(ios->sndbuf, diov, diovcnt);

    int errsv;
cleanup:
    errsv = errno;
    FREE_IOVEC(diov);
    errno = errsv;
    return written;
}
ssize_t buffering_write(neo4j_iostream_t *stream, const void *buf, size_t nbyte)
{
    struct buffering_iostream *ios = container_of(stream,
            struct buffering_iostream, _iostream);
    if (ios->delegate == NULL)
    {
        errno = EPIPE;
        return -1;
    }
    if (ios->sndbuf == NULL)
    {
        return neo4j_ios_write(ios->delegate, buf, nbyte);
    }
    if (nbyte > SSIZE_MAX)
    {
        nbyte = SSIZE_MAX;
    }

    if (nbyte <= rb_space(ios->sndbuf))
    {
        return rb_append(ios->sndbuf, buf, nbyte);
    }

    size_t buffered = rb_used(ios->sndbuf);

    struct iovec iov[3];
    unsigned int iovcnt = rb_data_iovec(ios->sndbuf, iov, rb_size(ios->sndbuf));
    iov[iovcnt].iov_base = (uint8_t *)(intptr_t)buf;
    iov[iovcnt].iov_len = nbyte;
    ++iovcnt;

    ssize_t written = neo4j_ios_writev(ios->delegate, iov, iovcnt);
    if (written < 0)
    {
        return -1;
    }

    const uint8_t *rbytes;
    size_t remaining;

    if ((size_t)written < buffered)
    {
        rb_discard(ios->sndbuf, written);
        rbytes = buf;
        remaining = nbyte;
        written = 0;
    }
    else
    {
        rb_clear(ios->sndbuf);
        written -= buffered;
        assert((size_t)written <= nbyte);
        rbytes = (const uint8_t *)buf + written;
        remaining = nbyte - written;
    }

    if (remaining == 0)
    {
        return nbyte;
    }

    size_t appended = rb_append(ios->sndbuf, rbytes, remaining);
    return (size_t)written + appended;
}