Beispiel #1
0
static int node_apply(node_ptr node, int (*f)(value_t*,void*), void* d)
{
    int result = TRIE_EOK;

    if (*node.flag & NODE_TYPE_TRIE) {
        size_t i;
        for (i = 0; i < NODE_CHILDS; ++i) {
            if (i > 0 && node.t->xs[i].t == node.t->xs[i - 1].t) {
                continue;
            }
            if (node.t->xs[i].t) {
                result = node_apply(node.t->xs[i], f, d);
            }
            if (result == TRIE_EOK && *node.flag & NODE_HAS_VAL) {
                result = f(&node.t->val, d);
            }
            if (result != TRIE_EOK) {
                break;
            }
        }
    }
    else {
        hhash_iter_t i;
        hhash_iter_begin(node.b, &i, false);
        while (!hhash_iter_finished(&i)) {
            result = f(hhash_iter_val(&i), d);
            if (result != TRIE_EOK) {
                break;
            }
            hhash_iter_next(&i);
        }
    }

    return result;
}
Beispiel #2
0
static void node_apply(node_ptr node, void (*f)(value_t*,void*), void* d)
{
    if (*node.flag & NODE_TYPE_TRIE) {
        size_t i;
        for (i = 0; i < NODE_CHILDS; ++i) {
            if (i > 0 && node.t->xs[i].t == node.t->xs[i - 1].t) continue;
            if (node.t->xs[i].t) node_apply(node.t->xs[i], f, d);
	    if (*node.flag & NODE_HAS_VAL) {
		    f(&node.t->val, d);
	    }
        }
    }
    else {
	    ahtable_iter_t i;
	    ahtable_iter_begin(node.b, &i, false);
	    while (!ahtable_iter_finished(&i)) {
		    f(ahtable_iter_val(&i), d);
		    ahtable_iter_next(&i);
	    }
	    ahtable_iter_free(&i);
    }
}
Beispiel #3
0
int hattrie_apply_rev(hattrie_t* T, int (*f)(value_t*,void*), void* d)
{
    return node_apply(T->root, f, d);
}
Beispiel #4
0
void hattrie_apply_rev(hattrie_t* T, void (*f)(value_t*,void*), void* d)
{
	node_apply(T->root, f, d);
}