<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://vegard.wiki/mediawiki/index.php?action=history&amp;feed=atom&amp;title=B-tree</id>
	<title>B-tree - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://vegard.wiki/mediawiki/index.php?action=history&amp;feed=atom&amp;title=B-tree"/>
	<link rel="alternate" type="text/html" href="http://vegard.wiki/mediawiki/index.php?title=B-tree&amp;action=history"/>
	<updated>2026-08-15T11:37:23Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>http://vegard.wiki/mediawiki/index.php?title=B-tree&amp;diff=311&amp;oldid=prev</id>
		<title>Vegard: make it extra clear that I&#039;m not the author</title>
		<link rel="alternate" type="text/html" href="http://vegard.wiki/mediawiki/index.php?title=B-tree&amp;diff=311&amp;oldid=prev"/>
		<updated>2020-10-29T17:17:20Z</updated>

		<summary type="html">&lt;p&gt;make it extra clear that I&amp;#039;m not the author&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:17, 29 October 2020&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;By [https://twitter.com/pervognsen/ Per Vognsen]:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&quot;C++&quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&quot;C++&quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#include &amp;lt;assert.h&amp;gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#include &amp;lt;assert.h&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;!-- diff cache key mediawiki:diff:1.41:old-310:rev-311:wikidiff2=table:1.13.0:bc2a06be --&gt;
&lt;/table&gt;</summary>
		<author><name>Vegard</name></author>
	</entry>
	<entry>
		<id>http://vegard.wiki/mediawiki/index.php?title=B-tree&amp;diff=310&amp;oldid=prev</id>
		<title>Vegard: make source clearer</title>
		<link rel="alternate" type="text/html" href="http://vegard.wiki/mediawiki/index.php?title=B-tree&amp;diff=310&amp;oldid=prev"/>
		<updated>2020-10-29T17:15:12Z</updated>

		<summary type="html">&lt;p&gt;make source clearer&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:15, 29 October 2020&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 224:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 224:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== See also ===&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* https://gist.github.com/pervognsen/2d48ef9757ee3fd579179239febc817e&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Programming]]&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Programming]]&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Vegard</name></author>
	</entry>
	<entry>
		<id>http://vegard.wiki/mediawiki/index.php?title=B-tree&amp;diff=309&amp;oldid=prev</id>
		<title>Vegard: new page</title>
		<link rel="alternate" type="text/html" href="http://vegard.wiki/mediawiki/index.php?title=B-tree&amp;diff=309&amp;oldid=prev"/>
		<updated>2020-10-29T17:14:20Z</updated>

		<summary type="html">&lt;p&gt;new page&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;assert.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define INLINE inline&lt;br /&gt;
