static void hashnode_split(hattrie_t *T, node_ptr parent, node_ptr node) { /* Find split point. */ unsigned left_m, right_m; unsigned char j = hattrie_split_mid(node, &left_m, &right_m); /* now split into two nodes corresponding to ranges [0, j] and * [j + 1, TRIE_MAXCHAR], respectively. */ /* create new left and right nodes * one node may reuse existing if it keeps hybrid flag * hybrid -> pure always needs a new table */ unsigned char c0 = node.b->c0, c1 = node.b->c1; node_ptr left, right; right.b = hhash_create(hashnode_nextsize(right_m)); left.b = hhash_create(hashnode_nextsize(left_m)); /* setup created nodes */ left.b->c0 = c0; left.b->c1 = j; left.b->flag = c0 == j ? NODE_TYPE_PURE_BUCKET : NODE_TYPE_HYBRID_BUCKET; // need to force it right.b->c0 = j + 1; right.b->c1 = c1; right.b->flag = right.b->c0 == right.b->c1 ? NODE_TYPE_PURE_BUCKET : NODE_TYPE_HYBRID_BUCKET; /* update the parent's pointer */ unsigned int c; for (c = c0; c <= j; ++c) parent.t->xs[c] = left; for (; c <= c1; ++c) parent.t->xs[c] = right; /* fill new tables */ hashnode_split_reinsert(T, parent, node); }
/* Split hybrid node - this is similar operation to burst. */ static void hattrie_split_h(node_ptr parent, node_ptr node) { /* Find split point. */ unsigned left_m, right_m; unsigned char j = hattrie_split_mid(node, &left_m, &right_m); /* now split into two node cooresponding to ranges [0, j] and * [j + 1, TRIE_MAXCHAR], respectively. */ /* create new left and right nodes * one node may reuse existing if it keeps hybrid flag * hybrid -> pure always needs a new table */ unsigned char c0 = node.b->c0, c1 = node.b->c1; node_ptr left, right; if (j + 1 == c1) { /* right will be pure */ right.b = ahtable_create(); if (j == c0) { /* left will be pure as well */ left.b = ahtable_create(); } else { /* left will be hybrid */ left.b = node.b; } } else { /* right will be hybrid */ right.b = node.b; left.b = ahtable_create(); } /* setup created nodes */ left.b->c0 = c0; left.b->c1 = j; left.b->flag = c0 == j ? NODE_TYPE_PURE_BUCKET : NODE_TYPE_HYBRID_BUCKET; // need to force it right.b->c0 = j + 1; right.b->c1 = c1; right.b->flag = right.b->c0 == right.b->c1 ? NODE_TYPE_PURE_BUCKET : NODE_TYPE_HYBRID_BUCKET; /* update the parent's pointer */ unsigned int c; for (c = c0; c <= j; ++c) parent.t->xs[c] = left; for (; c <= c1; ++c) parent.t->xs[c] = right; /* fill new tables */ hattrie_split_fill(node, left, right, j); if (node.b != left.b && node.b != right.b) { ahtable_free(node.b); } }