Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/adt/btree.c

    ra35b458 r1b20da0  
    8383{
    8484        unsigned int i;
    85 
     85       
    8686        node->keys = 0;
    87 
     87       
    8888        /* Clean also space for the extra key. */
    8989        for (i = 0; i < BTREE_MAX_KEYS + 1; i++) {
     
    9292                node->subtree[i] = NULL;
    9393        }
    94 
     94       
    9595        node->subtree[i] = NULL;
    9696        node->parent = NULL;
    97 
     97       
    9898        link_initialize(&node->leaf_link);
    9999        link_initialize(&node->bfs_link);
     
    122122{
    123123        size_t i;
    124 
     124       
    125125        if (root->keys) {
    126126                for (i = 0; i < root->keys + 1; i++) {
     
    129129                }
    130130        }
    131 
     131       
    132132        slab_free(btree_node_cache, root);
    133133}
     
    156156{
    157157        size_t i;
    158 
     158       
    159159        for (i = 0; i < node->keys; i++) {
    160160                if (key < node->key[i]) {
    161161                        size_t j;
    162 
     162                       
    163163                        for (j = node->keys; j > i; j--) {
    164164                                node->key[j] = node->key[j - 1];
     
    166166                                node->subtree[j + 1] = node->subtree[j];
    167167                        }
    168 
     168                       
    169169                        break;
    170170                }
    171171        }
    172 
     172       
    173173        node->key[i] = key;
    174174        node->value[i] = value;
     
    191191{
    192192        size_t i;
    193 
     193       
    194194        for (i = 0; i < node->keys + 1; i++) {
    195195                if (subtree == node->subtree[i])
    196196                        return i - (int) (right != false);
    197197        }
    198 
     198       
    199199        panic("Node %p does not contain subtree %p.", node, subtree);
    200200}
     
    215215        size_t i;
    216216        size_t j;
    217 
     217       
    218218        for (i = 0; i < node->keys; i++) {
    219219                if (key == node->key[i]) {
     
    223223                                node->subtree[j - 1] = node->subtree[j];
    224224                        }
    225 
     225                       
    226226                        node->subtree[j - 1] = node->subtree[j];
    227227                        node->keys--;
    228 
     228                       
    229229                        return;
    230230                }
    231231        }
    232 
     232       
    233233        panic("Node %p does not contain key %" PRIu64 ".", node, key);
    234234}
     
    248248{
    249249        size_t i, j;
    250 
     250       
    251251        for (i = 0; i < node->keys; i++) {
    252252                if (key == node->key[i]) {
     
    256256                                node->subtree[j] = node->subtree[j + 1];
    257257                        }
    258 
     258                       
    259259                        node->keys--;
    260260                        return;
    261261                }
    262262        }
    263 
     263       
    264264        panic("Node %p does not contain key %" PRIu64 ".", node, key);
    265265}
     
    280280{
    281281        size_t i;
    282 
     282       
    283283        for (i = 0; i < node->keys; i++) {
    284284                if (key < node->key[i]) {
    285285                        size_t j;
    286 
     286                       
    287287                        for (j = node->keys; j > i; j--) {
    288288                                node->key[j] = node->key[j - 1];
     
    290290                                node->subtree[j + 1] = node->subtree[j];
    291291                        }
    292 
     292                       
    293293                        node->subtree[j + 1] = node->subtree[j];
    294294                        break;
    295295                }
    296296        }
    297 
     297       
    298298        node->key[i] = key;
    299299        node->value[i] = value;
    300300        node->subtree[i] = lsubtree;
    301 
     301       
    302302        node->keys++;
    303303}
     
    320320{
    321321        btree_key_t key = lnode->key[lnode->keys - 1];
    322 
     322       
    323323        if (LEAF_NODE(lnode)) {
    324324                void *value = lnode->value[lnode->keys - 1];
    325 
     325               
    326326                node_remove_key_and_rsubtree(lnode, key);
    327327                node_insert_key_and_lsubtree(rnode, key, value, NULL);
     
    329329        } else {
    330330                btree_node_t *rsubtree = lnode->subtree[lnode->keys];
    331 
     331               
    332332                node_remove_key_and_rsubtree(lnode, key);
    333333                node_insert_key_and_lsubtree(rnode, lnode->parent->key[idx], NULL, rsubtree);
    334334                lnode->parent->key[idx] = key;
    335 
     335               
    336336                /* Fix parent link of the reconnected right subtree. */
    337337                rsubtree->parent = rnode;
     
    356356{
    357357        btree_key_t key = rnode->key[0];
    358 
     358       
    359359        if (LEAF_NODE(rnode)) {
    360360                void *value = rnode->value[0];
    361 
     361               
    362362                node_remove_key_and_lsubtree(rnode, key);
    363363                node_insert_key_and_rsubtree(lnode, key, value, NULL);
     
    365365        } else {
    366366                btree_node_t *lsubtree = rnode->subtree[0];
    367 
     367               
    368368                node_remove_key_and_lsubtree(rnode, key);
    369369                node_insert_key_and_rsubtree(lnode, rnode->parent->key[idx], NULL, lsubtree);
    370370                rnode->parent->key[idx] = key;
    371 
     371               
    372372                /* Fix parent link of the reconnected left subtree. */
    373373                lsubtree->parent = lnode;
     
    395395        size_t idx;
    396396        btree_node_t *lnode;
    397 
     397       
    398398        /*
    399399         * If this is root node, the rotation can not be done.
     
    401401        if (ROOT_NODE(node))
    402402                return false;
    403 
     403       
    404404        idx = find_key_by_subtree(node->parent, node, true);
    405405        if ((int) idx == -1) {
     
    410410                return false;
    411411        }
    412 
     412       
    413413        lnode = node->parent->subtree[idx];
    414414        if (lnode->keys < BTREE_MAX_KEYS) {
     
    420420                return true;
    421421        }
    422 
     422       
    423423        return false;
    424424}
     
    444444        size_t idx;
    445445        btree_node_t *rnode;
    446 
     446       
    447447        /*
    448448         * If this is root node, the rotation can not be done.
     
    450450        if (ROOT_NODE(node))
    451451                return false;
    452 
     452       
    453453        idx = find_key_by_subtree(node->parent, node, false);
    454454        if (idx == node->parent->keys) {
     
    459459                return false;
    460460        }
    461 
     461       
    462462        rnode = node->parent->subtree[idx + 1];
    463463        if (rnode->keys < BTREE_MAX_KEYS) {
     
    469469                return true;
    470470        }
    471 
     471       
    472472        return false;
    473473}
     
    499499        size_t i;
    500500        size_t j;
    501 
     501       
    502502        assert(median);
    503503        assert(node->keys == BTREE_MAX_KEYS);
    504 
     504       
    505505        /*
    506506         * Use the extra space to store the extra node.
    507507         */
    508508        node_insert_key_and_rsubtree(node, key, value, rsubtree);
    509 
     509       
    510510        /*
    511511         * Compute median of keys.
    512512         */
    513513        *median = MEDIAN_HIGH(node);
    514 
     514       
    515515        /*
    516516         * Allocate and initialize new right sibling.
     
    520520        rnode->parent = node->parent;
    521521        rnode->depth = node->depth;
    522 
     522       
    523523        /*
    524524         * Copy big keys, values and subtree pointers to the new right sibling.
     
    530530                rnode->value[j] = node->value[i];
    531531                rnode->subtree[j] = node->subtree[i];
    532 
     532               
    533533                /*
    534534                 * Fix parent links in subtrees.
     
    537537                        rnode->subtree[j]->parent = rnode;
    538538        }
    539 
     539       
    540540        rnode->subtree[j] = node->subtree[i];
    541541        if (rnode->subtree[j])
    542542                rnode->subtree[j]->parent = rnode;
    543 
     543       
    544544        rnode->keys = j;  /* Set number of keys of the new node. */
    545545        node->keys /= 2;  /* Shrink the old node. */
    546 
     546       
    547547        return rnode;
    548548}
     
    578578                btree_node_t *rnode;
    579579                btree_key_t median;
    580 
     580               
    581581                /*
    582582                 * Node is full and both siblings (if both exist) are full too.
     
    584584                 * bigger keys (i.e. the new node) into its parent.
    585585                 */
    586 
     586               
    587587                rnode = node_split(node, key, value, rsubtree, &median);
    588 
     588               
    589589                if (LEAF_NODE(node)) {
    590590                        list_insert_after(&rnode->leaf_link, &node->leaf_link);
    591591                }
    592 
     592               
    593593                if (ROOT_NODE(node)) {
    594594                        /*
     
    599599                        rnode->parent = t->root;
    600600                        node_initialize(t->root);
    601 
     601                       
    602602                        /*
    603603                         * Left-hand side subtree will be the old root (i.e. node).
     
    605605                         */
    606606                        t->root->subtree[0] = node;
    607 
     607                       
    608608                        t->root->depth = node->depth + 1;
    609609                }
     
    624624{
    625625        btree_node_t *lnode;
    626 
     626       
    627627        assert(value);
    628 
     628       
    629629        lnode = leaf_node;
    630630        if (!lnode) {
     
    632632                        panic("B-tree %p already contains key %" PRIu64 ".", t, key);
    633633        }
    634 
     634       
    635635        _btree_insert(t, key, value, NULL, lnode);
    636636}
     
    648648        size_t idx;
    649649        btree_node_t *lnode;
    650 
     650       
    651651        /*
    652652         * If this is root node, the rotation can not be done.
     
    654654        if (ROOT_NODE(rnode))
    655655                return false;
    656 
     656       
    657657        idx = find_key_by_subtree(rnode->parent, rnode, true);
    658658        if ((int) idx == -1) {
     
    663663                return false;
    664664        }
    665 
     665       
    666666        lnode = rnode->parent->subtree[idx];
    667667        if (lnode->keys > FILL_FACTOR) {
     
    669669                return true;
    670670        }
    671 
     671       
    672672        return false;
    673673}
     
    685685        size_t idx;
    686686        btree_node_t *rnode;
    687 
     687       
    688688        /*
    689689         * If this is root node, the rotation can not be done.
     
    691691        if (ROOT_NODE(lnode))
    692692                return false;
    693 
     693       
    694694        idx = find_key_by_subtree(lnode->parent, lnode, false);
    695695        if (idx == lnode->parent->keys) {
     
    700700                return false;
    701701        }
    702 
     702       
    703703        rnode = lnode->parent->subtree[idx + 1];
    704704        if (rnode->keys > FILL_FACTOR) {
     
    706706                return true;
    707707        }
    708 
     708       
    709709        return false;
    710710}
     
    724724        btree_node_t *rnode;
    725725        size_t i;
    726 
     726       
    727727        assert(!ROOT_NODE(node));
    728 
     728       
    729729        idx = find_key_by_subtree(node->parent, node, false);
    730730        if (idx == node->parent->keys) {
     
    737737        } else
    738738                rnode = node->parent->subtree[idx + 1];
    739 
     739       
    740740        /* Index nodes need to insert parent node key in between left and right node. */
    741741        if (INDEX_NODE(node))
    742742                node->key[node->keys++] = node->parent->key[idx];
    743 
     743       
    744744        /* Copy the key-value-subtree triplets from the right node. */
    745745        for (i = 0; i < rnode->keys; i++) {
    746746                node->key[node->keys + i] = rnode->key[i];
    747747                node->value[node->keys + i] = rnode->value[i];
    748 
     748               
    749749                if (INDEX_NODE(node)) {
    750750                        node->subtree[node->keys + i] = rnode->subtree[i];
     
    752752                }
    753753        }
    754 
     754       
    755755        if (INDEX_NODE(node)) {
    756756                node->subtree[node->keys + i] = rnode->subtree[i];
    757757                rnode->subtree[i]->parent = node;
    758758        }
    759 
     759       
    760760        node->keys += rnode->keys;
    761761        return rnode;
     
    789789                        node_remove_key_and_rsubtree(node, key);
    790790                }
    791 
     791               
    792792                return;
    793793        }
    794 
     794       
    795795        if (node->keys <= FILL_FACTOR) {
    796796                /*
     
    801801                        try_rotation_from_right(node);
    802802        }
    803 
     803       
    804804        if (node->keys > FILL_FACTOR) {
    805805                size_t i;
    806 
     806               
    807807                /*
    808808                 * The key can be immediately removed.
     
    813813                 */
    814814                node_remove_key_and_rsubtree(node, key);
    815 
     815               
    816816                for (i = 0; i < node->parent->keys; i++) {
    817817                        if (node->parent->key[i] == key)
     
    822822                btree_node_t *rnode;
    823823                btree_node_t *parent;
    824 
     824               
    825825                /*
    826826                 * The node is below the fill factor as well as its left and right sibling.
     
    832832                node_remove_key_and_rsubtree(node, key);
    833833                rnode = node_combine(node);
    834 
     834               
    835835                if (LEAF_NODE(rnode))
    836836                        list_remove(&rnode->leaf_link);
    837 
     837               
    838838                idx = find_key_by_subtree(parent, rnode, true);
    839839                assert((int) idx != -1);
     
    855855{
    856856        btree_node_t *lnode;
    857 
     857       
    858858        lnode = leaf_node;
    859859        if (!lnode) {
     
    861861                        panic("B-tree %p does not contain key %" PRIu64 ".", t, key);
    862862        }
    863 
     863       
    864864        _btree_remove(t, key, lnode);
    865865}
     
    877877{
    878878        btree_node_t *cur, *next;
    879 
     879       
    880880        /*
    881881         * Iteratively descend to the leaf that can contain the searched key.
     
    887887                 */
    888888                *leaf_node = cur;
    889 
     889               
    890890                if (cur->keys == 0)
    891891                        return NULL;
     
    901901                        void *val;
    902902                        size_t i;
    903 
     903                       
    904904                        /*
    905905                         * Now if the key is smaller than cur->key[i]
     
    911911                                        next = cur->subtree[i];
    912912                                        val = cur->value[i - 1];
    913 
     913                                       
    914914                                        if (LEAF_NODE(cur))
    915915                                                return key == cur->key[i - 1] ? val : NULL;
    916 
     916                                       
    917917                                        goto descend;
    918918                                }
    919919                        }
    920 
     920                       
    921921                        /*
    922922                         * Last possibility is that the key is
     
    925925                        next = cur->subtree[i];
    926926                        val = cur->value[i - 1];
    927 
     927                       
    928928                        if (LEAF_NODE(cur))
    929929                                return key == cur->key[i - 1] ? val : NULL;
     
    932932                ;
    933933        }
    934 
     934       
    935935        /*
    936936         * The key was not found in the *leaf_node and
     
    952952{
    953953        assert(LEAF_NODE(node));
    954 
     954       
    955955        if (node->leaf_link.prev != &t->leaf_list.head)
    956956                return list_get_instance(node->leaf_link.prev, btree_node_t, leaf_link);
     
    971971{
    972972        assert(LEAF_NODE(node));
    973 
     973       
    974974        if (node->leaf_link.next != &t->leaf_list.head)
    975975                return list_get_instance(node->leaf_link.next, btree_node_t, leaf_link);
     
    988988        int depth = t->root->depth;
    989989        list_t list;
    990 
     990       
    991991        printf("Printing B-tree:\n");
    992992        list_initialize(&list);
    993993        list_append(&t->root->bfs_link, &list);
    994 
     994       
    995995        /*
    996996         * Use BFS search to print out the tree.
     
    10001000                link_t *hlp;
    10011001                btree_node_t *node;
    1002 
     1002               
    10031003                hlp = list_first(&list);
    10041004                assert(hlp != NULL);
    10051005                node = list_get_instance(hlp, btree_node_t, bfs_link);
    10061006                list_remove(hlp);
    1007 
     1007               
    10081008                assert(node);
    1009 
     1009               
    10101010                if (node->depth != depth) {
    10111011                        printf("\n");
    10121012                        depth = node->depth;
    10131013                }
    1014 
     1014               
    10151015                printf("(");
    1016 
     1016               
    10171017                for (i = 0; i < node->keys; i++) {
    10181018                        printf("%" PRIu64 "%s", node->key[i], i < node->keys - 1 ? "," : "");
     
    10211021                        }
    10221022                }
    1023 
     1023               
    10241024                if (node->depth && node->subtree[i])
    10251025                        list_append(&node->subtree[i]->bfs_link, &list);
    1026 
     1026               
    10271027                printf(")");
    10281028        }
    1029 
     1029       
    10301030        printf("\n");
    1031 
     1031       
    10321032        printf("Printing list of leaves:\n");
    10331033        list_foreach(t->leaf_list, leaf_link, btree_node_t, node) {
    10341034                assert(node);
    1035 
     1035               
    10361036                printf("(");
    1037 
     1037               
    10381038                for (i = 0; i < node->keys; i++)
    10391039                        printf("%" PRIu64 "%s", node->key[i], i < node->keys - 1 ? "," : "");
    1040 
     1040               
    10411041                printf(")");
    10421042        }
    1043 
     1043       
    10441044        printf("\n");
    10451045}
Note: See TracChangeset for help on using the changeset viewer.