#define CopyMemory memcpy&lt;br /&gt;
#define Allocate malloc&lt;br /&gt;
#define Free free&lt;br /&gt;
#define Assert assert&lt;br /&gt;
&lt;br /&gt;
typedef unsigned int Key;&lt;br /&gt;
typedef unsigned long Value;&lt;br /&gt;
&lt;br /&gt;
// find where to insert the given key to maintain the sorted array&lt;br /&gt;
uint32_t SearchKeys(Key *keys, uint32_t length, Key key)&lt;br /&gt;
{&lt;br /&gt;
    for (uint32_t i = 0; i &amp;lt; length; ++i) {&lt;br /&gt;
        if (key &amp;lt;= keys[i])&lt;br /&gt;
            return i;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return length;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;typename T&amp;gt;&lt;br /&gt;
void Array_Insert(T *array, uint32_t length, uint32_t index, T value)&lt;br /&gt;
{&lt;br /&gt;
    // shift everything up&lt;br /&gt;
    for (uint32_t i = length ; i-- &amp;gt; index; )&lt;br /&gt;
        array[i + 1] = array[i];&lt;br /&gt;
&lt;br /&gt;
    array[index] = value;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;typename T&amp;gt;&lt;br /&gt;
void Array_Delete(T *array, uint32_t length, uint32_t index)&lt;br /&gt;
{&lt;br /&gt;
    // shift everything down&lt;br /&gt;
    for (uint32_t i = index + 1; i &amp;lt; length; ++i)&lt;br /&gt;
        array[i - 1] = array[i];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --- https://gist.github.com/pervognsen/2d48ef9757ee3fd579179239febc817e&lt;br /&gt;
// Per Vognsen, public domain&lt;br /&gt;
&lt;br /&gt;
enum { BMAX = 32, BMIN = BMAX / 2, BHEIGHT = 6 };&lt;br /&gt;
&lt;br /&gt;
struct BNode {&lt;br /&gt;
    uint32_t length;&lt;br /&gt;
    Key keys[BMAX];&lt;br /&gt;
    union {&lt;br /&gt;
        BNode *children[BMAX];&lt;br /&gt;
        Value values[BMAX];&lt;br /&gt;
    };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
static void BNode_Initialize(BNode *node, uint32_t length, Key *keys, void *children) {&lt;br /&gt;
    node-&amp;gt;length = length;&lt;br /&gt;
    CopyMemory(node-&amp;gt;keys, keys, length * sizeof(Key));&lt;br /&gt;
    CopyMemory(node-&amp;gt;children, children, length * sizeof(BNode *));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static BNode *BNode_Create(uint32_t length, Key *keys, void *children) {&lt;br /&gt;
    BNode *node = (BNode *)Allocate(sizeof(BNode));&lt;br /&gt;
    BNode_Initialize(node, length, keys, children);&lt;br /&gt;
    return node;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void BNode_Destroy(BNode *node, uint32_t height) {&lt;br /&gt;
    for (uint32_t index = 0; index &amp;lt; node-&amp;gt;length; index++) {&lt;br /&gt;
        if (height &amp;gt; 1) {&lt;br /&gt;
            BNode_Destroy(node-&amp;gt;children[index], height - 1);&lt;br /&gt;
        }&lt;br /&gt;
        Free(node-&amp;gt;children[index]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static INLINE Key BNode_GetMaxKey(BNode *node) {&lt;br /&gt;
    Assert(node-&amp;gt;length &amp;gt; 0);&lt;br /&gt;
    return node-&amp;gt;keys[node-&amp;gt;length - 1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static BNode *BNodeLeaf_Insert(BNode *leaf, Key key, Value value) {&lt;br /&gt;
    uint32_t index = SearchKeys(leaf-&amp;gt;keys, leaf-&amp;gt;length, key);&lt;br /&gt;
    if (index &amp;lt; leaf-&amp;gt;length &amp;amp;&amp;amp; leaf-&amp;gt;keys[index] == key) {&lt;br /&gt;
        leaf-&amp;gt;values[index] = value;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    BNode *new_sibling = 0;&lt;br /&gt;
    if (leaf-&amp;gt;length == BMAX) {&lt;br /&gt;
        new_sibling = BNode_Create(BMIN, leaf-&amp;gt;keys + BMIN, leaf-&amp;gt;values + BMIN);&lt;br /&gt;
        leaf-&amp;gt;length = BMIN;&lt;br /&gt;
        if (index &amp;gt;= BMIN) {&lt;br /&gt;
            leaf = new_sibling;&lt;br /&gt;
            index -= BMIN;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Array_Insert(leaf-&amp;gt;keys, leaf-&amp;gt;length, index, key);&lt;br /&gt;
    Array_Insert(leaf-&amp;gt;values, leaf-&amp;gt;length, index, value);&lt;br /&gt;
    leaf-&amp;gt;length++;&lt;br /&gt;
    return new_sibling;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static BNode *BNode_Insert(BNode *node, Key key, Value value, uint32_t height) {&lt;br /&gt;
    Assert(height &amp;gt; 0);&lt;br /&gt;
    Assert(node-&amp;gt;length &amp;gt; 0);&lt;br /&gt;
    uint32_t index = SearchKeys(node-&amp;gt;keys, node-&amp;gt;length, key);&lt;br /&gt;
    if (index == node-&amp;gt;length) {&lt;br /&gt;
        index--;&lt;br /&gt;
        node-&amp;gt;keys[index] = key;&lt;br /&gt;
    }&lt;br /&gt;
    BNode *new_child;&lt;br /&gt;
    if (height == 1) {&lt;br /&gt;
        new_child = BNodeLeaf_Insert(node-&amp;gt;children[index], key, value);&lt;br /&gt;
    } else {&lt;br /&gt;
        new_child = BNode_Insert(node-&amp;gt;children[index], key, value, height - 1);&lt;br /&gt;
    }&lt;br /&gt;
    BNode *new_sibling = 0;&lt;br /&gt;
    if (new_child) {&lt;br /&gt;
        if (node-&amp;gt;length == BMAX) {&lt;br /&gt;
            new_sibling = BNode_Create(BMIN, node-&amp;gt;keys + BMIN, node-&amp;gt;children + BMIN);&lt;br /&gt;
            node-&amp;gt;length = BMIN;&lt;br /&gt;
            if (index &amp;gt;= BMIN) {&lt;br /&gt;
                node = new_sibling;&lt;br /&gt;
                index -= BMIN;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        node-&amp;gt;keys[index] = BNode_GetMaxKey(node-&amp;gt;children[index]);&lt;br /&gt;
        Array_Insert(node-&amp;gt;keys, node-&amp;gt;length, index + 1, BNode_GetMaxKey(new_child));&lt;br /&gt;
        Array_Insert(node-&amp;gt;children, node-&amp;gt;length, index + 1, new_child);&lt;br /&gt;
        node-&amp;gt;length++;&lt;br /&gt;
    }&lt;br /&gt;
    return new_sibling;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static bool BNodeLeaf_Delete(BNode *leaf, Key key) {&lt;br /&gt;
    uint32_t index = SearchKeys(leaf-&amp;gt;keys, leaf-&amp;gt;length, key);&lt;br /&gt;
    if (index &amp;lt; leaf-&amp;gt;length &amp;amp;&amp;amp; leaf-&amp;gt;keys[index] == key) {&lt;br /&gt;
        Array_Delete(leaf-&amp;gt;keys, leaf-&amp;gt;length, index);&lt;br /&gt;
        Array_Delete(leaf-&amp;gt;values, leaf-&amp;gt;length, index);&lt;br /&gt;
        leaf-&amp;gt;length--;&lt;br /&gt;
        return leaf-&amp;gt;length == 0;&lt;br /&gt;
    }&lt;br /&gt;
    return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void BNode_Delete(BNode *node, Key key, uint32_t height) {&lt;br /&gt;
    Assert(height &amp;gt; 0);&lt;br /&gt;
    uint32_t index = SearchKeys(node-&amp;gt;keys, node-&amp;gt;length, key);&lt;br /&gt;
    if (index &amp;lt; node-&amp;gt;length) {&lt;br /&gt;
        if (height == 1) {&lt;br /&gt;
            if (BNodeLeaf_Delete(node-&amp;gt;children[index], key) &amp;amp;&amp;amp; node-&amp;gt;length &amp;gt; 1) {&lt;br /&gt;
                Free(node-&amp;gt;children[index]);&lt;br /&gt;
                Array_Delete(node-&amp;gt;keys, node-&amp;gt;length, index);&lt;br /&gt;
                Array_Delete(node-&amp;gt;children, node-&amp;gt;length, index);&lt;br /&gt;
                node-&amp;gt;length--;&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            BNode_Delete(node-&amp;gt;children[index], key, height - 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct BTree {&lt;br /&gt;
    uint32_t height;&lt;br /&gt;
    BNode root;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void BTree_Initialize(BTree *tree) {&lt;br /&gt;
    Assert(BMAX == 2 * BMIN);&lt;br /&gt;
    Assert(sizeof(BNode *) == sizeof(Value));&lt;br /&gt;
    tree-&amp;gt;height = 0;&lt;br /&gt;
    tree-&amp;gt;root.length = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void BTree_Destroy(BTree *tree) {&lt;br /&gt;
    if (tree-&amp;gt;height &amp;gt; 0) {&lt;br /&gt;
        BNode_Destroy(&amp;amp;tree-&amp;gt;root, tree-&amp;gt;height);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Value *BTree_Find(BTree *tree, Key key) {&lt;br /&gt;
    uint32_t height = tree-&amp;gt;height;&lt;br /&gt;
    BNode *node = &amp;amp;tree-&amp;gt;root;&lt;br /&gt;
    for (;;) {&lt;br /&gt;
        uint32_t index = SearchKeys(node-&amp;gt;keys, node-&amp;gt;length, key);&lt;br /&gt;
        if (index == node-&amp;gt;length) {&lt;br /&gt;
            return 0;&lt;br /&gt;
        }&lt;br /&gt;
        if (height == 0) {&lt;br /&gt;
            return (node-&amp;gt;keys[index] == key) ? (node-&amp;gt;values + index) : 0;&lt;br /&gt;
        }&lt;br /&gt;
        height--;&lt;br /&gt;
        node = node-&amp;gt;children[index];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void BTree_Insert(BTree *tree, Key key, Value value) {&lt;br /&gt;
    BNode *root = &amp;amp;tree-&amp;gt;root;&lt;br /&gt;
    BNode *new_root_sibling;&lt;br /&gt;
    if (tree-&amp;gt;height == 0) {&lt;br /&gt;
        new_root_sibling = BNodeLeaf_Insert(root, key, value);&lt;br /&gt;
    } else {&lt;br /&gt;
        new_root_sibling = BNode_Insert(root, key, value, tree-&amp;gt;height);&lt;br /&gt;
    }&lt;br /&gt;
    if (new_root_sibling) {&lt;br /&gt;
        BNode *old_root = BNode_Create(root-&amp;gt;length, root-&amp;gt;keys, root-&amp;gt;children);&lt;br /&gt;
        Key keys[2] = {BNode_GetMaxKey(old_root), BNode_GetMaxKey(new_root_sibling)};&lt;br /&gt;
        BNode *children[2] = {old_root, new_root_sibling};&lt;br /&gt;
        BNode_Initialize(root, 2, keys, children);&lt;br /&gt;
        tree-&amp;gt;height++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void BTree_Delete(BTree *tree, Key key) {&lt;br /&gt;
    if (tree-&amp;gt;height == 0) {&lt;br /&gt;
        BNodeLeaf_Delete(&amp;amp;tree-&amp;gt;root, key);&lt;br /&gt;
    } else {&lt;br /&gt;
        BNode_Delete(&amp;amp;tree-&amp;gt;root, key, tree-&amp;gt;height);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
[[Category:Data structures]]&lt;/div&gt;</summary>
		<author><name>Vegard</name></author>
	</entry>
</feed>