<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>STX B+ Tree Template Classes: stx/btree.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.6 -->
<div class="navigation" id="top">
<div class="tabs">
<ul>
<li><a href="index.html"><span>Main Page</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<h1>stx/btree.h</h1><a href="btree_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// $Id: btree.h 113 2008-09-07 15:25:51Z tb $</span>
<a name="l00006"></a>00006 <span class="comment"></span><span class="comment">/*</span>
<a name="l00007"></a>00007 <span class="comment"> * STX B+ Tree Template Classes v0.8.3</span>
<a name="l00008"></a>00008 <span class="comment"> * Copyright (C) 2008 Timo Bingmann</span>
<a name="l00009"></a>00009 <span class="comment"> *</span>
<a name="l00010"></a>00010 <span class="comment"> * This library is free software; you can redistribute it and/or modify it</span>
<a name="l00011"></a>00011 <span class="comment"> * under the terms of the GNU Lesser General Public License as published by the</span>
<a name="l00012"></a>00012 <span class="comment"> * Free Software Foundation; either version 2.1 of the License, or (at your</span>
<a name="l00013"></a>00013 <span class="comment"> * option) any later version.</span>
<a name="l00014"></a>00014 <span class="comment"> *</span>
<a name="l00015"></a>00015 <span class="comment"> * This library is distributed in the hope that it will be useful, but WITHOUT</span>
<a name="l00016"></a>00016 <span class="comment"> * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or</span>
<a name="l00017"></a>00017 <span class="comment"> * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License</span>
<a name="l00018"></a>00018 <span class="comment"> * for more details.</span>
<a name="l00019"></a>00019 <span class="comment"> *</span>
<a name="l00020"></a>00020 <span class="comment"> * You should have received a copy of the GNU Lesser General Public License</span>
<a name="l00021"></a>00021 <span class="comment"> * along with this library; if not, write to the Free Software Foundation,</span>
<a name="l00022"></a>00022 <span class="comment"> * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span>
<a name="l00023"></a>00023 <span class="comment"> */</span>
<a name="l00024"></a>00024
<a name="l00025"></a>00025 <span class="preprocessor">#ifndef _STX_BTREE_H_</span>
<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define _STX_BTREE_H_</span>
<a name="l00027"></a>00027 <span class="preprocessor"></span>
<a name="l00028"></a>00028 <span class="comment">// *** Required Headers from the STL</span>
<a name="l00029"></a>00029
<a name="l00030"></a>00030 <span class="preprocessor">#include <algorithm></span>
<a name="l00031"></a>00031 <span class="preprocessor">#include <functional></span>
<a name="l00032"></a>00032 <span class="preprocessor">#include <istream></span>
<a name="l00033"></a>00033 <span class="preprocessor">#include <ostream></span>
<a name="l00034"></a>00034 <span class="preprocessor">#include <assert.h></span>
<a name="l00035"></a>00035
<a name="l00036"></a>00036 <span class="comment">// *** Debugging Macros</span>
<a name="l00037"></a>00037
<a name="l00038"></a>00038 <span class="preprocessor">#ifdef BTREE_DEBUG</span>
<a name="l00039"></a>00039 <span class="preprocessor"></span>
<a name="l00040"></a>00040 <span class="preprocessor">#include <iostream></span>
<a name="l00041"></a>00041
<a name="l00043"></a><a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345">00043</a> <span class="preprocessor">#define BTREE_PRINT(x) do { if (debug) (std::cout << x); } while(0)</span>
<a name="l00044"></a>00044 <span class="preprocessor"></span>
<a name="l00046"></a><a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb">00046</a> <span class="preprocessor">#define BTREE_ASSERT(x) do { assert(x); } while(0)</span>
<a name="l00047"></a>00047 <span class="preprocessor"></span>
<a name="l00048"></a>00048 <span class="preprocessor">#else</span>
<a name="l00049"></a>00049 <span class="preprocessor"></span>
<a name="l00051"></a>00051 <span class="preprocessor">#define BTREE_PRINT(x) do { } while(0)</span>
<a name="l00052"></a>00052 <span class="preprocessor"></span>
<a name="l00054"></a>00054 <span class="preprocessor">#define BTREE_ASSERT(x) do { } while(0)</span>
<a name="l00055"></a>00055 <span class="preprocessor"></span>
<a name="l00056"></a>00056 <span class="preprocessor">#endif</span>
<a name="l00057"></a>00057 <span class="preprocessor"></span>
<a name="l00059"></a><a class="code" href="btree_8h.html#5d7b0c98bc4c3029d6d76199caa35b19">00059</a> <span class="preprocessor">#define BTREE_MAX(a,b) ((a) < (b) ? (b) : (a))</span>
<a name="l00060"></a>00060 <span class="preprocessor"></span>
<a name="l00061"></a>00061 <span class="preprocessor">#ifndef BTREE_FRIENDS</span>
<a name="l00065"></a><a class="code" href="btree_8h.html#ec07a93b351ce398f789007a441a4320">00065</a> <span class="preprocessor">#define BTREE_FRIENDS friend class btree_friend;</span>
<a name="l00066"></a>00066 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00067"></a>00067 <span class="preprocessor"></span>
<a name="l00069"></a><a class="code" href="namespacestx.html">00069</a> <span class="keyword">namespace </span>stx {
<a name="l00070"></a>00070
<a name="l00073"></a>00073 <span class="keyword">template</span> <<span class="keyword">typename</span> _Key>
<a name="l00074"></a><a class="code" href="structstx_1_1btree__default__set__traits.html">00074</a> <span class="keyword">struct </span><a class="code" href="structstx_1_1btree__default__set__traits.html" title="Generates default traits for a B+ tree used as a set.">btree_default_set_traits</a>
<a name="l00075"></a>00075 {
<a name="l00078"></a><a class="code" href="structstx_1_1btree__default__set__traits.html#bbb0859c6f7a2b887863011026e28ab1">00078</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="structstx_1_1btree__default__set__traits.html#bbb0859c6f7a2b887863011026e28ab1" title="If true, the tree will self verify it&#39;s invariants after each insert() or erase()...">selfverify</a> = <span class="keyword">false</span>;
<a name="l00079"></a>00079
<a name="l00084"></a><a class="code" href="structstx_1_1btree__default__set__traits.html#b06ff26a50cb57614ddaf1096b2871bb">00084</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="structstx_1_1btree__default__set__traits.html#b06ff26a50cb57614ddaf1096b2871bb" title="If true, the tree will print out debug information and a tree dump during insert()...">debug</a> = <span class="keyword">false</span>;
<a name="l00085"></a>00085
<a name="l00088"></a><a class="code" href="structstx_1_1btree__default__set__traits.html#b0bbc6a8fdfa17275dab38f5a9c80efc">00088</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="structstx_1_1btree__default__set__traits.html#b0bbc6a8fdfa17275dab38f5a9c80efc" title="Number of slots in each leaf of the tree.">leafslots</a> = <a class="code" href="btree_8h.html#5d7b0c98bc4c3029d6d76199caa35b19" title="The maximum of a and b. Used in some compile-time formulas.">BTREE_MAX</a>( 8, 256 / (<span class="keyword">sizeof</span>(_Key)) );
<a name="l00089"></a>00089
<a name="l00092"></a><a class="code" href="structstx_1_1btree__default__set__traits.html#1a1e1c183cffd510e3fc7e71076bad2b">00092</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="structstx_1_1btree__default__set__traits.html#1a1e1c183cffd510e3fc7e71076bad2b" title="Number of slots in each inner node of the tree.">innerslots</a> = <a class="code" href="btree_8h.html#5d7b0c98bc4c3029d6d76199caa35b19" title="The maximum of a and b. Used in some compile-time formulas.">BTREE_MAX</a>( 8, 256 / (<span class="keyword">sizeof</span>(_Key) + <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*)) );
<a name="l00093"></a>00093 };
<a name="l00094"></a>00094
<a name="l00097"></a>00097 <span class="keyword">template</span> <<span class="keyword">typename</span> _Key, <span class="keyword">typename</span> _Data>
<a name="l00098"></a><a class="code" href="structstx_1_1btree__default__map__traits.html">00098</a> <span class="keyword">struct </span><a class="code" href="structstx_1_1btree__default__map__traits.html" title="Generates default traits for a B+ tree used as a map.">btree_default_map_traits</a>
<a name="l00099"></a>00099 {
<a name="l00102"></a><a class="code" href="structstx_1_1btree__default__map__traits.html#496dd5b655f8504d804b1751c3b346d4">00102</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="structstx_1_1btree__default__map__traits.html#496dd5b655f8504d804b1751c3b346d4" title="If true, the tree will self verify it&#39;s invariants after each insert() or erase()...">selfverify</a> = <span class="keyword">false</span>;
<a name="l00103"></a>00103
<a name="l00108"></a><a class="code" href="structstx_1_1btree__default__map__traits.html#89d1e06fd542409800e8b370f9c529dc">00108</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="structstx_1_1btree__default__map__traits.html#89d1e06fd542409800e8b370f9c529dc" title="If true, the tree will print out debug information and a tree dump during insert()...">debug</a> = <span class="keyword">false</span>;
<a name="l00109"></a>00109
<a name="l00112"></a><a class="code" href="structstx_1_1btree__default__map__traits.html#19d18c5e35448829cc2a62f458d65a4f">00112</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="structstx_1_1btree__default__map__traits.html#19d18c5e35448829cc2a62f458d65a4f" title="Number of slots in each leaf of the tree.">leafslots</a> = <a class="code" href="btree_8h.html#5d7b0c98bc4c3029d6d76199caa35b19" title="The maximum of a and b. Used in some compile-time formulas.">BTREE_MAX</a>( 8, 256 / (<span class="keyword">sizeof</span>(_Key) + <span class="keyword">sizeof</span>(_Data)) );
<a name="l00113"></a>00113
<a name="l00116"></a><a class="code" href="structstx_1_1btree__default__map__traits.html#8fb65e8200dda28ef52fa765e14301ff">00116</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="structstx_1_1btree__default__map__traits.html#8fb65e8200dda28ef52fa765e14301ff" title="Number of slots in each inner node of the tree.">innerslots</a> = <a class="code" href="btree_8h.html#5d7b0c98bc4c3029d6d76199caa35b19" title="The maximum of a and b. Used in some compile-time formulas.">BTREE_MAX</a>( 8, 256 / (<span class="keyword">sizeof</span>(_Key) + <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*)) );
<a name="l00117"></a>00117 };
<a name="l00118"></a>00118
<a name="l00132"></a>00132 <span class="keyword">template</span> <<span class="keyword">typename</span> _Key, <span class="keyword">typename</span> _Data,
<a name="l00133"></a>00133 <span class="keyword">typename</span> _Value = std::pair<_Key, _Data>,
<a name="l00134"></a>00134 <span class="keyword">typename</span> _Compare = std::less<_Key>,
<a name="l00135"></a>00135 <span class="keyword">typename</span> _Traits = <a class="code" href="structstx_1_1btree__default__map__traits.html" title="Generates default traits for a B+ tree used as a map.">btree_default_map_traits<_Key, _Data></a>,
<a name="l00136"></a>00136 <span class="keywordtype">bool</span> _Duplicates = <span class="keyword">false</span>>
<a name="l00137"></a><a class="code" href="classstx_1_1btree.html">00137</a> <span class="keyword">class </span><a class="code" href="classstx_1_1btree.html" title="Basic class implementing a base B+ tree data structure in memory.">btree</a>
<a name="l00138"></a>00138 {
<a name="l00139"></a>00139 <span class="keyword">public</span>:
<a name="l00140"></a>00140 <span class="comment">// *** Template Parameter Types</span>
<a name="l00141"></a>00141
<a name="l00144"></a><a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf">00144</a> <span class="keyword">typedef</span> _Key <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>;
<a name="l00145"></a>00145
<a name="l00148"></a><a class="code" href="classstx_1_1btree.html#ca29ad902418d86eeb9b9379a38e5fcd">00148</a> <span class="keyword">typedef</span> _Data <a class="code" href="classstx_1_1btree.html#ca29ad902418d86eeb9b9379a38e5fcd" title="Second template parameter: The data type associated with each key.">data_type</a>;
<a name="l00149"></a>00149
<a name="l00154"></a><a class="code" href="classstx_1_1btree.html#84c95e7319c922fe297b4acdf2e0910c">00154</a> <span class="keyword">typedef</span> _Value <a class="code" href="classstx_1_1btree.html#84c95e7319c922fe297b4acdf2e0910c" title="Third template parameter: Composition pair of key and data types, this is required...">value_type</a>;
<a name="l00155"></a>00155
<a name="l00157"></a><a class="code" href="classstx_1_1btree.html#8f75664f479fc4ca3f54a3a5757d98a7">00157</a> <span class="keyword">typedef</span> _Compare <a class="code" href="classstx_1_1btree.html#8f75664f479fc4ca3f54a3a5757d98a7" title="Fourth template parameter: Key comparison function object.">key_compare</a>;
<a name="l00158"></a>00158
<a name="l00161"></a><a class="code" href="classstx_1_1btree.html#a84bef0ec11542ba1f9c49566d653629">00161</a> <span class="keyword">typedef</span> _Traits <a class="code" href="classstx_1_1btree.html#a84bef0ec11542ba1f9c49566d653629" title="Fifth template parameter: Traits object used to define more parameters of the B+...">traits</a>;
<a name="l00162"></a>00162
<a name="l00165"></a><a class="code" href="classstx_1_1btree.html#35378979c13861883affefda9ad95df7">00165</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#35378979c13861883affefda9ad95df7" title="Sixth template parameter: Allow duplicate keys in the B+ tree.">allow_duplicates</a> = _Duplicates;
<a name="l00166"></a>00166
<a name="l00167"></a>00167 <span class="comment">// The macro BTREE_FRIENDS can be used by outside class to access the B+</span>
<a name="l00168"></a>00168 <span class="comment">// tree internals. This was added for wxBTreeDemo to be able to draw the</span>
<a name="l00169"></a>00169 <span class="comment">// tree.</span>
<a name="l00170"></a>00170 <a class="code" href="btree_8h.html#ec07a93b351ce398f789007a441a4320" title="The macro BTREE_FRIENDS can be used by outside class to access the B+ tree internals...">BTREE_FRIENDS</a>
<a name="l00171"></a>00171
<a name="l00172"></a>00172 <span class="keyword">public</span>:
<a name="l00173"></a>00173 <span class="comment">// *** Constructed Types</span>
<a name="l00174"></a>00174
<a name="l00176"></a>00176 <span class="keyword">typedef</span> <a class="code" href="classstx_1_1btree.html" title="Basic class implementing a base B+ tree data structure in memory.">btree</a><<a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>, <a class="code" href="classstx_1_1btree.html#ca29ad902418d86eeb9b9379a38e5fcd" title="Second template parameter: The data type associated with each key.">data_type</a>, <a class="code" href="classstx_1_1btree.html#84c95e7319c922fe297b4acdf2e0910c" title="Third template parameter: Composition pair of key and data types, this is required...">value_type</a>,
<a name="l00177"></a><a class="code" href="classstx_1_1btree.html#4f87f5cc9f7bb6ab9d00b7f72bfda460">00177</a> <a class="code" href="classstx_1_1btree.html#8f75664f479fc4ca3f54a3a5757d98a7" title="Fourth template parameter: Key comparison function object.">key_compare</a>, <a class="code" href="classstx_1_1btree.html#a84bef0ec11542ba1f9c49566d653629" title="Fifth template parameter: Traits object used to define more parameters of the B+...">traits</a>, <a class="code" href="classstx_1_1btree.html#35378979c13861883affefda9ad95df7" title="Sixth template parameter: Allow duplicate keys in the B+ tree.">allow_duplicates</a>> <a class="code" href="classstx_1_1btree.html" title="Basic class implementing a base B+ tree data structure in memory.">btree_self</a>;
<a name="l00178"></a>00178
<a name="l00180"></a><a class="code" href="classstx_1_1btree.html#973470864b67129983ea4e1aa2132ac5">00180</a> <span class="keyword">typedef</span> <span class="keywordtype">size_t</span> <a class="code" href="classstx_1_1btree.html#973470864b67129983ea4e1aa2132ac5" title="Size type used to count keys.">size_type</a>;
<a name="l00181"></a>00181
<a name="l00183"></a><a class="code" href="classstx_1_1btree.html#f7a75a733f8547491913b0e5b8d11a4e">00183</a> <span class="keyword">typedef</span> std::pair<key_type, data_type> <a class="code" href="classstx_1_1btree.html#f7a75a733f8547491913b0e5b8d11a4e" title="The pair of key_type and data_type, this may be different from value_type.">pair_type</a>;
<a name="l00184"></a>00184
<a name="l00185"></a>00185 <span class="keyword">public</span>:
<a name="l00186"></a>00186 <span class="comment">// *** Static Constant Options and Values of the B+ Tree</span>
<a name="l00187"></a>00187
<a name="l00189"></a><a class="code" href="classstx_1_1btree.html#12a39ca671e962924f4acf879a44eafc">00189</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="classstx_1_1btree.html#12a39ca671e962924f4acf879a44eafc" title="Base B+ tree parameter: The number of key/data slots in each leaf.">leafslotmax</a> = traits::leafslots;
<a name="l00190"></a>00190
<a name="l00193"></a><a class="code" href="classstx_1_1btree.html#83a18c2fb7f4e9cfd47ce7545d004324">00193</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="classstx_1_1btree.html#83a18c2fb7f4e9cfd47ce7545d004324" title="Base B+ tree parameter: The number of key slots in each inner node, this can differ...">innerslotmax</a> = traits::innerslots;
<a name="l00194"></a>00194
<a name="l00198"></a><a class="code" href="classstx_1_1btree.html#c53c2fe18cd06916a25c3b2a6e0486eb">00198</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="classstx_1_1btree.html#c53c2fe18cd06916a25c3b2a6e0486eb" title="Computed B+ tree parameter: The minimum number of key/data slots used in a leaf.">minleafslots</a> = (<a class="code" href="classstx_1_1btree.html#12a39ca671e962924f4acf879a44eafc" title="Base B+ tree parameter: The number of key/data slots in each leaf.">leafslotmax</a> / 2);
<a name="l00199"></a>00199
<a name="l00203"></a><a class="code" href="classstx_1_1btree.html#14312352a7289cee65f1793b0183f60e">00203</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="classstx_1_1btree.html#14312352a7289cee65f1793b0183f60e" title="Computed B+ tree parameter: The minimum number of key slots used in an inner node...">mininnerslots</a> = (<a class="code" href="classstx_1_1btree.html#83a18c2fb7f4e9cfd47ce7545d004324" title="Base B+ tree parameter: The number of key slots in each inner node, this can differ...">innerslotmax</a> / 2);
<a name="l00204"></a>00204
<a name="l00207"></a><a class="code" href="classstx_1_1btree.html#ee2e25b0fccc7147fd8be0bcf8630b5b">00207</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#ee2e25b0fccc7147fd8be0bcf8630b5b" title="Debug parameter: Enables expensive and thorough checking of the B+ tree invariants...">selfverify</a> = traits::selfverify;
<a name="l00208"></a>00208
<a name="l00212"></a><a class="code" href="classstx_1_1btree.html#ac6ff74fe9fb9e87958d73c28cb9eef4">00212</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#ac6ff74fe9fb9e87958d73c28cb9eef4" title="Debug parameter: Prints out lots of debug information about how the algorithms change...">debug</a> = traits::debug;
<a name="l00213"></a>00213
<a name="l00214"></a>00214 <span class="keyword">private</span>:
<a name="l00215"></a>00215 <span class="comment">// *** Node Classes for In-Memory Nodes</span>
<a name="l00216"></a>00216
<a name="l00219"></a><a class="code" href="structstx_1_1btree_1_1node.html">00219</a> <span class="keyword">struct </span><a class="code" href="structstx_1_1btree_1_1node.html" title="The header structure of each node in-memory.">node</a>
<a name="l00220"></a>00220 {
<a name="l00222"></a><a class="code" href="structstx_1_1btree_1_1node.html#7f1964408f460bd6aa16231e41548d04">00222</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="structstx_1_1btree_1_1node.html#7f1964408f460bd6aa16231e41548d04" title="Level in the b-tree, if level == 0 -&gt; leaf node.">level</a>;
<a name="l00223"></a>00223
<a name="l00226"></a><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812">00226</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>;
<a name="l00227"></a>00227
<a name="l00229"></a><a class="code" href="structstx_1_1btree_1_1node.html#2080bfd07cff3904cdb0db27a4bfa9fa">00229</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="structstx_1_1btree_1_1node.html#2080bfd07cff3904cdb0db27a4bfa9fa" title="Delayed initialisation of constructed node.">initialize</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> l)
<a name="l00230"></a>00230 {
<a name="l00231"></a>00231 <a class="code" href="structstx_1_1btree_1_1node.html#7f1964408f460bd6aa16231e41548d04" title="Level in the b-tree, if level == 0 -&gt; leaf node.">level</a> = l;
<a name="l00232"></a>00232 <a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a> = 0;
<a name="l00233"></a>00233 }
<a name="l00234"></a>00234
<a name="l00236"></a><a class="code" href="structstx_1_1btree_1_1node.html#c7e7d59c64afae8bb9257d5a5a9ab1b8">00236</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structstx_1_1btree_1_1node.html#c7e7d59c64afae8bb9257d5a5a9ab1b8" title="True if this is a leaf node.">isleafnode</a>()<span class="keyword"> const</span>
<a name="l00237"></a>00237 <span class="keyword"> </span>{
<a name="l00238"></a>00238 <span class="keywordflow">return</span> (<a class="code" href="structstx_1_1btree_1_1node.html#7f1964408f460bd6aa16231e41548d04" title="Level in the b-tree, if level == 0 -&gt; leaf node.">level</a> == 0);
<a name="l00239"></a>00239 }
<a name="l00240"></a>00240 };
<a name="l00241"></a>00241
<a name="l00244"></a><a class="code" href="structstx_1_1btree_1_1inner__node.html">00244</a> <span class="keyword">struct </span><a class="code" href="structstx_1_1btree_1_1inner__node.html" title="Extended structure of a inner node in-memory.">inner_node</a> : <span class="keyword">public</span> <a class="code" href="structstx_1_1btree_1_1node.html" title="The header structure of each node in-memory.">node</a>
<a name="l00245"></a>00245 {
<a name="l00247"></a><a class="code" href="structstx_1_1btree_1_1inner__node.html#90588183064df8ea1d15fb357a295b62">00247</a> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> <a class="code" href="structstx_1_1btree_1_1inner__node.html#90588183064df8ea1d15fb357a295b62" title="Keys of children or data pointers.">slotkey</a>[<a class="code" href="classstx_1_1btree.html#83a18c2fb7f4e9cfd47ce7545d004324" title="Base B+ tree parameter: The number of key slots in each inner node, this can differ...">innerslotmax</a>];
<a name="l00248"></a>00248
<a name="l00250"></a><a class="code" href="structstx_1_1btree_1_1inner__node.html#90039da3250bc1770fb84f7b7407469f">00250</a> <a class="code" href="structstx_1_1btree_1_1node.html" title="The header structure of each node in-memory.">node</a>* <a class="code" href="structstx_1_1btree_1_1inner__node.html#90039da3250bc1770fb84f7b7407469f" title="Pointers to children.">childid</a>[<a class="code" href="classstx_1_1btree.html#83a18c2fb7f4e9cfd47ce7545d004324" title="Base B+ tree parameter: The number of key slots in each inner node, this can differ...">innerslotmax</a>+1];
<a name="l00251"></a>00251
<a name="l00253"></a><a class="code" href="structstx_1_1btree_1_1inner__node.html#f44644e684d49141dc8ca17de22c1d8a">00253</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="structstx_1_1btree_1_1inner__node.html#f44644e684d49141dc8ca17de22c1d8a" title="Set variables to initial values.">initialize</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> l)
<a name="l00254"></a>00254 {
<a name="l00255"></a>00255 <a class="code" href="structstx_1_1btree_1_1node.html#2080bfd07cff3904cdb0db27a4bfa9fa" title="Delayed initialisation of constructed node.">node::initialize</a>(l);
<a name="l00256"></a>00256 }
<a name="l00257"></a>00257
<a name="l00259"></a><a class="code" href="structstx_1_1btree_1_1inner__node.html#54ecb85bfead0e0536fd1cb17cc630c8">00259</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structstx_1_1btree_1_1inner__node.html#54ecb85bfead0e0536fd1cb17cc630c8" title="True if the node&#39;s slots are full.">isfull</a>()<span class="keyword"> const</span>
<a name="l00260"></a>00260 <span class="keyword"> </span>{
<a name="l00261"></a>00261 <span class="keywordflow">return</span> (<a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">node::slotuse</a> == <a class="code" href="classstx_1_1btree.html#83a18c2fb7f4e9cfd47ce7545d004324" title="Base B+ tree parameter: The number of key slots in each inner node, this can differ...">innerslotmax</a>);
<a name="l00262"></a>00262 }
<a name="l00263"></a>00263
<a name="l00265"></a><a class="code" href="structstx_1_1btree_1_1inner__node.html#6b4dc9de51be9819038595d1b55d376e">00265</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structstx_1_1btree_1_1inner__node.html#6b4dc9de51be9819038595d1b55d376e" title="True if few used entries, less than half full.">isfew</a>()<span class="keyword"> const</span>
<a name="l00266"></a>00266 <span class="keyword"> </span>{
<a name="l00267"></a>00267 <span class="keywordflow">return</span> (<a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">node::slotuse</a> <= <a class="code" href="classstx_1_1btree.html#14312352a7289cee65f1793b0183f60e" title="Computed B+ tree parameter: The minimum number of key slots used in an inner node...">mininnerslots</a>);
<a name="l00268"></a>00268 }
<a name="l00269"></a>00269
<a name="l00271"></a><a class="code" href="structstx_1_1btree_1_1inner__node.html#659bfb94e6b2bbd92c1354aae5d9ac31">00271</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structstx_1_1btree_1_1inner__node.html#659bfb94e6b2bbd92c1354aae5d9ac31" title="True if node has too few entries.">isunderflow</a>()<span class="keyword"> const</span>
<a name="l00272"></a>00272 <span class="keyword"> </span>{
<a name="l00273"></a>00273 <span class="keywordflow">return</span> (<a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">node::slotuse</a> < <a class="code" href="classstx_1_1btree.html#14312352a7289cee65f1793b0183f60e" title="Computed B+ tree parameter: The minimum number of key slots used in an inner node...">mininnerslots</a>);
<a name="l00274"></a>00274 }
<a name="l00275"></a>00275 };
<a name="l00276"></a>00276
<a name="l00280"></a><a class="code" href="structstx_1_1btree_1_1leaf__node.html">00280</a> <span class="keyword">struct </span><a class="code" href="structstx_1_1btree_1_1leaf__node.html" title="Extended structure of a leaf node in memory.">leaf_node</a> : <span class="keyword">public</span> <a class="code" href="structstx_1_1btree_1_1node.html" title="The header structure of each node in-memory.">node</a>
<a name="l00281"></a>00281 {
<a name="l00283"></a><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae">00283</a> <a class="code" href="structstx_1_1btree_1_1leaf__node.html" title="Extended structure of a leaf node in memory.">leaf_node</a> *<a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a>;
<a name="l00284"></a>00284
<a name="l00286"></a><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608">00286</a> <a class="code" href="structstx_1_1btree_1_1leaf__node.html" title="Extended structure of a leaf node in memory.">leaf_node</a> *<a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a>;
<a name="l00287"></a>00287
<a name="l00289"></a><a class="code" href="structstx_1_1btree_1_1leaf__node.html#cdae18752022a3f57ecb2be00bbe4dfd">00289</a> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> <a class="code" href="structstx_1_1btree_1_1leaf__node.html#cdae18752022a3f57ecb2be00bbe4dfd" title="Keys of children or data pointers.">slotkey</a>[<a class="code" href="classstx_1_1btree.html#12a39ca671e962924f4acf879a44eafc" title="Base B+ tree parameter: The number of key/data slots in each leaf.">leafslotmax</a>];
<a name="l00290"></a>00290
<a name="l00292"></a><a class="code" href="structstx_1_1btree_1_1leaf__node.html#06d022590b9aa76fd0f0ff56c48b1eb5">00292</a> <a class="code" href="classstx_1_1btree.html#ca29ad902418d86eeb9b9379a38e5fcd" title="Second template parameter: The data type associated with each key.">data_type</a> <a class="code" href="structstx_1_1btree_1_1leaf__node.html#06d022590b9aa76fd0f0ff56c48b1eb5" title="Array of data.">slotdata</a>[<a class="code" href="classstx_1_1btree.html#12a39ca671e962924f4acf879a44eafc" title="Base B+ tree parameter: The number of key/data slots in each leaf.">leafslotmax</a>];
<a name="l00293"></a>00293
<a name="l00295"></a><a class="code" href="structstx_1_1btree_1_1leaf__node.html#b0094a85e6adbebdd3bc4a671fddfca5">00295</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="structstx_1_1btree_1_1leaf__node.html#b0094a85e6adbebdd3bc4a671fddfca5" title="Set variables to initial values.">initialize</a>()
<a name="l00296"></a>00296 {
<a name="l00297"></a>00297 <a class="code" href="structstx_1_1btree_1_1node.html#2080bfd07cff3904cdb0db27a4bfa9fa" title="Delayed initialisation of constructed node.">node::initialize</a>(0);
<a name="l00298"></a>00298 <a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a> = <a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a> = NULL;
<a name="l00299"></a>00299 }
<a name="l00300"></a>00300
<a name="l00302"></a><a class="code" href="structstx_1_1btree_1_1leaf__node.html#abecfe27dbb19007a00e1119993647c5">00302</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structstx_1_1btree_1_1leaf__node.html#abecfe27dbb19007a00e1119993647c5" title="True if the node&#39;s slots are full.">isfull</a>()<span class="keyword"> const</span>
<a name="l00303"></a>00303 <span class="keyword"> </span>{
<a name="l00304"></a>00304 <span class="keywordflow">return</span> (<a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">node::slotuse</a> == <a class="code" href="classstx_1_1btree.html#12a39ca671e962924f4acf879a44eafc" title="Base B+ tree parameter: The number of key/data slots in each leaf.">leafslotmax</a>);
<a name="l00305"></a>00305 }
<a name="l00306"></a>00306
<a name="l00308"></a><a class="code" href="structstx_1_1btree_1_1leaf__node.html#c3c84ea0c97039832aa4ade6c5477b34">00308</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structstx_1_1btree_1_1leaf__node.html#c3c84ea0c97039832aa4ade6c5477b34" title="True if few used entries, less than half full.">isfew</a>()<span class="keyword"> const</span>
<a name="l00309"></a>00309 <span class="keyword"> </span>{
<a name="l00310"></a>00310 <span class="keywordflow">return</span> (<a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">node::slotuse</a> <= <a class="code" href="classstx_1_1btree.html#c53c2fe18cd06916a25c3b2a6e0486eb" title="Computed B+ tree parameter: The minimum number of key/data slots used in a leaf.">minleafslots</a>);
<a name="l00311"></a>00311 }
<a name="l00312"></a>00312
<a name="l00314"></a><a class="code" href="structstx_1_1btree_1_1leaf__node.html#7807c0b01d2012177e8d10edc0b05049">00314</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structstx_1_1btree_1_1leaf__node.html#7807c0b01d2012177e8d10edc0b05049" title="True if node has too few entries.">isunderflow</a>()<span class="keyword"> const</span>
<a name="l00315"></a>00315 <span class="keyword"> </span>{
<a name="l00316"></a>00316 <span class="keywordflow">return</span> (<a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">node::slotuse</a> < <a class="code" href="classstx_1_1btree.html#c53c2fe18cd06916a25c3b2a6e0486eb" title="Computed B+ tree parameter: The minimum number of key/data slots used in a leaf.">minleafslots</a>);
<a name="l00317"></a>00317 }
<a name="l00318"></a>00318 };
<a name="l00319"></a>00319
<a name="l00320"></a>00320 <span class="keyword">private</span>:
<a name="l00321"></a>00321 <span class="comment">// *** Template Magic to Convert a pair or key/data types to a value_type</span>
<a name="l00322"></a>00322
<a name="l00325"></a>00325 <span class="keyword">template</span> <<span class="keyword">typename</span> value_type, <span class="keyword">typename</span> pair_type>
<a name="l00326"></a>00326 <span class="keyword">struct </span>btree_pair_to_value
<a name="l00327"></a>00327 {
<a name="l00329"></a>00329 <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree.html#84c95e7319c922fe297b4acdf2e0910c" title="Third template parameter: Composition pair of key and data types, this is required...">value_type</a> operator()(<a class="code" href="classstx_1_1btree.html#f7a75a733f8547491913b0e5b8d11a4e" title="The pair of key_type and data_type, this may be different from value_type.">pair_type</a>& p)<span class="keyword"> const </span>{
<a name="l00330"></a>00330 <span class="keywordflow">return</span> p.first;
<a name="l00331"></a>00331 }
<a name="l00333"></a>00333 <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree.html#84c95e7319c922fe297b4acdf2e0910c" title="Third template parameter: Composition pair of key and data types, this is required...">value_type</a> operator()(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#f7a75a733f8547491913b0e5b8d11a4e" title="The pair of key_type and data_type, this may be different from value_type.">pair_type</a>& p)<span class="keyword"> const </span>{
<a name="l00334"></a>00334 <span class="keywordflow">return</span> p.first;
<a name="l00335"></a>00335 }
<a name="l00336"></a>00336 };
<a name="l00337"></a>00337
<a name="l00339"></a>00339 <span class="keyword">template</span> <<span class="keyword">typename</span> value_type>
<a name="l00340"></a>00340 <span class="keyword">struct </span>btree_pair_to_value<<a class="code" href="classstx_1_1btree.html#84c95e7319c922fe297b4acdf2e0910c" title="Third template parameter: Composition pair of key and data types, this is required...">value_type</a>, <a class="code" href="classstx_1_1btree.html#84c95e7319c922fe297b4acdf2e0910c" title="Third template parameter: Composition pair of key and data types, this is required...">value_type</a>>
<a name="l00341"></a>00341 {
<a name="l00343"></a>00343 <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree.html#84c95e7319c922fe297b4acdf2e0910c" title="Third template parameter: Composition pair of key and data types, this is required...">value_type</a> operator()(<a class="code" href="classstx_1_1btree.html#f7a75a733f8547491913b0e5b8d11a4e" title="The pair of key_type and data_type, this may be different from value_type.">pair_type</a>& p)<span class="keyword"> const </span>{
<a name="l00344"></a>00344 <span class="keywordflow">return</span> p;
<a name="l00345"></a>00345 }
<a name="l00347"></a>00347 <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree.html#84c95e7319c922fe297b4acdf2e0910c" title="Third template parameter: Composition pair of key and data types, this is required...">value_type</a> operator()(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#f7a75a733f8547491913b0e5b8d11a4e" title="The pair of key_type and data_type, this may be different from value_type.">pair_type</a>& p)<span class="keyword"> const </span>{
<a name="l00348"></a>00348 <span class="keywordflow">return</span> p;
<a name="l00349"></a>00349 }
<a name="l00350"></a>00350 };
<a name="l00351"></a>00351
<a name="l00354"></a><a class="code" href="classstx_1_1btree.html#d00ea2b529c201236f4c79cd50acf42e">00354</a> <span class="keyword">typedef</span> btree_pair_to_value<value_type, pair_type> <a class="code" href="classstx_1_1btree.html#d00ea2b529c201236f4c79cd50acf42e" title="Using template specialization select the correct converter used by the iterators...">pair_to_value_type</a>;
<a name="l00355"></a>00355
<a name="l00356"></a>00356 <span class="keyword">public</span>:
<a name="l00357"></a>00357 <span class="comment">// *** Iterators and Reverse Iterators</span>
<a name="l00358"></a>00358
<a name="l00359"></a>00359 <span class="keyword">class </span>iterator;
<a name="l00360"></a>00360 <span class="keyword">class </span>const_iterator;
<a name="l00361"></a>00361 <span class="keyword">class </span>reverse_iterator;
<a name="l00362"></a>00362 <span class="keyword">class </span>const_reverse_iterator;
<a name="l00363"></a>00363
<a name="l00366"></a><a class="code" href="classstx_1_1btree_1_1iterator.html">00366</a> <span class="keyword">class </span><a class="code" href="classstx_1_1btree_1_1iterator.html" title="STL-like iterator object for B+ tree items.">iterator</a>
<a name="l00367"></a>00367 {
<a name="l00368"></a>00368 <span class="keyword">public</span>:
<a name="l00369"></a>00369 <span class="comment">// *** Types</span>
<a name="l00370"></a>00370
<a name="l00372"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#ea4332aed2cd6388e084487074b72ee6">00372</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">btree::key_type</a> <a class="code" href="classstx_1_1btree_1_1iterator.html#ea4332aed2cd6388e084487074b72ee6" title="The key type of the btree. Returned by key().">key_type</a>;
<a name="l00373"></a>00373
<a name="l00375"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#ffb9c60049bf66fd6224db6ae804da7f">00375</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#ca29ad902418d86eeb9b9379a38e5fcd" title="Second template parameter: The data type associated with each key.">btree::data_type</a> <a class="code" href="classstx_1_1btree_1_1iterator.html#ffb9c60049bf66fd6224db6ae804da7f" title="The data type of the btree. Returned by data().">data_type</a>;
<a name="l00376"></a>00376
<a name="l00378"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#9f1974cd1b9a1c0e93da0daf82c5d14f">00378</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#84c95e7319c922fe297b4acdf2e0910c" title="Third template parameter: Composition pair of key and data types, this is required...">btree::value_type</a> <a class="code" href="classstx_1_1btree_1_1iterator.html#9f1974cd1b9a1c0e93da0daf82c5d14f" title="The value type of the btree. Returned by operator*().">value_type</a>;
<a name="l00379"></a>00379
<a name="l00381"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#80f0ddae6043be8f297243b5e7c658f3">00381</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#f7a75a733f8547491913b0e5b8d11a4e" title="The pair of key_type and data_type, this may be different from value_type.">btree::pair_type</a> <a class="code" href="classstx_1_1btree_1_1iterator.html#80f0ddae6043be8f297243b5e7c658f3" title="The pair type of the btree.">pair_type</a>;
<a name="l00382"></a>00382
<a name="l00384"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#ea2f3525718cf2cbaa4fe7ace1a70edd">00384</a> <span class="keyword">typedef</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#9f1974cd1b9a1c0e93da0daf82c5d14f" title="The value type of the btree. Returned by operator*().">value_type</a>& <a class="code" href="classstx_1_1btree_1_1iterator.html#ea2f3525718cf2cbaa4fe7ace1a70edd" title="Reference to the value_type. STL required.">reference</a>;
<a name="l00385"></a>00385
<a name="l00387"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#295e5913f8a3bb5bb8782a654fe8f854">00387</a> <span class="keyword">typedef</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#9f1974cd1b9a1c0e93da0daf82c5d14f" title="The value type of the btree. Returned by operator*().">value_type</a>* <a class="code" href="classstx_1_1btree_1_1iterator.html#295e5913f8a3bb5bb8782a654fe8f854" title="Pointer to the value_type. STL required.">pointer</a>;
<a name="l00388"></a>00388
<a name="l00390"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#2a36a0292fe6ad42814e7ef9a0a742d4">00390</a> <span class="keyword">typedef</span> std::bidirectional_iterator_tag <a class="code" href="classstx_1_1btree_1_1iterator.html#2a36a0292fe6ad42814e7ef9a0a742d4" title="STL-magic iterator category.">iterator_category</a>;
<a name="l00391"></a>00391
<a name="l00393"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#bc26d3f78cf71e37337ea54be0ca9ed0">00393</a> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="classstx_1_1btree_1_1iterator.html#bc26d3f78cf71e37337ea54be0ca9ed0" title="STL-magic.">difference_type</a>;
<a name="l00394"></a>00394
<a name="l00396"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#10514bcd8d55875eb4b5cede7123896c">00396</a> <span class="keyword">typedef</span> <a class="code" href="classstx_1_1btree_1_1iterator.html" title="STL-like iterator object for B+ tree items.">iterator</a> <span class="keyword">self</span>;
<a name="l00397"></a>00397
<a name="l00398"></a>00398 <span class="keyword">private</span>:
<a name="l00399"></a>00399 <span class="comment">// *** Members</span>
<a name="l00400"></a>00400
<a name="l00402"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4">00402</a> <span class="keyword">typename</span> <a class="code" href="structstx_1_1btree_1_1leaf__node.html" title="Extended structure of a leaf node in memory.">btree::leaf_node</a>* <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>;
<a name="l00403"></a>00403
<a name="l00405"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7">00405</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>;
<a name="l00406"></a>00406
<a name="l00408"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#c220ce1c155db1ac44146c12d178056f">00408</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classstx_1_1btree_1_1const__iterator.html" title="STL-like read-only iterator object for B+ tree items.">const_iterator</a>;
<a name="l00409"></a>00409
<a name="l00411"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#f0a70641f2216cc31420487a62dd3b0d">00411</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html" title="STL-like mutable reverse iterator object for B+ tree items.">reverse_iterator</a>;
<a name="l00412"></a>00412
<a name="l00414"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#776e261b45ef26d713a4d105a8d7c240">00414</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html" title="STL-like read-only reverse iterator object for B+ tree items.">const_reverse_iterator</a>;
<a name="l00415"></a>00415
<a name="l00418"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#19d75ddf417487f53d0eaecdfc5b8d91">00418</a> <span class="keyword">mutable</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#9f1974cd1b9a1c0e93da0daf82c5d14f" title="The value type of the btree. Returned by operator*().">value_type</a> <a class="code" href="classstx_1_1btree_1_1iterator.html#19d75ddf417487f53d0eaecdfc5b8d91" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a>;
<a name="l00419"></a>00419
<a name="l00420"></a>00420 <span class="comment">// The macro BTREE_FRIENDS can be used by outside class to access the B+</span>
<a name="l00421"></a>00421 <span class="comment">// tree internals. This was added for wxBTreeDemo to be able to draw the</span>
<a name="l00422"></a>00422 <span class="comment">// tree.</span>
<a name="l00423"></a>00423 <a class="code" href="btree_8h.html#ec07a93b351ce398f789007a441a4320" title="The macro BTREE_FRIENDS can be used by outside class to access the B+ tree internals...">BTREE_FRIENDS</a>
<a name="l00424"></a>00424
<a name="l00425"></a>00425 <span class="keyword">public</span>:
<a name="l00426"></a>00426 <span class="comment">// *** Methods</span>
<a name="l00427"></a>00427
<a name="l00429"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#a54c4b8e7ac48539e9f79d18c0a57dfc">00429</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#a54c4b8e7ac48539e9f79d18c0a57dfc" title="Default-Constructor of a mutable iterator.">iterator</a>()
<a name="l00430"></a>00430 : <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>(NULL), <a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>(0)
<a name="l00431"></a>00431 { }
<a name="l00432"></a>00432
<a name="l00434"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#42bebd3ed2930455eba60817d7cba44d">00434</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#a54c4b8e7ac48539e9f79d18c0a57dfc" title="Default-Constructor of a mutable iterator.">iterator</a>(<span class="keyword">typename</span> <a class="code" href="structstx_1_1btree_1_1leaf__node.html" title="Extended structure of a leaf node in memory.">btree::leaf_node</a> *l, <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> s)
<a name="l00435"></a>00435 : <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>(l), <a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>(s)
<a name="l00436"></a>00436 { }
<a name="l00437"></a>00437
<a name="l00439"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#a0e0334af63cde950cf8384f497285b5">00439</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#a54c4b8e7ac48539e9f79d18c0a57dfc" title="Default-Constructor of a mutable iterator.">iterator</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html" title="STL-like mutable reverse iterator object for B+ tree items.">reverse_iterator</a> &it)
<a name="l00440"></a>00440 : <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>(it.<a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>), <a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>(it.<a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>)
<a name="l00441"></a>00441 { }
<a name="l00442"></a>00442
<a name="l00445"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#8a2c919b492844a98f80e5d75d5c3f03">00445</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#ea2f3525718cf2cbaa4fe7ace1a70edd" title="Reference to the value_type. STL required.">reference</a> <a class="code" href="classstx_1_1btree_1_1iterator.html#8a2c919b492844a98f80e5d75d5c3f03" title="Dereference the iterator, this is not a value_type&amp; because key and value are...">operator*</a>()<span class="keyword"> const</span>
<a name="l00446"></a>00446 <span class="keyword"> </span>{
<a name="l00447"></a>00447 <a class="code" href="classstx_1_1btree_1_1iterator.html#19d75ddf417487f53d0eaecdfc5b8d91" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a> = <a class="code" href="classstx_1_1btree.html#d00ea2b529c201236f4c79cd50acf42e" title="Using template specialization select the correct converter used by the iterators...">pair_to_value_type</a>()( <a class="code" href="classstx_1_1btree_1_1iterator.html#80f0ddae6043be8f297243b5e7c658f3" title="The pair type of the btree.">pair_type</a>(<a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#cdae18752022a3f57ecb2be00bbe4dfd" title="Keys of children or data pointers.">slotkey</a>[<a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>],
<a name="l00448"></a>00448 <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#06d022590b9aa76fd0f0ff56c48b1eb5" title="Array of data.">slotdata</a>[<a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>]) );
<a name="l00449"></a>00449 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#19d75ddf417487f53d0eaecdfc5b8d91" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a>;
<a name="l00450"></a>00450 }
<a name="l00451"></a>00451
<a name="l00455"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#25de2fc3c4d5524f51e618024fbf4123">00455</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#295e5913f8a3bb5bb8782a654fe8f854" title="Pointer to the value_type. STL required.">pointer</a> <a class="code" href="classstx_1_1btree_1_1iterator.html#25de2fc3c4d5524f51e618024fbf4123" title="Dereference the iterator.">operator-></a>()<span class="keyword"> const</span>
<a name="l00456"></a>00456 <span class="keyword"> </span>{
<a name="l00457"></a>00457 <a class="code" href="classstx_1_1btree_1_1iterator.html#19d75ddf417487f53d0eaecdfc5b8d91" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a> = <a class="code" href="classstx_1_1btree.html#d00ea2b529c201236f4c79cd50acf42e" title="Using template specialization select the correct converter used by the iterators...">pair_to_value_type</a>()( <a class="code" href="classstx_1_1btree_1_1iterator.html#80f0ddae6043be8f297243b5e7c658f3" title="The pair type of the btree.">pair_type</a>(<a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#cdae18752022a3f57ecb2be00bbe4dfd" title="Keys of children or data pointers.">slotkey</a>[<a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>],
<a name="l00458"></a>00458 <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#06d022590b9aa76fd0f0ff56c48b1eb5" title="Array of data.">slotdata</a>[<a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>]) );
<a name="l00459"></a>00459 <span class="keywordflow">return</span> &<a class="code" href="classstx_1_1btree_1_1iterator.html#19d75ddf417487f53d0eaecdfc5b8d91" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a>;
<a name="l00460"></a>00460 }
<a name="l00461"></a>00461
<a name="l00463"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#aa01645799a11caaf3dfbe8a8b1e3bb4">00463</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#ea4332aed2cd6388e084487074b72ee6" title="The key type of the btree. Returned by key().">key_type</a>& <a class="code" href="classstx_1_1btree_1_1iterator.html#aa01645799a11caaf3dfbe8a8b1e3bb4" title="Key of the current slot.">key</a>()<span class="keyword"> const</span>
<a name="l00464"></a>00464 <span class="keyword"> </span>{
<a name="l00465"></a>00465 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#cdae18752022a3f57ecb2be00bbe4dfd" title="Keys of children or data pointers.">slotkey</a>[<a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>];
<a name="l00466"></a>00466 }
<a name="l00467"></a>00467
<a name="l00469"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#611b8e53a3678e53c78d198b25e05a2f">00469</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#ffb9c60049bf66fd6224db6ae804da7f" title="The data type of the btree. Returned by data().">data_type</a>& <a class="code" href="classstx_1_1btree_1_1iterator.html#611b8e53a3678e53c78d198b25e05a2f" title="Writable reference to the current data object.">data</a>()<span class="keyword"> const</span>
<a name="l00470"></a>00470 <span class="keyword"> </span>{
<a name="l00471"></a>00471 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#06d022590b9aa76fd0f0ff56c48b1eb5" title="Array of data.">slotdata</a>[<a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>];
<a name="l00472"></a>00472 }
<a name="l00473"></a>00473
<a name="l00475"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#99673c0a8e2c0a8731255606cf3c12bf">00475</a> <span class="keyword">inline</span> <span class="keyword">self</span>& <a class="code" href="classstx_1_1btree_1_1iterator.html#99673c0a8e2c0a8731255606cf3c12bf" title="Prefix++ advance the iterator to the next slot.">operator++</a>()
<a name="l00476"></a>00476 {
<a name="l00477"></a>00477 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a> + 1 < <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>) {
<a name="l00478"></a>00478 ++<a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>;
<a name="l00479"></a>00479 }
<a name="l00480"></a>00480 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a> != NULL) {
<a name="l00481"></a>00481 <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a> = <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a>;
<a name="l00482"></a>00482 <a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a> = 0;
<a name="l00483"></a>00483 }
<a name="l00484"></a>00484 <span class="keywordflow">else</span> {
<a name="l00485"></a>00485 <span class="comment">// this is end()</span>
<a name="l00486"></a>00486 <a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a> = <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>;
<a name="l00487"></a>00487 }
<a name="l00488"></a>00488
<a name="l00489"></a>00489 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00490"></a>00490 }
<a name="l00491"></a>00491
<a name="l00493"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#ede8f3d3cb92d9df6537902015d81bb1">00493</a> <span class="keyword">inline</span> <span class="keyword">self</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#99673c0a8e2c0a8731255606cf3c12bf" title="Prefix++ advance the iterator to the next slot.">operator++</a>(<span class="keywordtype">int</span>)
<a name="l00494"></a>00494 {
<a name="l00495"></a>00495 <span class="keyword">self</span> tmp = *<span class="keyword">this</span>; <span class="comment">// copy ourselves</span>
<a name="l00496"></a>00496
<a name="l00497"></a>00497 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a> + 1 < <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>) {
<a name="l00498"></a>00498 ++<a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>;
<a name="l00499"></a>00499 }
<a name="l00500"></a>00500 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a> != NULL) {
<a name="l00501"></a>00501 <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a> = <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a>;
<a name="l00502"></a>00502 <a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a> = 0;
<a name="l00503"></a>00503 }
<a name="l00504"></a>00504 <span class="keywordflow">else</span> {
<a name="l00505"></a>00505 <span class="comment">// this is end()</span>
<a name="l00506"></a>00506 <a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a> = <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>;
<a name="l00507"></a>00507 }
<a name="l00508"></a>00508
<a name="l00509"></a>00509 <span class="keywordflow">return</span> tmp;
<a name="l00510"></a>00510 }
<a name="l00511"></a>00511
<a name="l00513"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#f37b51ac54b7fdbb775c0c24ec738475">00513</a> <span class="keyword">inline</span> <span class="keyword">self</span>& <a class="code" href="classstx_1_1btree_1_1iterator.html#f37b51ac54b7fdbb775c0c24ec738475" title="Prefix-- backstep the iterator to the last slot.">operator--</a>()
<a name="l00514"></a>00514 {
<a name="l00515"></a>00515 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a> > 0) {
<a name="l00516"></a>00516 --<a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>;
<a name="l00517"></a>00517 }
<a name="l00518"></a>00518 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a> != NULL) {
<a name="l00519"></a>00519 <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a> = <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a>;
<a name="l00520"></a>00520 <a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a> = <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a> - 1;
<a name="l00521"></a>00521 }
<a name="l00522"></a>00522 <span class="keywordflow">else</span> {
<a name="l00523"></a>00523 <span class="comment">// this is begin()</span>
<a name="l00524"></a>00524 <a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a> = 0;
<a name="l00525"></a>00525 }
<a name="l00526"></a>00526
<a name="l00527"></a>00527 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00528"></a>00528 }
<a name="l00529"></a>00529
<a name="l00531"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#527ec894a57424168ffcf4c9664b08b3">00531</a> <span class="keyword">inline</span> <span class="keyword">self</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#f37b51ac54b7fdbb775c0c24ec738475" title="Prefix-- backstep the iterator to the last slot.">operator--</a>(<span class="keywordtype">int</span>)
<a name="l00532"></a>00532 {
<a name="l00533"></a>00533 <span class="keyword">self</span> tmp = *<span class="keyword">this</span>; <span class="comment">// copy ourselves</span>
<a name="l00534"></a>00534
<a name="l00535"></a>00535 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a> > 0) {
<a name="l00536"></a>00536 --<a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>;
<a name="l00537"></a>00537 }
<a name="l00538"></a>00538 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a> != NULL) {
<a name="l00539"></a>00539 <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a> = <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a>;
<a name="l00540"></a>00540 <a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a> = <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a> - 1;
<a name="l00541"></a>00541 }
<a name="l00542"></a>00542 <span class="keywordflow">else</span> {
<a name="l00543"></a>00543 <span class="comment">// this is begin()</span>
<a name="l00544"></a>00544 <a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a> = 0;
<a name="l00545"></a>00545 }
<a name="l00546"></a>00546
<a name="l00547"></a>00547 <span class="keywordflow">return</span> tmp;
<a name="l00548"></a>00548 }
<a name="l00549"></a>00549
<a name="l00551"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#c13d2f2abdc84c671427f51ad738b16e">00551</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#c13d2f2abdc84c671427f51ad738b16e" title="Equality of iterators.">operator==</a>(<span class="keyword">const</span> <span class="keyword">self</span>& x)<span class="keyword"> const</span>
<a name="l00552"></a>00552 <span class="keyword"> </span>{
<a name="l00553"></a>00553 <span class="keywordflow">return</span> (x.currnode == <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>) && (x.currslot == <a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>);
<a name="l00554"></a>00554 }
<a name="l00555"></a>00555
<a name="l00557"></a><a class="code" href="classstx_1_1btree_1_1iterator.html#d59538428cb3502d73692b0b369bdcac">00557</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree_1_1iterator.html#d59538428cb3502d73692b0b369bdcac" title="Inequality of iterators.">operator!=</a>(<span class="keyword">const</span> <span class="keyword">self</span>& x)<span class="keyword"> const</span>
<a name="l00558"></a>00558 <span class="keyword"> </span>{
<a name="l00559"></a>00559 <span class="keywordflow">return</span> (x.currnode != <a class="code" href="classstx_1_1btree_1_1iterator.html#3a0cb493e82780e1ba23595c7335ded4" title="The currently referenced leaf node of the tree.">currnode</a>) || (x.currslot != <a class="code" href="classstx_1_1btree_1_1iterator.html#6b81fb282b0576275e588bc70f71fbd7" title="Current key/data slot referenced.">currslot</a>);
<a name="l00560"></a>00560 }
<a name="l00561"></a>00561 };
<a name="l00562"></a>00562
<a name="l00565"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html">00565</a> <span class="keyword">class </span><a class="code" href="classstx_1_1btree_1_1const__iterator.html" title="STL-like read-only iterator object for B+ tree items.">const_iterator</a>
<a name="l00566"></a>00566 {
<a name="l00567"></a>00567 <span class="keyword">public</span>:
<a name="l00568"></a>00568 <span class="comment">// *** Types</span>
<a name="l00569"></a>00569
<a name="l00571"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#5b65028ba554270fc9e483b303daa431">00571</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">btree::key_type</a> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#5b65028ba554270fc9e483b303daa431" title="The key type of the btree. Returned by key().">key_type</a>;
<a name="l00572"></a>00572
<a name="l00574"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#7ba0058d5b19c1c2025ad795827e85d0">00574</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#ca29ad902418d86eeb9b9379a38e5fcd" title="Second template parameter: The data type associated with each key.">btree::data_type</a> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#7ba0058d5b19c1c2025ad795827e85d0" title="The data type of the btree. Returned by data().">data_type</a>;
<a name="l00575"></a>00575
<a name="l00577"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#54ba3bd638eba3ad06d390693f834d5a">00577</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#84c95e7319c922fe297b4acdf2e0910c" title="Third template parameter: Composition pair of key and data types, this is required...">btree::value_type</a> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#54ba3bd638eba3ad06d390693f834d5a" title="The value type of the btree. Returned by operator*().">value_type</a>;
<a name="l00578"></a>00578
<a name="l00580"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#5e113524050bb4bf2700a7f8e0d343dd">00580</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#f7a75a733f8547491913b0e5b8d11a4e" title="The pair of key_type and data_type, this may be different from value_type.">btree::pair_type</a> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#5e113524050bb4bf2700a7f8e0d343dd" title="The pair type of the btree.">pair_type</a>;
<a name="l00581"></a>00581
<a name="l00583"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#b5742e1d907c75d66953c82c726f55a6">00583</a> <span class="keyword">typedef</span> <span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#54ba3bd638eba3ad06d390693f834d5a" title="The value type of the btree. Returned by operator*().">value_type</a>& <a class="code" href="classstx_1_1btree_1_1const__iterator.html#b5742e1d907c75d66953c82c726f55a6" title="Reference to the value_type. STL required.">reference</a>;
<a name="l00584"></a>00584
<a name="l00586"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#7c13c3c2d1c3063baaec0290ec9e89a1">00586</a> <span class="keyword">typedef</span> <span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#54ba3bd638eba3ad06d390693f834d5a" title="The value type of the btree. Returned by operator*().">value_type</a>* <a class="code" href="classstx_1_1btree_1_1const__iterator.html#7c13c3c2d1c3063baaec0290ec9e89a1" title="Pointer to the value_type. STL required.">pointer</a>;
<a name="l00587"></a>00587
<a name="l00589"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#94d6552fb9477f0d6c7e463028c4b6a9">00589</a> <span class="keyword">typedef</span> std::bidirectional_iterator_tag <a class="code" href="classstx_1_1btree_1_1const__iterator.html#94d6552fb9477f0d6c7e463028c4b6a9" title="STL-magic iterator category.">iterator_category</a>;
<a name="l00590"></a>00590
<a name="l00592"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#1b514d8539ce1d3d2e535254a4f2e603">00592</a> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="classstx_1_1btree_1_1const__iterator.html#1b514d8539ce1d3d2e535254a4f2e603" title="STL-magic.">difference_type</a>;
<a name="l00593"></a>00593
<a name="l00595"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#977f73c4ae2c0e378710996449199643">00595</a> <span class="keyword">typedef</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html" title="STL-like read-only iterator object for B+ tree items.">const_iterator</a> <span class="keyword">self</span>;
<a name="l00596"></a>00596
<a name="l00597"></a>00597 <span class="keyword">private</span>:
<a name="l00598"></a>00598 <span class="comment">// *** Members</span>
<a name="l00599"></a>00599
<a name="l00601"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4">00601</a> <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="structstx_1_1btree_1_1leaf__node.html" title="Extended structure of a leaf node in memory.">btree::leaf_node</a>* <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>;
<a name="l00602"></a>00602
<a name="l00604"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f">00604</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>;
<a name="l00605"></a>00605
<a name="l00607"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#776e261b45ef26d713a4d105a8d7c240">00607</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html" title="STL-like read-only reverse iterator object for B+ tree items.">const_reverse_iterator</a>;
<a name="l00608"></a>00608
<a name="l00611"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#eb13d8c406c8104986e8c234efc88cb4">00611</a> <span class="keyword">mutable</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#54ba3bd638eba3ad06d390693f834d5a" title="The value type of the btree. Returned by operator*().">value_type</a> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#eb13d8c406c8104986e8c234efc88cb4" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a>;
<a name="l00612"></a>00612
<a name="l00613"></a>00613 <span class="comment">// The macro BTREE_FRIENDS can be used by outside class to access the B+</span>
<a name="l00614"></a>00614 <span class="comment">// tree internals. This was added for wxBTreeDemo to be able to draw the</span>
<a name="l00615"></a>00615 <span class="comment">// tree.</span>
<a name="l00616"></a>00616 <a class="code" href="btree_8h.html#ec07a93b351ce398f789007a441a4320" title="The macro BTREE_FRIENDS can be used by outside class to access the B+ tree internals...">BTREE_FRIENDS</a>
<a name="l00617"></a>00617
<a name="l00618"></a>00618 <span class="keyword">public</span>:
<a name="l00619"></a>00619 <span class="comment">// *** Methods</span>
<a name="l00620"></a>00620
<a name="l00622"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#fbf748c058e755788da0cc0a51e6bad7">00622</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#fbf748c058e755788da0cc0a51e6bad7" title="Default-Constructor of a const iterator.">const_iterator</a>()
<a name="l00623"></a>00623 : <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>(NULL), <a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>(0)
<a name="l00624"></a>00624 { }
<a name="l00625"></a>00625
<a name="l00627"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#4c60af20a1b398fe64f1e18d79aa0478">00627</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#fbf748c058e755788da0cc0a51e6bad7" title="Default-Constructor of a const iterator.">const_iterator</a>(<span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="structstx_1_1btree_1_1leaf__node.html" title="Extended structure of a leaf node in memory.">btree::leaf_node</a> *l, <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> s)
<a name="l00628"></a>00628 : <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>(l), <a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>(s)
<a name="l00629"></a>00629 { }
<a name="l00630"></a>00630
<a name="l00632"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#e9da619caaf864c8ff450ab6e6e783fe">00632</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#fbf748c058e755788da0cc0a51e6bad7" title="Default-Constructor of a const iterator.">const_iterator</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1iterator.html" title="STL-like iterator object for B+ tree items.">iterator</a> &it)
<a name="l00633"></a>00633 : <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>(it.<a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>), <a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>(it.<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>)
<a name="l00634"></a>00634 { }
<a name="l00635"></a>00635
<a name="l00637"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#3c861b45c5cc4b1f8d5356f2fb5c5ccd">00637</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#fbf748c058e755788da0cc0a51e6bad7" title="Default-Constructor of a const iterator.">const_iterator</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html" title="STL-like mutable reverse iterator object for B+ tree items.">reverse_iterator</a> &it)
<a name="l00638"></a>00638 : <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>(it.<a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>), <a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>(it.<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>)
<a name="l00639"></a>00639 { }
<a name="l00640"></a>00640
<a name="l00642"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#cb0803e93acf0ee8adbe37a27a7bb023">00642</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#fbf748c058e755788da0cc0a51e6bad7" title="Default-Constructor of a const iterator.">const_iterator</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html" title="STL-like read-only reverse iterator object for B+ tree items.">const_reverse_iterator</a> &it)
<a name="l00643"></a>00643 : <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>(it.<a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>), <a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>(it.<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>)
<a name="l00644"></a>00644 { }
<a name="l00645"></a>00645
<a name="l00649"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#75c8d475324653ad448aca382c762780">00649</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#b5742e1d907c75d66953c82c726f55a6" title="Reference to the value_type. STL required.">reference</a> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#75c8d475324653ad448aca382c762780" title="Dereference the iterator.">operator*</a>()<span class="keyword"> const</span>
<a name="l00650"></a>00650 <span class="keyword"> </span>{
<a name="l00651"></a>00651 <a class="code" href="classstx_1_1btree_1_1const__iterator.html#eb13d8c406c8104986e8c234efc88cb4" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a> = <a class="code" href="classstx_1_1btree.html#d00ea2b529c201236f4c79cd50acf42e" title="Using template specialization select the correct converter used by the iterators...">pair_to_value_type</a>()( <a class="code" href="classstx_1_1btree_1_1const__iterator.html#5e113524050bb4bf2700a7f8e0d343dd" title="The pair type of the btree.">pair_type</a>(<a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#cdae18752022a3f57ecb2be00bbe4dfd" title="Keys of children or data pointers.">slotkey</a>[<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>],
<a name="l00652"></a>00652 <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#06d022590b9aa76fd0f0ff56c48b1eb5" title="Array of data.">slotdata</a>[<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>]) );
<a name="l00653"></a>00653 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#eb13d8c406c8104986e8c234efc88cb4" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a>;
<a name="l00654"></a>00654 }
<a name="l00655"></a>00655
<a name="l00659"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#21393707bc018e2429e786cf2d8c1870">00659</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#7c13c3c2d1c3063baaec0290ec9e89a1" title="Pointer to the value_type. STL required.">pointer</a> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#21393707bc018e2429e786cf2d8c1870" title="Dereference the iterator.">operator-></a>()<span class="keyword"> const</span>
<a name="l00660"></a>00660 <span class="keyword"> </span>{
<a name="l00661"></a>00661 <a class="code" href="classstx_1_1btree_1_1const__iterator.html#eb13d8c406c8104986e8c234efc88cb4" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a> = <a class="code" href="classstx_1_1btree.html#d00ea2b529c201236f4c79cd50acf42e" title="Using template specialization select the correct converter used by the iterators...">pair_to_value_type</a>()( <a class="code" href="classstx_1_1btree_1_1const__iterator.html#5e113524050bb4bf2700a7f8e0d343dd" title="The pair type of the btree.">pair_type</a>(<a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#cdae18752022a3f57ecb2be00bbe4dfd" title="Keys of children or data pointers.">slotkey</a>[<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>],
<a name="l00662"></a>00662 <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#06d022590b9aa76fd0f0ff56c48b1eb5" title="Array of data.">slotdata</a>[<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>]) );
<a name="l00663"></a>00663 <span class="keywordflow">return</span> &<a class="code" href="classstx_1_1btree_1_1const__iterator.html#eb13d8c406c8104986e8c234efc88cb4" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a>;
<a name="l00664"></a>00664 }
<a name="l00665"></a>00665
<a name="l00667"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#b57685e4d45fa7aded6d521815f28bad">00667</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#5b65028ba554270fc9e483b303daa431" title="The key type of the btree. Returned by key().">key_type</a>& <a class="code" href="classstx_1_1btree_1_1const__iterator.html#b57685e4d45fa7aded6d521815f28bad" title="Key of the current slot.">key</a>()<span class="keyword"> const</span>
<a name="l00668"></a>00668 <span class="keyword"> </span>{
<a name="l00669"></a>00669 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#cdae18752022a3f57ecb2be00bbe4dfd" title="Keys of children or data pointers.">slotkey</a>[<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>];
<a name="l00670"></a>00670 }
<a name="l00671"></a>00671
<a name="l00673"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#6238d924c309f48f2fc8738a383d48a6">00673</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#7ba0058d5b19c1c2025ad795827e85d0" title="The data type of the btree. Returned by data().">data_type</a>& <a class="code" href="classstx_1_1btree_1_1const__iterator.html#6238d924c309f48f2fc8738a383d48a6" title="Read-only reference to the current data object.">data</a>()<span class="keyword"> const</span>
<a name="l00674"></a>00674 <span class="keyword"> </span>{
<a name="l00675"></a>00675 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#06d022590b9aa76fd0f0ff56c48b1eb5" title="Array of data.">slotdata</a>[<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>];
<a name="l00676"></a>00676 }
<a name="l00677"></a>00677
<a name="l00679"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#5408c6e484d877de4e3af62ee83d6e98">00679</a> <span class="keyword">inline</span> <span class="keyword">self</span>& <a class="code" href="classstx_1_1btree_1_1const__iterator.html#5408c6e484d877de4e3af62ee83d6e98" title="Prefix++ advance the iterator to the next slot.">operator++</a>()
<a name="l00680"></a>00680 {
<a name="l00681"></a>00681 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a> + 1 < <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>) {
<a name="l00682"></a>00682 ++<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>;
<a name="l00683"></a>00683 }
<a name="l00684"></a>00684 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a> != NULL) {
<a name="l00685"></a>00685 <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a> = <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a>;
<a name="l00686"></a>00686 <a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a> = 0;
<a name="l00687"></a>00687 }
<a name="l00688"></a>00688 <span class="keywordflow">else</span> {
<a name="l00689"></a>00689 <span class="comment">// this is end()</span>
<a name="l00690"></a>00690 <a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a> = <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>;
<a name="l00691"></a>00691 }
<a name="l00692"></a>00692
<a name="l00693"></a>00693 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00694"></a>00694 }
<a name="l00695"></a>00695
<a name="l00697"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#e782a36af74ce768cc8e79b5b99e82f6">00697</a> <span class="keyword">inline</span> <span class="keyword">self</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#5408c6e484d877de4e3af62ee83d6e98" title="Prefix++ advance the iterator to the next slot.">operator++</a>(<span class="keywordtype">int</span>)
<a name="l00698"></a>00698 {
<a name="l00699"></a>00699 <span class="keyword">self</span> tmp = *<span class="keyword">this</span>; <span class="comment">// copy ourselves</span>
<a name="l00700"></a>00700
<a name="l00701"></a>00701 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a> + 1 < <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>) {
<a name="l00702"></a>00702 ++<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>;
<a name="l00703"></a>00703 }
<a name="l00704"></a>00704 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a> != NULL) {
<a name="l00705"></a>00705 <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a> = <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a>;
<a name="l00706"></a>00706 <a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a> = 0;
<a name="l00707"></a>00707 }
<a name="l00708"></a>00708 <span class="keywordflow">else</span> {
<a name="l00709"></a>00709 <span class="comment">// this is end()</span>
<a name="l00710"></a>00710 <a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a> = <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>;
<a name="l00711"></a>00711 }
<a name="l00712"></a>00712
<a name="l00713"></a>00713 <span class="keywordflow">return</span> tmp;
<a name="l00714"></a>00714 }
<a name="l00715"></a>00715
<a name="l00717"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#5ce3730eb2cb63642fe748d17f35f267">00717</a> <span class="keyword">inline</span> <span class="keyword">self</span>& <a class="code" href="classstx_1_1btree_1_1const__iterator.html#5ce3730eb2cb63642fe748d17f35f267" title="Prefix-- backstep the iterator to the last slot.">operator--</a>()
<a name="l00718"></a>00718 {
<a name="l00719"></a>00719 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a> > 0) {
<a name="l00720"></a>00720 --<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>;
<a name="l00721"></a>00721 }
<a name="l00722"></a>00722 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a> != NULL) {
<a name="l00723"></a>00723 <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a> = <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a>;
<a name="l00724"></a>00724 <a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a> = <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a> - 1;
<a name="l00725"></a>00725 }
<a name="l00726"></a>00726 <span class="keywordflow">else</span> {
<a name="l00727"></a>00727 <span class="comment">// this is begin()</span>
<a name="l00728"></a>00728 <a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a> = 0;
<a name="l00729"></a>00729 }
<a name="l00730"></a>00730
<a name="l00731"></a>00731 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00732"></a>00732 }
<a name="l00733"></a>00733
<a name="l00735"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#44d6aff6e865a0e906ff7c1273764208">00735</a> <span class="keyword">inline</span> <span class="keyword">self</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#5ce3730eb2cb63642fe748d17f35f267" title="Prefix-- backstep the iterator to the last slot.">operator--</a>(<span class="keywordtype">int</span>)
<a name="l00736"></a>00736 {
<a name="l00737"></a>00737 <span class="keyword">self</span> tmp = *<span class="keyword">this</span>; <span class="comment">// copy ourselves</span>
<a name="l00738"></a>00738
<a name="l00739"></a>00739 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a> > 0) {
<a name="l00740"></a>00740 --<a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>;
<a name="l00741"></a>00741 }
<a name="l00742"></a>00742 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a> != NULL) {
<a name="l00743"></a>00743 <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a> = <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a>;
<a name="l00744"></a>00744 <a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a> = <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a> - 1;
<a name="l00745"></a>00745 }
<a name="l00746"></a>00746 <span class="keywordflow">else</span> {
<a name="l00747"></a>00747 <span class="comment">// this is begin()</span>
<a name="l00748"></a>00748 <a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a> = 0;
<a name="l00749"></a>00749 }
<a name="l00750"></a>00750
<a name="l00751"></a>00751 <span class="keywordflow">return</span> tmp;
<a name="l00752"></a>00752 }
<a name="l00753"></a>00753
<a name="l00755"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#ba809408f780b903d2f0bee451289a9c">00755</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#ba809408f780b903d2f0bee451289a9c" title="Equality of iterators.">operator==</a>(<span class="keyword">const</span> <span class="keyword">self</span>& x)<span class="keyword"> const</span>
<a name="l00756"></a>00756 <span class="keyword"> </span>{
<a name="l00757"></a>00757 <span class="keywordflow">return</span> (x.currnode == <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>) && (x.currslot == <a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>);
<a name="l00758"></a>00758 }
<a name="l00759"></a>00759
<a name="l00761"></a><a class="code" href="classstx_1_1btree_1_1const__iterator.html#1b19065170d8111d9a1dd14f0afc2077">00761</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html#1b19065170d8111d9a1dd14f0afc2077" title="Inequality of iterators.">operator!=</a>(<span class="keyword">const</span> <span class="keyword">self</span>& x)<span class="keyword"> const</span>
<a name="l00762"></a>00762 <span class="keyword"> </span>{
<a name="l00763"></a>00763 <span class="keywordflow">return</span> (x.currnode != <a class="code" href="classstx_1_1btree_1_1const__iterator.html#4d697acee81e71bd0253198f4ba5e7f4" title="The currently referenced leaf node of the tree.">currnode</a>) || (x.currslot != <a class="code" href="classstx_1_1btree_1_1const__iterator.html#09845c35fb432d3b266162afb66f353f" title="Current key/data slot referenced.">currslot</a>);
<a name="l00764"></a>00764 }
<a name="l00765"></a>00765 };
<a name="l00766"></a>00766
<a name="l00769"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html">00769</a> <span class="keyword">class </span><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html" title="STL-like mutable reverse iterator object for B+ tree items.">reverse_iterator</a>
<a name="l00770"></a>00770 {
<a name="l00771"></a>00771 <span class="keyword">public</span>:
<a name="l00772"></a>00772 <span class="comment">// *** Types</span>
<a name="l00773"></a>00773
<a name="l00775"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#66f380254f295725e8353746bd310e9e">00775</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">btree::key_type</a> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#66f380254f295725e8353746bd310e9e" title="The key type of the btree. Returned by key().">key_type</a>;
<a name="l00776"></a>00776
<a name="l00778"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#2453d2750e538d8521b80279ee330ef1">00778</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#ca29ad902418d86eeb9b9379a38e5fcd" title="Second template parameter: The data type associated with each key.">btree::data_type</a> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#2453d2750e538d8521b80279ee330ef1" title="The data type of the btree. Returned by data().">data_type</a>;
<a name="l00779"></a>00779
<a name="l00781"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#247af84e9e741bf4016fd9d8b74ce8c6">00781</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#84c95e7319c922fe297b4acdf2e0910c" title="Third template parameter: Composition pair of key and data types, this is required...">btree::value_type</a> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#247af84e9e741bf4016fd9d8b74ce8c6" title="The value type of the btree. Returned by operator*().">value_type</a>;
<a name="l00782"></a>00782
<a name="l00784"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#fe512f590be2cd387f36161db1d40aa2">00784</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#f7a75a733f8547491913b0e5b8d11a4e" title="The pair of key_type and data_type, this may be different from value_type.">btree::pair_type</a> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#fe512f590be2cd387f36161db1d40aa2" title="The pair type of the btree.">pair_type</a>;
<a name="l00785"></a>00785
<a name="l00787"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#b8089a81851f6ecb1139e31bc7d71e73">00787</a> <span class="keyword">typedef</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#247af84e9e741bf4016fd9d8b74ce8c6" title="The value type of the btree. Returned by operator*().">value_type</a>& <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#b8089a81851f6ecb1139e31bc7d71e73" title="Reference to the value_type. STL required.">reference</a>;
<a name="l00788"></a>00788
<a name="l00790"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#ddf61f439651c2211ca735e13b95499e">00790</a> <span class="keyword">typedef</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#247af84e9e741bf4016fd9d8b74ce8c6" title="The value type of the btree. Returned by operator*().">value_type</a>* <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#ddf61f439651c2211ca735e13b95499e" title="Pointer to the value_type. STL required.">pointer</a>;
<a name="l00791"></a>00791
<a name="l00793"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#d42a8a68e0e18dd5223d33a8db44f4df">00793</a> <span class="keyword">typedef</span> std::bidirectional_iterator_tag <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#d42a8a68e0e18dd5223d33a8db44f4df" title="STL-magic iterator category.">iterator_category</a>;
<a name="l00794"></a>00794
<a name="l00796"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#bb0a6e321b601546864194f42c7b190f">00796</a> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#bb0a6e321b601546864194f42c7b190f" title="STL-magic.">difference_type</a>;
<a name="l00797"></a>00797
<a name="l00799"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#9916fac9b4f52b0e03eeab0a39ef802a">00799</a> <span class="keyword">typedef</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html" title="STL-like mutable reverse iterator object for B+ tree items.">reverse_iterator</a> <span class="keyword">self</span>;
<a name="l00800"></a>00800
<a name="l00801"></a>00801 <span class="keyword">private</span>:
<a name="l00802"></a>00802 <span class="comment">// *** Members</span>
<a name="l00803"></a>00803
<a name="l00805"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b">00805</a> <span class="keyword">typename</span> <a class="code" href="structstx_1_1btree_1_1leaf__node.html" title="Extended structure of a leaf node in memory.">btree::leaf_node</a>* <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>;
<a name="l00806"></a>00806
<a name="l00808"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb">00808</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a>;
<a name="l00809"></a>00809
<a name="l00811"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#67171474c4da6cc8efe0c7fafefd2b2d">00811</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classstx_1_1btree_1_1iterator.html" title="STL-like iterator object for B+ tree items.">iterator</a>;
<a name="l00812"></a>00812
<a name="l00814"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#c220ce1c155db1ac44146c12d178056f">00814</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classstx_1_1btree_1_1const__iterator.html" title="STL-like read-only iterator object for B+ tree items.">const_iterator</a>;
<a name="l00815"></a>00815
<a name="l00817"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#776e261b45ef26d713a4d105a8d7c240">00817</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html" title="STL-like read-only reverse iterator object for B+ tree items.">const_reverse_iterator</a>;
<a name="l00818"></a>00818
<a name="l00821"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#d8ddb7b716ae1c8961dbedfbf45558c4">00821</a> <span class="keyword">mutable</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#247af84e9e741bf4016fd9d8b74ce8c6" title="The value type of the btree. Returned by operator*().">value_type</a> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#d8ddb7b716ae1c8961dbedfbf45558c4" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a>;
<a name="l00822"></a>00822
<a name="l00823"></a>00823 <span class="comment">// The macro BTREE_FRIENDS can be used by outside class to access the B+</span>
<a name="l00824"></a>00824 <span class="comment">// tree internals. This was added for wxBTreeDemo to be able to draw the</span>
<a name="l00825"></a>00825 <span class="comment">// tree.</span>
<a name="l00826"></a>00826 <a class="code" href="btree_8h.html#ec07a93b351ce398f789007a441a4320" title="The macro BTREE_FRIENDS can be used by outside class to access the B+ tree internals...">BTREE_FRIENDS</a>
<a name="l00827"></a>00827
<a name="l00828"></a>00828 <span class="keyword">public</span>:
<a name="l00829"></a>00829 <span class="comment">// *** Methods</span>
<a name="l00830"></a>00830
<a name="l00832"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#dc930337fbfdfe7d8695ae767aeecb04">00832</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#dc930337fbfdfe7d8695ae767aeecb04" title="Default-Constructor of a reverse iterator.">reverse_iterator</a>()
<a name="l00833"></a>00833 : <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>(NULL), <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a>(0)
<a name="l00834"></a>00834 { }
<a name="l00835"></a>00835
<a name="l00837"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#942c42f2f84077e44555ebb508f721b5">00837</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#dc930337fbfdfe7d8695ae767aeecb04" title="Default-Constructor of a reverse iterator.">reverse_iterator</a>(<span class="keyword">typename</span> <a class="code" href="structstx_1_1btree_1_1leaf__node.html" title="Extended structure of a leaf node in memory.">btree::leaf_node</a> *l, <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> s)
<a name="l00838"></a>00838 : <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>(l), <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a>(s)
<a name="l00839"></a>00839 { }
<a name="l00840"></a>00840
<a name="l00842"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#ee4cd3c0a8ac9d5f4b2eed5a7de84638">00842</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#dc930337fbfdfe7d8695ae767aeecb04" title="Default-Constructor of a reverse iterator.">reverse_iterator</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1iterator.html" title="STL-like iterator object for B+ tree items.">iterator</a> &it)
<a name="l00843"></a>00843 : <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>(it.<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>), <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a>(it.<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a>)
<a name="l00844"></a>00844 { }
<a name="l00845"></a>00845
<a name="l00848"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#110782ef8a90b3b448a277b6a0438060">00848</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#b8089a81851f6ecb1139e31bc7d71e73" title="Reference to the value_type. STL required.">reference</a> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#110782ef8a90b3b448a277b6a0438060" title="Dereference the iterator, this is not a value_type&amp; because key and value are...">operator*</a>()<span class="keyword"> const</span>
<a name="l00849"></a>00849 <span class="keyword"> </span>{
<a name="l00850"></a>00850 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> > 0);
<a name="l00851"></a>00851 <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#d8ddb7b716ae1c8961dbedfbf45558c4" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a> = <a class="code" href="classstx_1_1btree.html#d00ea2b529c201236f4c79cd50acf42e" title="Using template specialization select the correct converter used by the iterators...">pair_to_value_type</a>()( <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#fe512f590be2cd387f36161db1d40aa2" title="The pair type of the btree.">pair_type</a>(<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#cdae18752022a3f57ecb2be00bbe4dfd" title="Keys of children or data pointers.">slotkey</a>[<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> - 1],
<a name="l00852"></a>00852 <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#06d022590b9aa76fd0f0ff56c48b1eb5" title="Array of data.">slotdata</a>[<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> - 1]) );
<a name="l00853"></a>00853 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#d8ddb7b716ae1c8961dbedfbf45558c4" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a>;
<a name="l00854"></a>00854 }
<a name="l00855"></a>00855
<a name="l00859"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#7cf1f59f7067ad424eda2d350e24ad61">00859</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#ddf61f439651c2211ca735e13b95499e" title="Pointer to the value_type. STL required.">pointer</a> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#7cf1f59f7067ad424eda2d350e24ad61" title="Dereference the iterator.">operator-></a>()<span class="keyword"> const</span>
<a name="l00860"></a>00860 <span class="keyword"> </span>{
<a name="l00861"></a>00861 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> > 0);
<a name="l00862"></a>00862 <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#d8ddb7b716ae1c8961dbedfbf45558c4" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a> = <a class="code" href="classstx_1_1btree.html#d00ea2b529c201236f4c79cd50acf42e" title="Using template specialization select the correct converter used by the iterators...">pair_to_value_type</a>()( <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#fe512f590be2cd387f36161db1d40aa2" title="The pair type of the btree.">pair_type</a>(<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#cdae18752022a3f57ecb2be00bbe4dfd" title="Keys of children or data pointers.">slotkey</a>[<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> - 1],
<a name="l00863"></a>00863 <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#06d022590b9aa76fd0f0ff56c48b1eb5" title="Array of data.">slotdata</a>[<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> - 1]) );
<a name="l00864"></a>00864 <span class="keywordflow">return</span> &<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#d8ddb7b716ae1c8961dbedfbf45558c4" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a>;
<a name="l00865"></a>00865 }
<a name="l00866"></a>00866
<a name="l00868"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#3e1445cd918ee3b368c64cb90f55934d">00868</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#66f380254f295725e8353746bd310e9e" title="The key type of the btree. Returned by key().">key_type</a>& <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#3e1445cd918ee3b368c64cb90f55934d" title="Key of the current slot.">key</a>()<span class="keyword"> const</span>
<a name="l00869"></a>00869 <span class="keyword"> </span>{
<a name="l00870"></a>00870 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> > 0);
<a name="l00871"></a>00871 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#cdae18752022a3f57ecb2be00bbe4dfd" title="Keys of children or data pointers.">slotkey</a>[<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> - 1];
<a name="l00872"></a>00872 }
<a name="l00873"></a>00873
<a name="l00875"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#0056decb2183dc22d7d8e5994518a8be">00875</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#2453d2750e538d8521b80279ee330ef1" title="The data type of the btree. Returned by data().">data_type</a>& <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#0056decb2183dc22d7d8e5994518a8be" title="Writable reference to the current data object.">data</a>()<span class="keyword"> const</span>
<a name="l00876"></a>00876 <span class="keyword"> </span>{
<a name="l00877"></a>00877 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> > 0);
<a name="l00878"></a>00878 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#06d022590b9aa76fd0f0ff56c48b1eb5" title="Array of data.">slotdata</a>[<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> - 1];
<a name="l00879"></a>00879 }
<a name="l00880"></a>00880
<a name="l00882"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#32a43833c93d3575c3029e71961b2e18">00882</a> <span class="keyword">inline</span> <span class="keyword">self</span>& <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#32a43833c93d3575c3029e71961b2e18" title="Prefix++ advance the iterator to the next slot.">operator++</a>()
<a name="l00883"></a>00883 {
<a name="l00884"></a>00884 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> > 1) {
<a name="l00885"></a>00885 --<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a>;
<a name="l00886"></a>00886 }
<a name="l00887"></a>00887 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a> != NULL) {
<a name="l00888"></a>00888 <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a> = <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a>;
<a name="l00889"></a>00889 <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> = <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>;
<a name="l00890"></a>00890 }
<a name="l00891"></a>00891 <span class="keywordflow">else</span> {
<a name="l00892"></a>00892 <span class="comment">// this is begin() == rend()</span>
<a name="l00893"></a>00893 <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> = 0;
<a name="l00894"></a>00894 }
<a name="l00895"></a>00895
<a name="l00896"></a>00896 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00897"></a>00897 }
<a name="l00898"></a>00898
<a name="l00900"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#e399756fc8cfc2083edfdd0c9ba5b512">00900</a> <span class="keyword">inline</span> <span class="keyword">self</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#32a43833c93d3575c3029e71961b2e18" title="Prefix++ advance the iterator to the next slot.">operator++</a>(<span class="keywordtype">int</span>)
<a name="l00901"></a>00901 {
<a name="l00902"></a>00902 <span class="keyword">self</span> tmp = *<span class="keyword">this</span>; <span class="comment">// copy ourselves</span>
<a name="l00903"></a>00903
<a name="l00904"></a>00904 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> > 1) {
<a name="l00905"></a>00905 --<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a>;
<a name="l00906"></a>00906 }
<a name="l00907"></a>00907 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a> != NULL) {
<a name="l00908"></a>00908 <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a> = <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a>;
<a name="l00909"></a>00909 <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> = <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>;
<a name="l00910"></a>00910 }
<a name="l00911"></a>00911 <span class="keywordflow">else</span> {
<a name="l00912"></a>00912 <span class="comment">// this is begin() == rend()</span>
<a name="l00913"></a>00913 <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> = 0;
<a name="l00914"></a>00914 }
<a name="l00915"></a>00915
<a name="l00916"></a>00916 <span class="keywordflow">return</span> tmp;
<a name="l00917"></a>00917 }
<a name="l00918"></a>00918
<a name="l00920"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#2d52f9be84cad1cd68c81358e2c7516e">00920</a> <span class="keyword">inline</span> <span class="keyword">self</span>& <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#2d52f9be84cad1cd68c81358e2c7516e" title="Prefix-- backstep the iterator to the last slot.">operator--</a>()
<a name="l00921"></a>00921 {
<a name="l00922"></a>00922 <span class="keywordflow">if</span> (currslot < currnode->slotuse) {
<a name="l00923"></a>00923 ++<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a>;
<a name="l00924"></a>00924 }
<a name="l00925"></a>00925 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a> != NULL) {
<a name="l00926"></a>00926 <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a> = <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a>;
<a name="l00927"></a>00927 <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> = 1;
<a name="l00928"></a>00928 }
<a name="l00929"></a>00929 <span class="keywordflow">else</span> {
<a name="l00930"></a>00930 <span class="comment">// this is end() == rbegin()</span>
<a name="l00931"></a>00931 <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> = <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>;
<a name="l00932"></a>00932 }
<a name="l00933"></a>00933
<a name="l00934"></a>00934 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00935"></a>00935 }
<a name="l00936"></a>00936
<a name="l00938"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#b7ed3ee689c5c4331a2bac12c37b1c60">00938</a> <span class="keyword">inline</span> <span class="keyword">self</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#2d52f9be84cad1cd68c81358e2c7516e" title="Prefix-- backstep the iterator to the last slot.">operator--</a>(<span class="keywordtype">int</span>)
<a name="l00939"></a>00939 {
<a name="l00940"></a>00940 <span class="keyword">self</span> tmp = *<span class="keyword">this</span>; <span class="comment">// copy ourselves</span>
<a name="l00941"></a>00941
<a name="l00942"></a>00942 <span class="keywordflow">if</span> (currslot < currnode->slotuse) {
<a name="l00943"></a>00943 ++<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a>;
<a name="l00944"></a>00944 }
<a name="l00945"></a>00945 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a> != NULL) {
<a name="l00946"></a>00946 <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a> = <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a>;
<a name="l00947"></a>00947 <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> = 1;
<a name="l00948"></a>00948 }
<a name="l00949"></a>00949 <span class="keywordflow">else</span> {
<a name="l00950"></a>00950 <span class="comment">// this is end() == rbegin()</span>
<a name="l00951"></a>00951 <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a> = <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>;
<a name="l00952"></a>00952 }
<a name="l00953"></a>00953
<a name="l00954"></a>00954 <span class="keywordflow">return</span> tmp;
<a name="l00955"></a>00955 }
<a name="l00956"></a>00956
<a name="l00958"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#5752beca147bbbbcb8db504c67f1384a">00958</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#5752beca147bbbbcb8db504c67f1384a" title="Equality of iterators.">operator==</a>(<span class="keyword">const</span> <span class="keyword">self</span>& x)<span class="keyword"> const</span>
<a name="l00959"></a>00959 <span class="keyword"> </span>{
<a name="l00960"></a>00960 <span class="keywordflow">return</span> (x.currnode == <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>) && (x.currslot == <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a>);
<a name="l00961"></a>00961 }
<a name="l00962"></a>00962
<a name="l00964"></a><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#e6185e295de3fb1e871cd6168c557531">00964</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#e6185e295de3fb1e871cd6168c557531" title="Inequality of iterators.">operator!=</a>(<span class="keyword">const</span> <span class="keyword">self</span>& x)<span class="keyword"> const</span>
<a name="l00965"></a>00965 <span class="keyword"> </span>{
<a name="l00966"></a>00966 <span class="keywordflow">return</span> (x.currnode != <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6f60ff1ff14334b29a6afc8970ae68b" title="The currently referenced leaf node of the tree.">currnode</a>) || (x.currslot != <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html#f6baa205bdc742b41e1c8b21bb28c2fb" title="One slot past the current key/data slot referenced.">currslot</a>);
<a name="l00967"></a>00967 }
<a name="l00968"></a>00968 };
<a name="l00969"></a>00969
<a name="l00972"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html">00972</a> <span class="keyword">class </span><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html" title="STL-like read-only reverse iterator object for B+ tree items.">const_reverse_iterator</a>
<a name="l00973"></a>00973 {
<a name="l00974"></a>00974 <span class="keyword">public</span>:
<a name="l00975"></a>00975 <span class="comment">// *** Types</span>
<a name="l00976"></a>00976
<a name="l00978"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#1e60bb315384bd6d3fc4ff946057a360">00978</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">btree::key_type</a> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#1e60bb315384bd6d3fc4ff946057a360" title="The key type of the btree. Returned by key().">key_type</a>;
<a name="l00979"></a>00979
<a name="l00981"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#106f94074dbdb77fb2421536d718e15c">00981</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#ca29ad902418d86eeb9b9379a38e5fcd" title="Second template parameter: The data type associated with each key.">btree::data_type</a> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#106f94074dbdb77fb2421536d718e15c" title="The data type of the btree. Returned by data().">data_type</a>;
<a name="l00982"></a>00982
<a name="l00984"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#eaedc04c88fe4839aa51107ca222f818">00984</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#84c95e7319c922fe297b4acdf2e0910c" title="Third template parameter: Composition pair of key and data types, this is required...">btree::value_type</a> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#eaedc04c88fe4839aa51107ca222f818" title="The value type of the btree. Returned by operator*().">value_type</a>;
<a name="l00985"></a>00985
<a name="l00987"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#3e5c5e8489b2db3eab6d190d571f27c6">00987</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#f7a75a733f8547491913b0e5b8d11a4e" title="The pair of key_type and data_type, this may be different from value_type.">btree::pair_type</a> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#3e5c5e8489b2db3eab6d190d571f27c6" title="The pair type of the btree.">pair_type</a>;
<a name="l00988"></a>00988
<a name="l00990"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#3a0398260c421ca4de4083552d8ab546">00990</a> <span class="keyword">typedef</span> <span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#eaedc04c88fe4839aa51107ca222f818" title="The value type of the btree. Returned by operator*().">value_type</a>& <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#3a0398260c421ca4de4083552d8ab546" title="Reference to the value_type. STL required.">reference</a>;
<a name="l00991"></a>00991
<a name="l00993"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#c12c887effa006d48c61ff60bb170abd">00993</a> <span class="keyword">typedef</span> <span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#eaedc04c88fe4839aa51107ca222f818" title="The value type of the btree. Returned by operator*().">value_type</a>* <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#c12c887effa006d48c61ff60bb170abd" title="Pointer to the value_type. STL required.">pointer</a>;
<a name="l00994"></a>00994
<a name="l00996"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#822570226458d3e68de30d9f6ed013f1">00996</a> <span class="keyword">typedef</span> std::bidirectional_iterator_tag <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#822570226458d3e68de30d9f6ed013f1" title="STL-magic iterator category.">iterator_category</a>;
<a name="l00997"></a>00997
<a name="l00999"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#0dfa5c3c516b3748600046fb88e5c73a">00999</a> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#0dfa5c3c516b3748600046fb88e5c73a" title="STL-magic.">difference_type</a>;
<a name="l01000"></a>01000
<a name="l01002"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#e67c029008badd15c95bc143c98e87ee">01002</a> <span class="keyword">typedef</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html" title="STL-like read-only reverse iterator object for B+ tree items.">const_reverse_iterator</a> <span class="keyword">self</span>;
<a name="l01003"></a>01003
<a name="l01004"></a>01004 <span class="keyword">private</span>:
<a name="l01005"></a>01005 <span class="comment">// *** Members</span>
<a name="l01006"></a>01006
<a name="l01008"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223">01008</a> <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="structstx_1_1btree_1_1leaf__node.html" title="Extended structure of a leaf node in memory.">btree::leaf_node</a>* <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>;
<a name="l01009"></a>01009
<a name="l01011"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e">01011</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a>;
<a name="l01012"></a>01012
<a name="l01014"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#f0a70641f2216cc31420487a62dd3b0d">01014</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classstx_1_1btree_1_1reverse__iterator.html" title="STL-like mutable reverse iterator object for B+ tree items.">reverse_iterator</a>;
<a name="l01015"></a>01015
<a name="l01018"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#7fda84dc75435d77ade7165735384ab3">01018</a> <span class="keyword">mutable</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#eaedc04c88fe4839aa51107ca222f818" title="The value type of the btree. Returned by operator*().">value_type</a> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#7fda84dc75435d77ade7165735384ab3" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a>;
<a name="l01019"></a>01019
<a name="l01020"></a>01020 <span class="comment">// The macro BTREE_FRIENDS can be used by outside class to access the B+</span>
<a name="l01021"></a>01021 <span class="comment">// tree internals. This was added for wxBTreeDemo to be able to draw the</span>
<a name="l01022"></a>01022 <span class="comment">// tree.</span>
<a name="l01023"></a>01023 <a class="code" href="btree_8h.html#ec07a93b351ce398f789007a441a4320" title="The macro BTREE_FRIENDS can be used by outside class to access the B+ tree internals...">BTREE_FRIENDS</a>
<a name="l01024"></a>01024
<a name="l01025"></a>01025 <span class="keyword">public</span>:
<a name="l01026"></a>01026 <span class="comment">// *** Methods</span>
<a name="l01027"></a>01027
<a name="l01029"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#0aac51015383e5493742b39c50ef193b">01029</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#0aac51015383e5493742b39c50ef193b" title="Default-Constructor of a const reverse iterator.">const_reverse_iterator</a>()
<a name="l01030"></a>01030 : <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>(NULL), <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a>(0)
<a name="l01031"></a>01031 { }
<a name="l01032"></a>01032
<a name="l01034"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#883d9b09368fd58f0c3c6b6b5aa6a296">01034</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#0aac51015383e5493742b39c50ef193b" title="Default-Constructor of a const reverse iterator.">const_reverse_iterator</a>(<span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="structstx_1_1btree_1_1leaf__node.html" title="Extended structure of a leaf node in memory.">btree::leaf_node</a> *l, <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> s)
<a name="l01035"></a>01035 : <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>(l), <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a>(s)
<a name="l01036"></a>01036 { }
<a name="l01037"></a>01037
<a name="l01039"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#2837430dc7496bc770e099d95e542465">01039</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#0aac51015383e5493742b39c50ef193b" title="Default-Constructor of a const reverse iterator.">const_reverse_iterator</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1iterator.html" title="STL-like iterator object for B+ tree items.">iterator</a> &it)
<a name="l01040"></a>01040 : <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>(it.<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>), <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a>(it.<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a>)
<a name="l01041"></a>01041 { }
<a name="l01042"></a>01042
<a name="l01044"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#f2ed10f3956cd4ab2b980d8535dd15b2">01044</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#0aac51015383e5493742b39c50ef193b" title="Default-Constructor of a const reverse iterator.">const_reverse_iterator</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1const__iterator.html" title="STL-like read-only iterator object for B+ tree items.">const_iterator</a> &it)
<a name="l01045"></a>01045 : <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>(it.<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>), <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a>(it.<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a>)
<a name="l01046"></a>01046 { }
<a name="l01047"></a>01047
<a name="l01049"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#6060264962f1acbb77b632cef29c50ca">01049</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#0aac51015383e5493742b39c50ef193b" title="Default-Constructor of a const reverse iterator.">const_reverse_iterator</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1reverse__iterator.html" title="STL-like mutable reverse iterator object for B+ tree items.">reverse_iterator</a> &it)
<a name="l01050"></a>01050 : <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>(it.<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>), <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a>(it.<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a>)
<a name="l01051"></a>01051 { }
<a name="l01052"></a>01052
<a name="l01056"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#92db70365bc6e1f7dceb362963fe7c73">01056</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#3a0398260c421ca4de4083552d8ab546" title="Reference to the value_type. STL required.">reference</a> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#92db70365bc6e1f7dceb362963fe7c73" title="Dereference the iterator.">operator*</a>()<span class="keyword"> const</span>
<a name="l01057"></a>01057 <span class="keyword"> </span>{
<a name="l01058"></a>01058 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> > 0);
<a name="l01059"></a>01059 <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#7fda84dc75435d77ade7165735384ab3" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a> = <a class="code" href="classstx_1_1btree.html#d00ea2b529c201236f4c79cd50acf42e" title="Using template specialization select the correct converter used by the iterators...">pair_to_value_type</a>()( <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#3e5c5e8489b2db3eab6d190d571f27c6" title="The pair type of the btree.">pair_type</a>(<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#cdae18752022a3f57ecb2be00bbe4dfd" title="Keys of children or data pointers.">slotkey</a>[<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> - 1],
<a name="l01060"></a>01060 <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#06d022590b9aa76fd0f0ff56c48b1eb5" title="Array of data.">slotdata</a>[<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> - 1]) );
<a name="l01061"></a>01061 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#7fda84dc75435d77ade7165735384ab3" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a>;
<a name="l01062"></a>01062 }
<a name="l01063"></a>01063
<a name="l01067"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#40d50567f95956b58c78128361a7e15f">01067</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#c12c887effa006d48c61ff60bb170abd" title="Pointer to the value_type. STL required.">pointer</a> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#40d50567f95956b58c78128361a7e15f" title="Dereference the iterator.">operator-></a>()<span class="keyword"> const</span>
<a name="l01068"></a>01068 <span class="keyword"> </span>{
<a name="l01069"></a>01069 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> > 0);
<a name="l01070"></a>01070 <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#7fda84dc75435d77ade7165735384ab3" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a> = <a class="code" href="classstx_1_1btree.html#d00ea2b529c201236f4c79cd50acf42e" title="Using template specialization select the correct converter used by the iterators...">pair_to_value_type</a>()( <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#3e5c5e8489b2db3eab6d190d571f27c6" title="The pair type of the btree.">pair_type</a>(<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#cdae18752022a3f57ecb2be00bbe4dfd" title="Keys of children or data pointers.">slotkey</a>[<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> - 1],
<a name="l01071"></a>01071 <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#06d022590b9aa76fd0f0ff56c48b1eb5" title="Array of data.">slotdata</a>[<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> - 1]) );
<a name="l01072"></a>01072 <span class="keywordflow">return</span> &<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#7fda84dc75435d77ade7165735384ab3" title="Evil! A temporary value_type to STL-correctly deliver operator* and operator-&gt;...">temp_value</a>;
<a name="l01073"></a>01073 }
<a name="l01074"></a>01074
<a name="l01076"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#f793b31f244d2a03ab394b466387a372">01076</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#1e60bb315384bd6d3fc4ff946057a360" title="The key type of the btree. Returned by key().">key_type</a>& <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#f793b31f244d2a03ab394b466387a372" title="Key of the current slot.">key</a>()<span class="keyword"> const</span>
<a name="l01077"></a>01077 <span class="keyword"> </span>{
<a name="l01078"></a>01078 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> > 0);
<a name="l01079"></a>01079 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#cdae18752022a3f57ecb2be00bbe4dfd" title="Keys of children or data pointers.">slotkey</a>[<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> - 1];
<a name="l01080"></a>01080 }
<a name="l01081"></a>01081
<a name="l01083"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#4703b48f546c796e956df7bbe5373e39">01083</a> <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#106f94074dbdb77fb2421536d718e15c" title="The data type of the btree. Returned by data().">data_type</a>& <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#4703b48f546c796e956df7bbe5373e39" title="Read-only reference to the current data object.">data</a>()<span class="keyword"> const</span>
<a name="l01084"></a>01084 <span class="keyword"> </span>{
<a name="l01085"></a>01085 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> > 0);
<a name="l01086"></a>01086 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#06d022590b9aa76fd0f0ff56c48b1eb5" title="Array of data.">slotdata</a>[<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> - 1];
<a name="l01087"></a>01087 }
<a name="l01088"></a>01088
<a name="l01090"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#c1e04aa8c7bd265db02fecc8003bbdc6">01090</a> <span class="keyword">inline</span> <span class="keyword">self</span>& <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#c1e04aa8c7bd265db02fecc8003bbdc6" title="Prefix++ advance the iterator to the previous slot.">operator++</a>()
<a name="l01091"></a>01091 {
<a name="l01092"></a>01092 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> > 1) {
<a name="l01093"></a>01093 --<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a>;
<a name="l01094"></a>01094 }
<a name="l01095"></a>01095 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a> != NULL) {
<a name="l01096"></a>01096 <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a> = <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a>;
<a name="l01097"></a>01097 <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> = <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>;
<a name="l01098"></a>01098 }
<a name="l01099"></a>01099 <span class="keywordflow">else</span> {
<a name="l01100"></a>01100 <span class="comment">// this is begin() == rend()</span>
<a name="l01101"></a>01101 <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> = 0;
<a name="l01102"></a>01102 }
<a name="l01103"></a>01103
<a name="l01104"></a>01104 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l01105"></a>01105 }
<a name="l01106"></a>01106
<a name="l01108"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#efc3b1b60154e0886097b49ec6da31b5">01108</a> <span class="keyword">inline</span> <span class="keyword">self</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#c1e04aa8c7bd265db02fecc8003bbdc6" title="Prefix++ advance the iterator to the previous slot.">operator++</a>(<span class="keywordtype">int</span>)
<a name="l01109"></a>01109 {
<a name="l01110"></a>01110 <span class="keyword">self</span> tmp = *<span class="keyword">this</span>; <span class="comment">// copy ourselves</span>
<a name="l01111"></a>01111
<a name="l01112"></a>01112 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> > 1) {
<a name="l01113"></a>01113 --<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a>;
<a name="l01114"></a>01114 }
<a name="l01115"></a>01115 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a> != NULL) {
<a name="l01116"></a>01116 <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a> = <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a>;
<a name="l01117"></a>01117 <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> = <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>;
<a name="l01118"></a>01118 }
<a name="l01119"></a>01119 <span class="keywordflow">else</span> {
<a name="l01120"></a>01120 <span class="comment">// this is begin() == rend()</span>
<a name="l01121"></a>01121 <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> = 0;
<a name="l01122"></a>01122 }
<a name="l01123"></a>01123
<a name="l01124"></a>01124 <span class="keywordflow">return</span> tmp;
<a name="l01125"></a>01125 }
<a name="l01126"></a>01126
<a name="l01128"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#1347b67882817c08da24344bb76f6398">01128</a> <span class="keyword">inline</span> <span class="keyword">self</span>& <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#1347b67882817c08da24344bb76f6398" title="Prefix-- backstep the iterator to the next slot.">operator--</a>()
<a name="l01129"></a>01129 {
<a name="l01130"></a>01130 <span class="keywordflow">if</span> (currslot < currnode->slotuse) {
<a name="l01131"></a>01131 ++<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a>;
<a name="l01132"></a>01132 }
<a name="l01133"></a>01133 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a> != NULL) {
<a name="l01134"></a>01134 <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a> = <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a>;
<a name="l01135"></a>01135 <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> = 1;
<a name="l01136"></a>01136 }
<a name="l01137"></a>01137 <span class="keywordflow">else</span> {
<a name="l01138"></a>01138 <span class="comment">// this is end() == rbegin()</span>
<a name="l01139"></a>01139 <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> = <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>;
<a name="l01140"></a>01140 }
<a name="l01141"></a>01141
<a name="l01142"></a>01142 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l01143"></a>01143 }
<a name="l01144"></a>01144
<a name="l01146"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#817df1b41f8b8710118469c7410d9254">01146</a> <span class="keyword">inline</span> <span class="keyword">self</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#1347b67882817c08da24344bb76f6398" title="Prefix-- backstep the iterator to the next slot.">operator--</a>(<span class="keywordtype">int</span>)
<a name="l01147"></a>01147 {
<a name="l01148"></a>01148 <span class="keyword">self</span> tmp = *<span class="keyword">this</span>; <span class="comment">// copy ourselves</span>
<a name="l01149"></a>01149
<a name="l01150"></a>01150 <span class="keywordflow">if</span> (currslot < currnode->slotuse) {
<a name="l01151"></a>01151 ++<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a>;
<a name="l01152"></a>01152 }
<a name="l01153"></a>01153 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a> != NULL) {
<a name="l01154"></a>01154 <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a> = <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a>;
<a name="l01155"></a>01155 <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> = 1;
<a name="l01156"></a>01156 }
<a name="l01157"></a>01157 <span class="keywordflow">else</span> {
<a name="l01158"></a>01158 <span class="comment">// this is end() == rbegin()</span>
<a name="l01159"></a>01159 <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a> = <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a>;
<a name="l01160"></a>01160 }
<a name="l01161"></a>01161
<a name="l01162"></a>01162 <span class="keywordflow">return</span> tmp;
<a name="l01163"></a>01163 }
<a name="l01164"></a>01164
<a name="l01166"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#b1b5359558d90265966fc675f8f0a79d">01166</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#b1b5359558d90265966fc675f8f0a79d" title="Equality of iterators.">operator==</a>(<span class="keyword">const</span> <span class="keyword">self</span>& x)<span class="keyword"> const</span>
<a name="l01167"></a>01167 <span class="keyword"> </span>{
<a name="l01168"></a>01168 <span class="keywordflow">return</span> (x.currnode == <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>) && (x.currslot == <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a>);
<a name="l01169"></a>01169 }
<a name="l01170"></a>01170
<a name="l01172"></a><a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#d137bc33fe6406998a6c30488112c5f5">01172</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#d137bc33fe6406998a6c30488112c5f5" title="Inequality of iterators.">operator!=</a>(<span class="keyword">const</span> <span class="keyword">self</span>& x)<span class="keyword"> const</span>
<a name="l01173"></a>01173 <span class="keyword"> </span>{
<a name="l01174"></a>01174 <span class="keywordflow">return</span> (x.currnode != <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#17dace563a5d3f0fa10d0d90cca24223" title="The currently referenced leaf node of the tree.">currnode</a>) || (x.currslot != <a class="code" href="classstx_1_1btree_1_1const__reverse__iterator.html#dae98850235d0be22f1864f08b62171e" title="One slot past the current key/data slot referenced.">currslot</a>);
<a name="l01175"></a>01175 }
<a name="l01176"></a>01176 };
<a name="l01177"></a>01177
<a name="l01178"></a>01178 <span class="keyword">public</span>:
<a name="l01179"></a>01179 <span class="comment">// *** Small Statistics Structure</span>
<a name="l01180"></a>01180
<a name="l01183"></a><a class="code" href="structstx_1_1btree_1_1tree__stats.html">01183</a> <span class="keyword">struct </span><a class="code" href="structstx_1_1btree_1_1tree__stats.html" title="A small struct containing basic statistics about the B+ tree.">tree_stats</a>
<a name="l01184"></a>01184 {
<a name="l01186"></a><a class="code" href="structstx_1_1btree_1_1tree__stats.html#8822d400b91499816b6c985e781e9018">01186</a> <a class="code" href="classstx_1_1btree.html#973470864b67129983ea4e1aa2132ac5" title="Size type used to count keys.">size_type</a> <a class="code" href="structstx_1_1btree_1_1tree__stats.html#8822d400b91499816b6c985e781e9018" title="Number of items in the B+ tree.">itemcount</a>;
<a name="l01187"></a>01187
<a name="l01189"></a><a class="code" href="structstx_1_1btree_1_1tree__stats.html#9e4f92e0aa1d90cbf823a3b072495be6">01189</a> <a class="code" href="classstx_1_1btree.html#973470864b67129983ea4e1aa2132ac5" title="Size type used to count keys.">size_type</a> <a class="code" href="structstx_1_1btree_1_1tree__stats.html#9e4f92e0aa1d90cbf823a3b072495be6" title="Number of leaves in the B+ tree.">leaves</a>;
<a name="l01190"></a>01190
<a name="l01192"></a><a class="code" href="structstx_1_1btree_1_1tree__stats.html#2899f2f8e09b4f8e9be8effb3492deed">01192</a> <a class="code" href="classstx_1_1btree.html#973470864b67129983ea4e1aa2132ac5" title="Size type used to count keys.">size_type</a> <a class="code" href="structstx_1_1btree_1_1tree__stats.html#2899f2f8e09b4f8e9be8effb3492deed" title="Number of inner nodes in the B+ tree.">innernodes</a>;
<a name="l01193"></a>01193
<a name="l01195"></a><a class="code" href="structstx_1_1btree_1_1tree__stats.html#b32f0e23ddeb36d9880a5a132529d916">01195</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="structstx_1_1btree_1_1tree__stats.html#b32f0e23ddeb36d9880a5a132529d916" title="Base B+ tree parameter: The number of key/data slots in each leaf.">leafslots</a> = <a class="code" href="classstx_1_1btree.html#12a39ca671e962924f4acf879a44eafc" title="Base B+ tree parameter: The number of key/data slots in each leaf.">btree_self::leafslotmax</a>;
<a name="l01196"></a>01196
<a name="l01198"></a><a class="code" href="structstx_1_1btree_1_1tree__stats.html#0b90769f6b8be18b1d97b0c50b6f041b">01198</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="structstx_1_1btree_1_1tree__stats.html#0b90769f6b8be18b1d97b0c50b6f041b" title="Base B+ tree parameter: The number of key slots in each inner node.">innerslots</a> = <a class="code" href="classstx_1_1btree.html#83a18c2fb7f4e9cfd47ce7545d004324" title="Base B+ tree parameter: The number of key slots in each inner node, this can differ...">btree_self::innerslotmax</a>;
<a name="l01199"></a>01199
<a name="l01201"></a><a class="code" href="structstx_1_1btree_1_1tree__stats.html#bc29398f753b55b9d0fed98e2386ad7e">01201</a> <span class="keyword">inline</span> <a class="code" href="structstx_1_1btree_1_1tree__stats.html#bc29398f753b55b9d0fed98e2386ad7e" title="Zero initialized.">tree_stats</a>()
<a name="l01202"></a>01202 : <a class="code" href="structstx_1_1btree_1_1tree__stats.html#8822d400b91499816b6c985e781e9018" title="Number of items in the B+ tree.">itemcount</a>(0),
<a name="l01203"></a>01203 <a class="code" href="structstx_1_1btree_1_1tree__stats.html#9e4f92e0aa1d90cbf823a3b072495be6" title="Number of leaves in the B+ tree.">leaves</a>(0), <a class="code" href="structstx_1_1btree_1_1tree__stats.html#2899f2f8e09b4f8e9be8effb3492deed" title="Number of inner nodes in the B+ tree.">innernodes</a>(0)
<a name="l01204"></a>01204 {
<a name="l01205"></a>01205 }
<a name="l01206"></a>01206
<a name="l01208"></a><a class="code" href="structstx_1_1btree_1_1tree__stats.html#9935c861736aee34259104bd52c5cf69">01208</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree.html#973470864b67129983ea4e1aa2132ac5" title="Size type used to count keys.">size_type</a> <a class="code" href="structstx_1_1btree_1_1tree__stats.html#9935c861736aee34259104bd52c5cf69" title="Return the total number of nodes.">nodes</a>()<span class="keyword"> const</span>
<a name="l01209"></a>01209 <span class="keyword"> </span>{
<a name="l01210"></a>01210 <span class="keywordflow">return</span> <a class="code" href="structstx_1_1btree_1_1tree__stats.html#2899f2f8e09b4f8e9be8effb3492deed" title="Number of inner nodes in the B+ tree.">innernodes</a> + <a class="code" href="structstx_1_1btree_1_1tree__stats.html#9e4f92e0aa1d90cbf823a3b072495be6" title="Number of leaves in the B+ tree.">leaves</a>;
<a name="l01211"></a>01211 }
<a name="l01212"></a>01212
<a name="l01214"></a><a class="code" href="structstx_1_1btree_1_1tree__stats.html#f442a770bb4acf9c716139b4f29201dc">01214</a> <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="structstx_1_1btree_1_1tree__stats.html#f442a770bb4acf9c716139b4f29201dc" title="Return the average fill of leaves.">avgfill_leaves</a>()<span class="keyword"> const</span>
<a name="l01215"></a>01215 <span class="keyword"> </span>{
<a name="l01216"></a>01216 <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(<a class="code" href="structstx_1_1btree_1_1tree__stats.html#8822d400b91499816b6c985e781e9018" title="Number of items in the B+ tree.">itemcount</a>) / (<a class="code" href="structstx_1_1btree_1_1tree__stats.html#9e4f92e0aa1d90cbf823a3b072495be6" title="Number of leaves in the B+ tree.">leaves</a> * <a class="code" href="structstx_1_1btree_1_1tree__stats.html#b32f0e23ddeb36d9880a5a132529d916" title="Base B+ tree parameter: The number of key/data slots in each leaf.">leafslots</a>);
<a name="l01217"></a>01217 }
<a name="l01218"></a>01218 };
<a name="l01219"></a>01219
<a name="l01220"></a>01220 <span class="keyword">private</span>:
<a name="l01221"></a>01221 <span class="comment">// *** Tree Object Data Members</span>
<a name="l01222"></a>01222
<a name="l01224"></a><a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0">01224</a> node* <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>;
<a name="l01225"></a>01225
<a name="l01227"></a><a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760">01227</a> leaf_node *<a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a>;
<a name="l01228"></a>01228
<a name="l01230"></a><a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96">01230</a> leaf_node *<a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>;
<a name="l01231"></a>01231
<a name="l01233"></a><a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606">01233</a> tree_stats <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>;
<a name="l01234"></a>01234
<a name="l01237"></a><a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592">01237</a> <a class="code" href="classstx_1_1btree.html#8f75664f479fc4ca3f54a3a5757d98a7" title="Fourth template parameter: Key comparison function object.">key_compare</a> <a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>;
<a name="l01238"></a>01238
<a name="l01239"></a>01239 <span class="keyword">public</span>:
<a name="l01240"></a>01240 <span class="comment">// *** Constructors and Destructor</span>
<a name="l01241"></a>01241
<a name="l01244"></a><a class="code" href="classstx_1_1btree.html#ecde28ffeec27607c2fb56192d95f607">01244</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree.html#ecde28ffeec27607c2fb56192d95f607" title="Default constructor initializing an empty B+ tree with the standard key comparison...">btree</a>()
<a name="l01245"></a>01245 : <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>(NULL), <a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a>(NULL), <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>(NULL)
<a name="l01246"></a>01246 {
<a name="l01247"></a>01247 }
<a name="l01248"></a>01248
<a name="l01251"></a><a class="code" href="classstx_1_1btree.html#ffc730f1b3d3a21347248970eeba2af5">01251</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree.html#ecde28ffeec27607c2fb56192d95f607" title="Default constructor initializing an empty B+ tree with the standard key comparison...">btree</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#8f75664f479fc4ca3f54a3a5757d98a7" title="Fourth template parameter: Key comparison function object.">key_compare</a> &kcf)
<a name="l01252"></a>01252 : <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>(NULL), <a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a>(NULL), <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>(NULL),
<a name="l01253"></a>01253 <a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>(kcf)
<a name="l01254"></a>01254 {
<a name="l01255"></a>01255 }
<a name="l01256"></a>01256
<a name="l01258"></a>01258 <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator>
<a name="l01259"></a><a class="code" href="classstx_1_1btree.html#6124edb5dc3280e48dea9323a2a1891f">01259</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree.html#ecde28ffeec27607c2fb56192d95f607" title="Default constructor initializing an empty B+ tree with the standard key comparison...">btree</a>(InputIterator first, InputIterator last)
<a name="l01260"></a>01260 : <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>(NULL), <a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a>(NULL), <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>(NULL)
<a name="l01261"></a>01261 {
<a name="l01262"></a>01262 <a class="code" href="classstx_1_1btree.html#6a96ea1453ad3392ad4722265ceae976" title="Attempt to insert a key/data pair into the B+ tree.">insert</a>(first, last);
<a name="l01263"></a>01263 }
<a name="l01264"></a>01264
<a name="l01267"></a>01267 <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator>
<a name="l01268"></a><a class="code" href="classstx_1_1btree.html#e1f4c758cb4c693f94709bf009587315">01268</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree.html#ecde28ffeec27607c2fb56192d95f607" title="Default constructor initializing an empty B+ tree with the standard key comparison...">btree</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#8f75664f479fc4ca3f54a3a5757d98a7" title="Fourth template parameter: Key comparison function object.">key_compare</a> &kcf)
<a name="l01269"></a>01269 : <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>(NULL), <a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a>(NULL), <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>(NULL),
<a name="l01270"></a>01270 <a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>(kcf)
<a name="l01271"></a>01271 {
<a name="l01272"></a>01272 <a class="code" href="classstx_1_1btree.html#6a96ea1453ad3392ad4722265ceae976" title="Attempt to insert a key/data pair into the B+ tree.">insert</a>(first, last);
<a name="l01273"></a>01273 }
<a name="l01274"></a>01274
<a name="l01276"></a><a class="code" href="classstx_1_1btree.html#3ae99b2caa919248a9ab8a7c7fddec6f">01276</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree.html#3ae99b2caa919248a9ab8a7c7fddec6f" title="Frees up all used B+ tree memory pages.">~btree</a>()
<a name="l01277"></a>01277 {
<a name="l01278"></a>01278 <a class="code" href="classstx_1_1btree.html#cf6ccb1acc05ef2845dfa97c81b1be9f" title="Frees all key/data pairs and all nodes of the tree.">clear</a>();
<a name="l01279"></a>01279 }
<a name="l01280"></a>01280
<a name="l01282"></a><a class="code" href="classstx_1_1btree.html#aab71acf938da1bfc93698b3236bb1ae">01282</a> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#aab71acf938da1bfc93698b3236bb1ae" title="Fast swapping of two identical B+ tree objects.">swap</a>(<a class="code" href="classstx_1_1btree.html" title="Basic class implementing a base B+ tree data structure in memory.">btree_self</a>& from)
<a name="l01283"></a>01283 {
<a name="l01284"></a>01284 std::swap(<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>, from.<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>);
<a name="l01285"></a>01285 std::swap(<a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a>, from.<a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a>);
<a name="l01286"></a>01286 std::swap(<a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>, from.<a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>);
<a name="l01287"></a>01287 std::swap(<a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>, from.<a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>);
<a name="l01288"></a>01288 std::swap(<a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>, from.<a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>);
<a name="l01289"></a>01289 }
<a name="l01290"></a>01290
<a name="l01291"></a>01291 <span class="keyword">public</span>:
<a name="l01292"></a>01292 <span class="comment">// *** Key and Value Comparison Function Objects</span>
<a name="l01293"></a>01293
<a name="l01295"></a><a class="code" href="classstx_1_1btree_1_1value__compare.html">01295</a> <span class="keyword">class </span><a class="code" href="classstx_1_1btree_1_1value__compare.html" title="Function class to compare value_type objects. Required by the STL.">value_compare</a>
<a name="l01296"></a>01296 {
<a name="l01297"></a>01297 <span class="keyword">protected</span>:
<a name="l01299"></a><a class="code" href="classstx_1_1btree_1_1value__compare.html#05f376ec84125db57b3042d3e0d187e8">01299</a> <a class="code" href="classstx_1_1btree.html#8f75664f479fc4ca3f54a3a5757d98a7" title="Fourth template parameter: Key comparison function object.">key_compare</a> <a class="code" href="classstx_1_1btree_1_1value__compare.html#05f376ec84125db57b3042d3e0d187e8" title="Key comparison function from the template parameter.">key_comp</a>;
<a name="l01300"></a>01300
<a name="l01302"></a><a class="code" href="classstx_1_1btree_1_1value__compare.html#31e23ca961b202b9704199aba23598b6">01302</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree_1_1value__compare.html#31e23ca961b202b9704199aba23598b6" title="Constructor called from btree::value_comp().">value_compare</a>(<a class="code" href="classstx_1_1btree.html#8f75664f479fc4ca3f54a3a5757d98a7" title="Fourth template parameter: Key comparison function object.">key_compare</a> kc)
<a name="l01303"></a>01303 : <a class="code" href="classstx_1_1btree_1_1value__compare.html#05f376ec84125db57b3042d3e0d187e8" title="Key comparison function from the template parameter.">key_comp</a>(kc)
<a name="l01304"></a>01304 { }
<a name="l01305"></a>01305
<a name="l01307"></a><a class="code" href="classstx_1_1btree_1_1value__compare.html#88a92ebc50ded4cd953211ac83751e12">01307</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classstx_1_1btree.html" title="Basic class implementing a base B+ tree data structure in memory.">btree</a><<a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>, <a class="code" href="classstx_1_1btree.html#ca29ad902418d86eeb9b9379a38e5fcd" title="Second template parameter: The data type associated with each key.">data_type</a>, <a class="code" href="classstx_1_1btree.html#84c95e7319c922fe297b4acdf2e0910c" title="Third template parameter: Composition pair of key and data types, this is required...">value_type</a>, <a class="code" href="classstx_1_1btree.html#8f75664f479fc4ca3f54a3a5757d98a7" title="Fourth template parameter: Key comparison function object.">key_compare</a>, <a class="code" href="classstx_1_1btree.html#a84bef0ec11542ba1f9c49566d653629" title="Fifth template parameter: Traits object used to define more parameters of the B+...">traits</a>, <a class="code" href="classstx_1_1btree.html#35378979c13861883affefda9ad95df7" title="Sixth template parameter: Allow duplicate keys in the B+ tree.">allow_duplicates</a>>;
<a name="l01308"></a>01308
<a name="l01309"></a>01309 <span class="keyword">public</span>:
<a name="l01311"></a><a class="code" href="classstx_1_1btree_1_1value__compare.html#f906f0ee524009f13ea9b2a15bbb7a20">01311</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree_1_1value__compare.html#f906f0ee524009f13ea9b2a15bbb7a20" title="Function call &quot;less&quot;-operator resulting in true if x &lt; y.">operator()</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#84c95e7319c922fe297b4acdf2e0910c" title="Third template parameter: Composition pair of key and data types, this is required...">value_type</a>& x, <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#84c95e7319c922fe297b4acdf2e0910c" title="Third template parameter: Composition pair of key and data types, this is required...">value_type</a>& y)<span class="keyword"> const</span>
<a name="l01312"></a>01312 <span class="keyword"> </span>{
<a name="l01313"></a>01313 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree_1_1value__compare.html#05f376ec84125db57b3042d3e0d187e8" title="Key comparison function from the template parameter.">key_comp</a>(x.first, y.first);
<a name="l01314"></a>01314 }
<a name="l01315"></a>01315 };
<a name="l01316"></a>01316
<a name="l01318"></a><a class="code" href="classstx_1_1btree.html#43d1c2683f2dc078aa25e49820e9c237">01318</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree.html#8f75664f479fc4ca3f54a3a5757d98a7" title="Fourth template parameter: Key comparison function object.">key_compare</a> <a class="code" href="classstx_1_1btree.html#43d1c2683f2dc078aa25e49820e9c237" title="Constant access to the key comparison object sorting the B+ tree.">key_comp</a>()<span class="keyword"> const</span>
<a name="l01319"></a>01319 <span class="keyword"> </span>{
<a name="l01320"></a>01320 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>;
<a name="l01321"></a>01321 }
<a name="l01322"></a>01322
<a name="l01325"></a><a class="code" href="classstx_1_1btree.html#94273af1fe4b9e2e0c0b6daeaa5f5950">01325</a> <span class="keyword">inline</span> value_compare <a class="code" href="classstx_1_1btree.html#94273af1fe4b9e2e0c0b6daeaa5f5950" title="Constant access to a constructed value_type comparison object.">value_comp</a>()<span class="keyword"> const</span>
<a name="l01326"></a>01326 <span class="keyword"> </span>{
<a name="l01327"></a>01327 <span class="keywordflow">return</span> value_compare(<a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>);
<a name="l01328"></a>01328 }
<a name="l01329"></a>01329
<a name="l01330"></a>01330 <span class="keyword">private</span>:
<a name="l01331"></a>01331 <span class="comment">// *** Convenient Key Comparison Functions Generated From key_less</span>
<a name="l01332"></a>01332
<a name="l01334"></a><a class="code" href="classstx_1_1btree.html#b20b48ee5b3b4a1d4e216d5948f8c1a0">01334</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#b20b48ee5b3b4a1d4e216d5948f8c1a0" title="True if a &lt;= b ? constructed from key_less().">key_lessequal</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> &a, <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> b)<span class="keyword"> const</span>
<a name="l01335"></a>01335 <span class="keyword"> </span>{
<a name="l01336"></a>01336 <span class="keywordflow">return</span> !<a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>(b, a);
<a name="l01337"></a>01337 }
<a name="l01338"></a>01338
<a name="l01340"></a><a class="code" href="classstx_1_1btree.html#7bb87c4c13cd7a4412da72ef93ab082e">01340</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#7bb87c4c13cd7a4412da72ef93ab082e" title="True if a &gt; b ? constructed from key_less().">key_greater</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> &a, <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> &b)<span class="keyword"> const</span>
<a name="l01341"></a>01341 <span class="keyword"> </span>{
<a name="l01342"></a>01342 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>(b, a);
<a name="l01343"></a>01343 }
<a name="l01344"></a>01344
<a name="l01346"></a><a class="code" href="classstx_1_1btree.html#0571b5b68a6ef06b7606975a7176867c">01346</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#0571b5b68a6ef06b7606975a7176867c" title="True if a &gt;= b ? constructed from key_less().">key_greaterequal</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> &a, <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> b)<span class="keyword"> const</span>
<a name="l01347"></a>01347 <span class="keyword"> </span>{
<a name="l01348"></a>01348 <span class="keywordflow">return</span> !<a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>(a, b);
<a name="l01349"></a>01349 }
<a name="l01350"></a>01350
<a name="l01353"></a><a class="code" href="classstx_1_1btree.html#f09828d360e903d40c9f8c77183bea0e">01353</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#f09828d360e903d40c9f8c77183bea0e" title="True if a == b ? constructed from key_less().">key_equal</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> &a, <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> &b)<span class="keyword"> const</span>
<a name="l01354"></a>01354 <span class="keyword"> </span>{
<a name="l01355"></a>01355 <span class="keywordflow">return</span> !<a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>(a, b) && !<a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>(b, a);
<a name="l01356"></a>01356 }
<a name="l01357"></a>01357
<a name="l01358"></a>01358 <span class="keyword">private</span>:
<a name="l01359"></a>01359 <span class="comment">// *** Node Object Allocation and Deallocation Functions</span>
<a name="l01360"></a>01360
<a name="l01362"></a><a class="code" href="classstx_1_1btree.html#359771538c203e0e8e301135783fa4a4">01362</a> <span class="keyword">inline</span> leaf_node* <a class="code" href="classstx_1_1btree.html#359771538c203e0e8e301135783fa4a4" title="Allocate and initialize a leaf node.">allocate_leaf</a>()
<a name="l01363"></a>01363 {
<a name="l01364"></a>01364 leaf_node* n = <span class="keyword">new</span> leaf_node;
<a name="l01365"></a>01365 n-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#b0094a85e6adbebdd3bc4a671fddfca5" title="Set variables to initial values.">initialize</a>();
<a name="l01366"></a>01366 <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#9e4f92e0aa1d90cbf823a3b072495be6" title="Number of leaves in the B+ tree.">leaves</a>++;
<a name="l01367"></a>01367 <span class="keywordflow">return</span> n;
<a name="l01368"></a>01368 }
<a name="l01369"></a>01369
<a name="l01371"></a><a class="code" href="classstx_1_1btree.html#48afc242f523282f8833580a5370ff81">01371</a> <span class="keyword">inline</span> inner_node* <a class="code" href="classstx_1_1btree.html#48afc242f523282f8833580a5370ff81" title="Allocate and initialize an inner node.">allocate_inner</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> l)
<a name="l01372"></a>01372 {
<a name="l01373"></a>01373 inner_node* n = <span class="keyword">new</span> inner_node;
<a name="l01374"></a>01374 n-><a class="code" href="structstx_1_1btree_1_1inner__node.html#f44644e684d49141dc8ca17de22c1d8a" title="Set variables to initial values.">initialize</a>(l);
<a name="l01375"></a>01375 <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#2899f2f8e09b4f8e9be8effb3492deed" title="Number of inner nodes in the B+ tree.">innernodes</a>++;
<a name="l01376"></a>01376 <span class="keywordflow">return</span> n;
<a name="l01377"></a>01377 }
<a name="l01378"></a>01378
<a name="l01381"></a><a class="code" href="classstx_1_1btree.html#0bbb2111654adc0acbd302488c602ad1">01381</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#0bbb2111654adc0acbd302488c602ad1" title="Correctly free either inner or leaf node, destructs all contained key and value objects...">free_node</a>(node *n)
<a name="l01382"></a>01382 {
<a name="l01383"></a>01383 <span class="keywordflow">if</span> (n->isleafnode()) {
<a name="l01384"></a>01384 <span class="keyword">delete</span> <span class="keyword">static_cast<</span>leaf_node*<span class="keyword">></span>(n);
<a name="l01385"></a>01385 <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#9e4f92e0aa1d90cbf823a3b072495be6" title="Number of leaves in the B+ tree.">leaves</a>--;
<a name="l01386"></a>01386 }
<a name="l01387"></a>01387 <span class="keywordflow">else</span> {
<a name="l01388"></a>01388 <span class="keyword">delete</span> <span class="keyword">static_cast<</span>inner_node*<span class="keyword">></span>(n);
<a name="l01389"></a>01389 <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#2899f2f8e09b4f8e9be8effb3492deed" title="Number of inner nodes in the B+ tree.">innernodes</a>--;
<a name="l01390"></a>01390 }
<a name="l01391"></a>01391 }
<a name="l01392"></a>01392
<a name="l01393"></a>01393 <span class="keyword">public</span>:
<a name="l01394"></a>01394 <span class="comment">// *** Fast Destruction of the B+ Tree</span>
<a name="l01395"></a>01395
<a name="l01397"></a><a class="code" href="classstx_1_1btree.html#cf6ccb1acc05ef2845dfa97c81b1be9f">01397</a> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#cf6ccb1acc05ef2845dfa97c81b1be9f" title="Frees all key/data pairs and all nodes of the tree.">clear</a>()
<a name="l01398"></a>01398 {
<a name="l01399"></a>01399 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>)
<a name="l01400"></a>01400 {
<a name="l01401"></a>01401 <a class="code" href="classstx_1_1btree.html#e5b3a26d39b65796596a6210b397e393" title="Recursively free up nodes.">clear_recursive</a>(<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>);
<a name="l01402"></a>01402 <a class="code" href="classstx_1_1btree.html#0bbb2111654adc0acbd302488c602ad1" title="Correctly free either inner or leaf node, destructs all contained key and value objects...">free_node</a>(<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>);
<a name="l01403"></a>01403
<a name="l01404"></a>01404 <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a> = NULL;
<a name="l01405"></a>01405 <a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a> = <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a> = NULL;
<a name="l01406"></a>01406
<a name="l01407"></a>01407 <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a> = tree_stats();
<a name="l01408"></a>01408 }
<a name="l01409"></a>01409
<a name="l01410"></a>01410 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(<a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#8822d400b91499816b6c985e781e9018" title="Number of items in the B+ tree.">itemcount</a> == 0);
<a name="l01411"></a>01411 }
<a name="l01412"></a>01412
<a name="l01413"></a>01413 <span class="keyword">private</span>:
<a name="l01415"></a><a class="code" href="classstx_1_1btree.html#e5b3a26d39b65796596a6210b397e393">01415</a> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#e5b3a26d39b65796596a6210b397e393" title="Recursively free up nodes.">clear_recursive</a>(node *n)
<a name="l01416"></a>01416 {
<a name="l01417"></a>01417 <span class="keywordflow">if</span> (n->isleafnode())
<a name="l01418"></a>01418 {
<a name="l01419"></a>01419 leaf_node *leafnode = <span class="keyword">static_cast<</span>leaf_node*<span class="keyword">></span>(n);
<a name="l01420"></a>01420
<a name="l01421"></a>01421 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> slot = 0; slot < leafnode->slotuse; ++slot)
<a name="l01422"></a>01422 {
<a name="l01423"></a>01423 <span class="comment">// data objects are deleted by leaf_node's destructor</span>
<a name="l01424"></a>01424 }
<a name="l01425"></a>01425 }
<a name="l01426"></a>01426 <span class="keywordflow">else</span>
<a name="l01427"></a>01427 {
<a name="l01428"></a>01428 inner_node *innernode = <span class="keyword">static_cast<</span>inner_node*<span class="keyword">></span>(n);
<a name="l01429"></a>01429
<a name="l01430"></a>01430 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot < innernode->slotuse + 1; ++slot)
<a name="l01431"></a>01431 {
<a name="l01432"></a>01432 <a class="code" href="classstx_1_1btree.html#e5b3a26d39b65796596a6210b397e393" title="Recursively free up nodes.">clear_recursive</a>(innernode->childid[slot]);
<a name="l01433"></a>01433 <a class="code" href="classstx_1_1btree.html#0bbb2111654adc0acbd302488c602ad1" title="Correctly free either inner or leaf node, destructs all contained key and value objects...">free_node</a>(innernode->childid[slot]);
<a name="l01434"></a>01434 }
<a name="l01435"></a>01435 }
<a name="l01436"></a>01436 }
<a name="l01437"></a>01437
<a name="l01438"></a>01438 <span class="keyword">public</span>:
<a name="l01439"></a>01439 <span class="comment">// *** STL Iterator Construction Functions</span>
<a name="l01440"></a>01440
<a name="l01443"></a><a class="code" href="classstx_1_1btree.html#6551b60cb8a2f717555ceac61f34b957">01443</a> <span class="keyword">inline</span> iterator <a class="code" href="classstx_1_1btree.html#6551b60cb8a2f717555ceac61f34b957" title="Constructs a read/data-write iterator that points to the first slot in the first...">begin</a>()
<a name="l01444"></a>01444 {
<a name="l01445"></a>01445 <span class="keywordflow">return</span> iterator(<a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a>, 0);
<a name="l01446"></a>01446 }
<a name="l01447"></a>01447
<a name="l01450"></a><a class="code" href="classstx_1_1btree.html#14f8bf63680c8950aab8c5d54e580a14">01450</a> <span class="keyword">inline</span> iterator <a class="code" href="classstx_1_1btree.html#14f8bf63680c8950aab8c5d54e580a14" title="Constructs a read/data-write iterator that points to the first invalid slot in the...">end</a>()
<a name="l01451"></a>01451 {
<a name="l01452"></a>01452 <span class="keywordflow">return</span> iterator(<a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>, <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a> ? <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a> : 0);
<a name="l01453"></a>01453 }
<a name="l01454"></a>01454
<a name="l01457"></a><a class="code" href="classstx_1_1btree.html#ea7a998112824a28d930bf324eedf60d">01457</a> <span class="keyword">inline</span> const_iterator <a class="code" href="classstx_1_1btree.html#6551b60cb8a2f717555ceac61f34b957" title="Constructs a read/data-write iterator that points to the first slot in the first...">begin</a>()<span class="keyword"> const</span>
<a name="l01458"></a>01458 <span class="keyword"> </span>{
<a name="l01459"></a>01459 <span class="keywordflow">return</span> const_iterator(<a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a>, 0);
<a name="l01460"></a>01460 }
<a name="l01461"></a>01461
<a name="l01464"></a><a class="code" href="classstx_1_1btree.html#c1378c6f8b3473b4bd4c175dba5dbb7b">01464</a> <span class="keyword">inline</span> const_iterator <a class="code" href="classstx_1_1btree.html#14f8bf63680c8950aab8c5d54e580a14" title="Constructs a read/data-write iterator that points to the first invalid slot in the...">end</a>()<span class="keyword"> const</span>
<a name="l01465"></a>01465 <span class="keyword"> </span>{
<a name="l01466"></a>01466 <span class="keywordflow">return</span> const_iterator(<a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>, <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a> ? <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a> : 0);
<a name="l01467"></a>01467 }
<a name="l01468"></a>01468
<a name="l01471"></a><a class="code" href="classstx_1_1btree.html#4d3a4b24d8cc56c589800655cf83c806">01471</a> <span class="keyword">inline</span> reverse_iterator <a class="code" href="classstx_1_1btree.html#4d3a4b24d8cc56c589800655cf83c806" title="Constructs a read/data-write reverse iterator that points to the first invalid slot...">rbegin</a>()
<a name="l01472"></a>01472 {
<a name="l01473"></a>01473 <span class="keywordflow">return</span> reverse_iterator(<a class="code" href="classstx_1_1btree.html#14f8bf63680c8950aab8c5d54e580a14" title="Constructs a read/data-write iterator that points to the first invalid slot in the...">end</a>());
<a name="l01474"></a>01474 }
<a name="l01475"></a>01475
<a name="l01478"></a><a class="code" href="classstx_1_1btree.html#6d9e5a5b0ec598a76e602aa6a19900ff">01478</a> <span class="keyword">inline</span> reverse_iterator <a class="code" href="classstx_1_1btree.html#6d9e5a5b0ec598a76e602aa6a19900ff" title="Constructs a read/data-write reverse iterator that points to the first slot in the...">rend</a>()
<a name="l01479"></a>01479 {
<a name="l01480"></a>01480 <span class="keywordflow">return</span> reverse_iterator(<a class="code" href="classstx_1_1btree.html#6551b60cb8a2f717555ceac61f34b957" title="Constructs a read/data-write iterator that points to the first slot in the first...">begin</a>());
<a name="l01481"></a>01481 }
<a name="l01482"></a>01482
<a name="l01485"></a><a class="code" href="classstx_1_1btree.html#38a7bfd129ae2a39f228f53c39561bf8">01485</a> <span class="keyword">inline</span> const_reverse_iterator <a class="code" href="classstx_1_1btree.html#4d3a4b24d8cc56c589800655cf83c806" title="Constructs a read/data-write reverse iterator that points to the first invalid slot...">rbegin</a>()<span class="keyword"> const</span>
<a name="l01486"></a>01486 <span class="keyword"> </span>{
<a name="l01487"></a>01487 <span class="keywordflow">return</span> const_reverse_iterator(<a class="code" href="classstx_1_1btree.html#14f8bf63680c8950aab8c5d54e580a14" title="Constructs a read/data-write iterator that points to the first invalid slot in the...">end</a>());
<a name="l01488"></a>01488 }
<a name="l01489"></a>01489
<a name="l01492"></a><a class="code" href="classstx_1_1btree.html#c925da8e9151dbecdf063dc5af78a903">01492</a> <span class="keyword">inline</span> const_reverse_iterator <a class="code" href="classstx_1_1btree.html#6d9e5a5b0ec598a76e602aa6a19900ff" title="Constructs a read/data-write reverse iterator that points to the first slot in the...">rend</a>()<span class="keyword"> const</span>
<a name="l01493"></a>01493 <span class="keyword"> </span>{
<a name="l01494"></a>01494 <span class="keywordflow">return</span> const_reverse_iterator(<a class="code" href="classstx_1_1btree.html#6551b60cb8a2f717555ceac61f34b957" title="Constructs a read/data-write iterator that points to the first slot in the first...">begin</a>());
<a name="l01495"></a>01495 }
<a name="l01496"></a>01496
<a name="l01497"></a>01497 <span class="keyword">private</span>:
<a name="l01498"></a>01498 <span class="comment">// *** B+ Tree Node Binary Search Functions</span>
<a name="l01499"></a>01499
<a name="l01504"></a>01504 <span class="keyword">template</span> <<span class="keyword">typename</span> node_type>
<a name="l01505"></a><a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77">01505</a> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(<span class="keyword">const</span> node_type *n, <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>& key)<span class="keyword"> const</span>
<a name="l01506"></a>01506 <span class="keyword"> </span>{
<a name="l01507"></a>01507 <span class="keywordflow">if</span> (n->slotuse == 0) <span class="keywordflow">return</span> 0;
<a name="l01508"></a>01508
<a name="l01509"></a>01509 <span class="keywordtype">int</span> lo = 0,
<a name="l01510"></a>01510 hi = n->slotuse - 1;
<a name="l01511"></a>01511
<a name="l01512"></a>01512 <span class="keywordflow">while</span>(lo < hi)
<a name="l01513"></a>01513 {
<a name="l01514"></a>01514 <span class="keywordtype">int</span> mid = (lo + hi) >> 1;
<a name="l01515"></a>01515
<a name="l01516"></a>01516 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#b20b48ee5b3b4a1d4e216d5948f8c1a0" title="True if a &lt;= b ? constructed from key_less().">key_lessequal</a>(key, n->slotkey[mid])) {
<a name="l01517"></a>01517 hi = mid - 1;
<a name="l01518"></a>01518 }
<a name="l01519"></a>01519 <span class="keywordflow">else</span> {
<a name="l01520"></a>01520 lo = mid + 1;
<a name="l01521"></a>01521 }
<a name="l01522"></a>01522 }
<a name="l01523"></a>01523
<a name="l01524"></a>01524 <span class="keywordflow">if</span> (hi < 0 || <a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>(n->slotkey[hi], key))
<a name="l01525"></a>01525 hi++;
<a name="l01526"></a>01526
<a name="l01527"></a>01527 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"btree::find_lower: on "</span> << n << <span class="stringliteral">" key "</span> << key << <span class="stringliteral">" -> ("</span> << lo << <span class="stringliteral">") "</span> << hi << <span class="stringliteral">", "</span>);
<a name="l01528"></a>01528
<a name="l01529"></a>01529 <span class="comment">// verify result using simple linear search</span>
<a name="l01530"></a>01530 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#ee2e25b0fccc7147fd8be0bcf8630b5b" title="Debug parameter: Enables expensive and thorough checking of the B+ tree invariants...">selfverify</a>)
<a name="l01531"></a>01531 {
<a name="l01532"></a>01532 <span class="keywordtype">int</span> i = n->slotuse - 1;
<a name="l01533"></a>01533 <span class="keywordflow">while</span>(i >= 0 && <a class="code" href="classstx_1_1btree.html#b20b48ee5b3b4a1d4e216d5948f8c1a0" title="True if a &lt;= b ? constructed from key_less().">key_lessequal</a>(key, n->slotkey[i]))
<a name="l01534"></a>01534 i--;
<a name="l01535"></a>01535 i++;
<a name="l01536"></a>01536
<a name="l01537"></a>01537 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"testfind: "</span> << i << std::endl);
<a name="l01538"></a>01538 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(i == hi);
<a name="l01539"></a>01539 }
<a name="l01540"></a>01540 <span class="keywordflow">else</span> {
<a name="l01541"></a>01541 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(std::endl);
<a name="l01542"></a>01542 }
<a name="l01543"></a>01543
<a name="l01544"></a>01544 <span class="keywordflow">return</span> hi;
<a name="l01545"></a>01545 }
<a name="l01546"></a>01546
<a name="l01551"></a>01551 <span class="keyword">template</span> <<span class="keyword">typename</span> node_type>
<a name="l01552"></a><a class="code" href="classstx_1_1btree.html#43f2350acdc804684ddefe3ee1271978">01552</a> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classstx_1_1btree.html#43f2350acdc804684ddefe3ee1271978" title="Searches for the first key in the node n greater than key.">find_upper</a>(<span class="keyword">const</span> node_type *n, <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>& key)<span class="keyword"> const</span>
<a name="l01553"></a>01553 <span class="keyword"> </span>{
<a name="l01554"></a>01554 <span class="keywordflow">if</span> (n->slotuse == 0) <span class="keywordflow">return</span> 0;
<a name="l01555"></a>01555
<a name="l01556"></a>01556 <span class="keywordtype">int</span> lo = 0,
<a name="l01557"></a>01557 hi = n->slotuse - 1;
<a name="l01558"></a>01558
<a name="l01559"></a>01559 <span class="keywordflow">while</span>(lo < hi)
<a name="l01560"></a>01560 {
<a name="l01561"></a>01561 <span class="keywordtype">int</span> mid = (lo + hi) >> 1;
<a name="l01562"></a>01562
<a name="l01563"></a>01563 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>(key, n->slotkey[mid])) {
<a name="l01564"></a>01564 hi = mid - 1;
<a name="l01565"></a>01565 }
<a name="l01566"></a>01566 <span class="keywordflow">else</span> {
<a name="l01567"></a>01567 lo = mid + 1;
<a name="l01568"></a>01568 }
<a name="l01569"></a>01569 }
<a name="l01570"></a>01570
<a name="l01571"></a>01571 <span class="keywordflow">if</span> (hi < 0 || <a class="code" href="classstx_1_1btree.html#b20b48ee5b3b4a1d4e216d5948f8c1a0" title="True if a &lt;= b ? constructed from key_less().">key_lessequal</a>(n->slotkey[hi], key))
<a name="l01572"></a>01572 hi++;
<a name="l01573"></a>01573
<a name="l01574"></a>01574 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"btree::find_upper: on "</span> << n << <span class="stringliteral">" key "</span> << key << <span class="stringliteral">" -> ("</span> << lo << <span class="stringliteral">") "</span> << hi << <span class="stringliteral">", "</span>);
<a name="l01575"></a>01575
<a name="l01576"></a>01576 <span class="comment">// verify result using simple linear search</span>
<a name="l01577"></a>01577 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#ee2e25b0fccc7147fd8be0bcf8630b5b" title="Debug parameter: Enables expensive and thorough checking of the B+ tree invariants...">selfverify</a>)
<a name="l01578"></a>01578 {
<a name="l01579"></a>01579 <span class="keywordtype">int</span> i = n->slotuse - 1;
<a name="l01580"></a>01580 <span class="keywordflow">while</span>(i >= 0 && <a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>(key, n->slotkey[i]))
<a name="l01581"></a>01581 i--;
<a name="l01582"></a>01582 i++;
<a name="l01583"></a>01583
<a name="l01584"></a>01584 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"btree::find_upper testfind: "</span> << i << std::endl);
<a name="l01585"></a>01585 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(i == hi);
<a name="l01586"></a>01586 }
<a name="l01587"></a>01587 <span class="keywordflow">else</span> {
<a name="l01588"></a>01588 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(std::endl);
<a name="l01589"></a>01589 }
<a name="l01590"></a>01590
<a name="l01591"></a>01591 <span class="keywordflow">return</span> hi;
<a name="l01592"></a>01592 }
<a name="l01593"></a>01593
<a name="l01594"></a>01594 <span class="keyword">public</span>:
<a name="l01595"></a>01595 <span class="comment">// *** Access Functions to the Item Count</span>
<a name="l01596"></a>01596
<a name="l01598"></a><a class="code" href="classstx_1_1btree.html#5e32032d192795a5f25b49e23e3ef1a1">01598</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree.html#973470864b67129983ea4e1aa2132ac5" title="Size type used to count keys.">size_type</a> <a class="code" href="classstx_1_1btree.html#5e32032d192795a5f25b49e23e3ef1a1" title="Return the number of key/data pairs in the B+ tree.">size</a>()<span class="keyword"> const</span>
<a name="l01599"></a>01599 <span class="keyword"> </span>{
<a name="l01600"></a>01600 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#8822d400b91499816b6c985e781e9018" title="Number of items in the B+ tree.">itemcount</a>;
<a name="l01601"></a>01601 }
<a name="l01602"></a>01602
<a name="l01604"></a><a class="code" href="classstx_1_1btree.html#ee6ae1b8d5832d3cd829a3962b776cd5">01604</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#ee6ae1b8d5832d3cd829a3962b776cd5" title="Returns true if there is at least one key/data pair in the B+ tree.">empty</a>()<span class="keyword"> const</span>
<a name="l01605"></a>01605 <span class="keyword"> </span>{
<a name="l01606"></a>01606 <span class="keywordflow">return</span> (<a class="code" href="classstx_1_1btree.html#5e32032d192795a5f25b49e23e3ef1a1" title="Return the number of key/data pairs in the B+ tree.">size</a>() == <a class="code" href="classstx_1_1btree.html#973470864b67129983ea4e1aa2132ac5" title="Size type used to count keys.">size_type</a>(0));
<a name="l01607"></a>01607 }
<a name="l01608"></a>01608
<a name="l01611"></a><a class="code" href="classstx_1_1btree.html#ae330348c9f4b6051864da4ebd157662">01611</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree.html#973470864b67129983ea4e1aa2132ac5" title="Size type used to count keys.">size_type</a> <a class="code" href="classstx_1_1btree.html#ae330348c9f4b6051864da4ebd157662" title="Returns the largest possible size of the B+ Tree.">max_size</a>()<span class="keyword"> const</span>
<a name="l01612"></a>01612 <span class="keyword"> </span>{
<a name="l01613"></a>01613 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#973470864b67129983ea4e1aa2132ac5" title="Size type used to count keys.">size_type</a>(-1);
<a name="l01614"></a>01614 }
<a name="l01615"></a>01615
<a name="l01617"></a><a class="code" href="classstx_1_1btree.html#8748bb3788c1e1d65dbfe9500d33a134">01617</a> <span class="keyword">inline</span> <span class="keyword">const</span> <span class="keyword">struct </span>tree_stats& <a class="code" href="classstx_1_1btree.html#8748bb3788c1e1d65dbfe9500d33a134" title="Return a const reference to the current statistics.">get_stats</a>()<span class="keyword"> const</span>
<a name="l01618"></a>01618 <span class="keyword"> </span>{
<a name="l01619"></a>01619 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>;
<a name="l01620"></a>01620 }
<a name="l01621"></a>01621
<a name="l01622"></a>01622 <span class="keyword">public</span>:
<a name="l01623"></a>01623 <span class="comment">// *** Standard Access Functions Querying the Tree by Descending to a Leaf</span>
<a name="l01624"></a>01624
<a name="l01627"></a><a class="code" href="classstx_1_1btree.html#9405c7a274bcc76f27b4e84c49fcaa0d">01627</a> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#9405c7a274bcc76f27b4e84c49fcaa0d" title="Non-STL function checking whether a key is in the B+ tree.">exists</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> &key)<span class="keyword"> const</span>
<a name="l01628"></a>01628 <span class="keyword"> </span>{
<a name="l01629"></a>01629 <span class="keyword">const</span> node *n = <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>;
<a name="l01630"></a>01630 <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01631"></a>01631
<a name="l01632"></a>01632 <span class="keywordflow">while</span>(!n->isleafnode())
<a name="l01633"></a>01633 {
<a name="l01634"></a>01634 <span class="keyword">const</span> inner_node *inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>inner_node*<span class="keyword">></span>(n);
<a name="l01635"></a>01635 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(inner, key);
<a name="l01636"></a>01636
<a name="l01637"></a>01637 n = inner->childid[slot];
<a name="l01638"></a>01638 }
<a name="l01639"></a>01639
<a name="l01640"></a>01640 <span class="keyword">const</span> leaf_node *leaf = <span class="keyword">static_cast<</span><span class="keyword">const </span>leaf_node*<span class="keyword">></span>(n);
<a name="l01641"></a>01641
<a name="l01642"></a>01642 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(leaf, key);
<a name="l01643"></a>01643 <span class="keywordflow">return</span> (slot < leaf->slotuse && <a class="code" href="classstx_1_1btree.html#f09828d360e903d40c9f8c77183bea0e" title="True if a == b ? constructed from key_less().">key_equal</a>(key, leaf->slotkey[slot]));
<a name="l01644"></a>01644 }
<a name="l01645"></a>01645
<a name="l01648"></a><a class="code" href="classstx_1_1btree.html#2be7e3a978a71f86e433a0244c7414c6">01648</a> iterator <a class="code" href="classstx_1_1btree.html#2be7e3a978a71f86e433a0244c7414c6" title="Tries to locate a key in the B+ tree and returns an iterator to the key/data slot...">find</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> &key)
<a name="l01649"></a>01649 {
<a name="l01650"></a>01650 node *n = <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>;
<a name="l01651"></a>01651 <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#14f8bf63680c8950aab8c5d54e580a14" title="Constructs a read/data-write iterator that points to the first invalid slot in the...">end</a>();
<a name="l01652"></a>01652
<a name="l01653"></a>01653 <span class="keywordflow">while</span>(!n->isleafnode())
<a name="l01654"></a>01654 {
<a name="l01655"></a>01655 <span class="keyword">const</span> inner_node *inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>inner_node*<span class="keyword">></span>(n);
<a name="l01656"></a>01656 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(inner, key);
<a name="l01657"></a>01657
<a name="l01658"></a>01658 n = inner->childid[slot];
<a name="l01659"></a>01659 }
<a name="l01660"></a>01660
<a name="l01661"></a>01661 leaf_node *leaf = <span class="keyword">static_cast<</span>leaf_node*<span class="keyword">></span>(n);
<a name="l01662"></a>01662
<a name="l01663"></a>01663 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(leaf, key);
<a name="l01664"></a>01664 <span class="keywordflow">return</span> (slot < leaf->slotuse && <a class="code" href="classstx_1_1btree.html#f09828d360e903d40c9f8c77183bea0e" title="True if a == b ? constructed from key_less().">key_equal</a>(key, leaf->slotkey[slot]))
<a name="l01665"></a>01665 ? iterator(leaf, slot) : <a class="code" href="classstx_1_1btree.html#14f8bf63680c8950aab8c5d54e580a14" title="Constructs a read/data-write iterator that points to the first invalid slot in the...">end</a>();
<a name="l01666"></a>01666 }
<a name="l01667"></a>01667
<a name="l01670"></a><a class="code" href="classstx_1_1btree.html#fcda5e66264982ba77eaebaf665763f9">01670</a> const_iterator <a class="code" href="classstx_1_1btree.html#2be7e3a978a71f86e433a0244c7414c6" title="Tries to locate a key in the B+ tree and returns an iterator to the key/data slot...">find</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> &key)<span class="keyword"> const</span>
<a name="l01671"></a>01671 <span class="keyword"> </span>{
<a name="l01672"></a>01672 <span class="keyword">const</span> node *n = <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>;
<a name="l01673"></a>01673 <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#14f8bf63680c8950aab8c5d54e580a14" title="Constructs a read/data-write iterator that points to the first invalid slot in the...">end</a>();
<a name="l01674"></a>01674
<a name="l01675"></a>01675 <span class="keywordflow">while</span>(!n->isleafnode())
<a name="l01676"></a>01676 {
<a name="l01677"></a>01677 <span class="keyword">const</span> inner_node *inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>inner_node*<span class="keyword">></span>(n);
<a name="l01678"></a>01678 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(inner, key);
<a name="l01679"></a>01679
<a name="l01680"></a>01680 n = inner->childid[slot];
<a name="l01681"></a>01681 }
<a name="l01682"></a>01682
<a name="l01683"></a>01683 <span class="keyword">const</span> leaf_node *leaf = <span class="keyword">static_cast<</span><span class="keyword">const </span>leaf_node*<span class="keyword">></span>(n);
<a name="l01684"></a>01684
<a name="l01685"></a>01685 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(leaf, key);
<a name="l01686"></a>01686 <span class="keywordflow">return</span> (slot < leaf->slotuse && <a class="code" href="classstx_1_1btree.html#f09828d360e903d40c9f8c77183bea0e" title="True if a == b ? constructed from key_less().">key_equal</a>(key, leaf->slotkey[slot]))
<a name="l01687"></a>01687 ? const_iterator(leaf, slot) : <a class="code" href="classstx_1_1btree.html#14f8bf63680c8950aab8c5d54e580a14" title="Constructs a read/data-write iterator that points to the first invalid slot in the...">end</a>();
<a name="l01688"></a>01688 }
<a name="l01689"></a>01689
<a name="l01692"></a><a class="code" href="classstx_1_1btree.html#36754fc4a90de86806a91cc22eafbe78">01692</a> <a class="code" href="classstx_1_1btree.html#973470864b67129983ea4e1aa2132ac5" title="Size type used to count keys.">size_type</a> <a class="code" href="classstx_1_1btree.html#36754fc4a90de86806a91cc22eafbe78" title="Tries to locate a key in the B+ tree and returns the number of identical key entries...">count</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> &key)<span class="keyword"> const</span>
<a name="l01693"></a>01693 <span class="keyword"> </span>{
<a name="l01694"></a>01694 <span class="keyword">const</span> node *n = <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>;
<a name="l01695"></a>01695 <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> 0;
<a name="l01696"></a>01696
<a name="l01697"></a>01697 <span class="keywordflow">while</span>(!n->isleafnode())
<a name="l01698"></a>01698 {
<a name="l01699"></a>01699 <span class="keyword">const</span> inner_node *inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>inner_node*<span class="keyword">></span>(n);
<a name="l01700"></a>01700 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(inner, key);
<a name="l01701"></a>01701
<a name="l01702"></a>01702 n = inner->childid[slot];
<a name="l01703"></a>01703 }
<a name="l01704"></a>01704
<a name="l01705"></a>01705 <span class="keyword">const</span> leaf_node *leaf = <span class="keyword">static_cast<</span><span class="keyword">const </span>leaf_node*<span class="keyword">></span>(n);
<a name="l01706"></a>01706
<a name="l01707"></a>01707 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(leaf, key);
<a name="l01708"></a>01708 <a class="code" href="classstx_1_1btree.html#973470864b67129983ea4e1aa2132ac5" title="Size type used to count keys.">size_type</a> num = 0;
<a name="l01709"></a>01709
<a name="l01710"></a>01710 <span class="keywordflow">while</span> (leaf && slot < leaf->slotuse && <a class="code" href="classstx_1_1btree.html#f09828d360e903d40c9f8c77183bea0e" title="True if a == b ? constructed from key_less().">key_equal</a>(key, leaf->slotkey[slot]))
<a name="l01711"></a>01711 {
<a name="l01712"></a>01712 ++num;
<a name="l01713"></a>01713 <span class="keywordflow">if</span> (++slot >= leaf->slotuse)
<a name="l01714"></a>01714 {
<a name="l01715"></a>01715 leaf = leaf->nextleaf;
<a name="l01716"></a>01716 slot = 0;
<a name="l01717"></a>01717 }
<a name="l01718"></a>01718 }
<a name="l01719"></a>01719
<a name="l01720"></a>01720 <span class="keywordflow">return</span> num;
<a name="l01721"></a>01721 }
<a name="l01722"></a>01722
<a name="l01725"></a><a class="code" href="classstx_1_1btree.html#74e859adf01a516a382579a614f12673">01725</a> iterator <a class="code" href="classstx_1_1btree.html#74e859adf01a516a382579a614f12673" title="Searches the B+ tree and returns an iterator to the first key less or equal to the...">lower_bound</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>& key)
<a name="l01726"></a>01726 {
<a name="l01727"></a>01727 node *n = <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>;
<a name="l01728"></a>01728 <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#14f8bf63680c8950aab8c5d54e580a14" title="Constructs a read/data-write iterator that points to the first invalid slot in the...">end</a>();
<a name="l01729"></a>01729
<a name="l01730"></a>01730 <span class="keywordflow">while</span>(!n->isleafnode())
<a name="l01731"></a>01731 {
<a name="l01732"></a>01732 <span class="keyword">const</span> inner_node *inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>inner_node*<span class="keyword">></span>(n);
<a name="l01733"></a>01733 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(inner, key);
<a name="l01734"></a>01734
<a name="l01735"></a>01735 n = inner->childid[slot];
<a name="l01736"></a>01736 }
<a name="l01737"></a>01737
<a name="l01738"></a>01738 leaf_node *leaf = <span class="keyword">static_cast<</span>leaf_node*<span class="keyword">></span>(n);
<a name="l01739"></a>01739
<a name="l01740"></a>01740 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(leaf, key);
<a name="l01741"></a>01741 <span class="keywordflow">return</span> iterator(leaf, slot);
<a name="l01742"></a>01742 }
<a name="l01743"></a>01743
<a name="l01746"></a><a class="code" href="classstx_1_1btree.html#1a68298c1097edde3820d2be1b5e8966">01746</a> const_iterator <a class="code" href="classstx_1_1btree.html#74e859adf01a516a382579a614f12673" title="Searches the B+ tree and returns an iterator to the first key less or equal to the...">lower_bound</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>& key)<span class="keyword"> const</span>
<a name="l01747"></a>01747 <span class="keyword"> </span>{
<a name="l01748"></a>01748 <span class="keyword">const</span> node *n = <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>;
<a name="l01749"></a>01749 <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#14f8bf63680c8950aab8c5d54e580a14" title="Constructs a read/data-write iterator that points to the first invalid slot in the...">end</a>();
<a name="l01750"></a>01750
<a name="l01751"></a>01751 <span class="keywordflow">while</span>(!n->isleafnode())
<a name="l01752"></a>01752 {
<a name="l01753"></a>01753 <span class="keyword">const</span> inner_node *inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>inner_node*<span class="keyword">></span>(n);
<a name="l01754"></a>01754 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(inner, key);
<a name="l01755"></a>01755
<a name="l01756"></a>01756 n = inner->childid[slot];
<a name="l01757"></a>01757 }
<a name="l01758"></a>01758
<a name="l01759"></a>01759 <span class="keyword">const</span> leaf_node *leaf = <span class="keyword">static_cast<</span><span class="keyword">const </span>leaf_node*<span class="keyword">></span>(n);
<a name="l01760"></a>01760
<a name="l01761"></a>01761 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(leaf, key);
<a name="l01762"></a>01762 <span class="keywordflow">return</span> const_iterator(leaf, slot);
<a name="l01763"></a>01763 }
<a name="l01764"></a>01764
<a name="l01767"></a><a class="code" href="classstx_1_1btree.html#789cbe4a94251e756041c5504127ac50">01767</a> iterator <a class="code" href="classstx_1_1btree.html#789cbe4a94251e756041c5504127ac50" title="Searches the B+ tree and returns an iterator to the first key greater than the parameter...">upper_bound</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>& key)
<a name="l01768"></a>01768 {
<a name="l01769"></a>01769 node *n = <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>;
<a name="l01770"></a>01770 <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#14f8bf63680c8950aab8c5d54e580a14" title="Constructs a read/data-write iterator that points to the first invalid slot in the...">end</a>();
<a name="l01771"></a>01771
<a name="l01772"></a>01772 <span class="keywordflow">while</span>(!n->isleafnode())
<a name="l01773"></a>01773 {
<a name="l01774"></a>01774 <span class="keyword">const</span> inner_node *inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>inner_node*<span class="keyword">></span>(n);
<a name="l01775"></a>01775 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#43f2350acdc804684ddefe3ee1271978" title="Searches for the first key in the node n greater than key.">find_upper</a>(inner, key);
<a name="l01776"></a>01776
<a name="l01777"></a>01777 n = inner->childid[slot];
<a name="l01778"></a>01778 }
<a name="l01779"></a>01779
<a name="l01780"></a>01780 leaf_node *leaf = <span class="keyword">static_cast<</span>leaf_node*<span class="keyword">></span>(n);
<a name="l01781"></a>01781
<a name="l01782"></a>01782 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#43f2350acdc804684ddefe3ee1271978" title="Searches for the first key in the node n greater than key.">find_upper</a>(leaf, key);
<a name="l01783"></a>01783 <span class="keywordflow">return</span> iterator(leaf, slot);
<a name="l01784"></a>01784 }
<a name="l01785"></a>01785
<a name="l01788"></a><a class="code" href="classstx_1_1btree.html#1c04d1a6c7d3be8979a7ab9057da1174">01788</a> const_iterator <a class="code" href="classstx_1_1btree.html#789cbe4a94251e756041c5504127ac50" title="Searches the B+ tree and returns an iterator to the first key greater than the parameter...">upper_bound</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>& key)<span class="keyword"> const</span>
<a name="l01789"></a>01789 <span class="keyword"> </span>{
<a name="l01790"></a>01790 <span class="keyword">const</span> node *n = <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>;
<a name="l01791"></a>01791 <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#14f8bf63680c8950aab8c5d54e580a14" title="Constructs a read/data-write iterator that points to the first invalid slot in the...">end</a>();
<a name="l01792"></a>01792
<a name="l01793"></a>01793 <span class="keywordflow">while</span>(!n->isleafnode())
<a name="l01794"></a>01794 {
<a name="l01795"></a>01795 <span class="keyword">const</span> inner_node *inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>inner_node*<span class="keyword">></span>(n);
<a name="l01796"></a>01796 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#43f2350acdc804684ddefe3ee1271978" title="Searches for the first key in the node n greater than key.">find_upper</a>(inner, key);
<a name="l01797"></a>01797
<a name="l01798"></a>01798 n = inner->childid[slot];
<a name="l01799"></a>01799 }
<a name="l01800"></a>01800
<a name="l01801"></a>01801 <span class="keyword">const</span> leaf_node *leaf = <span class="keyword">static_cast<</span><span class="keyword">const </span>leaf_node*<span class="keyword">></span>(n);
<a name="l01802"></a>01802
<a name="l01803"></a>01803 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#43f2350acdc804684ddefe3ee1271978" title="Searches for the first key in the node n greater than key.">find_upper</a>(leaf, key);
<a name="l01804"></a>01804 <span class="keywordflow">return</span> const_iterator(leaf, slot);
<a name="l01805"></a>01805 }
<a name="l01806"></a>01806
<a name="l01808"></a><a class="code" href="classstx_1_1btree.html#598ffaab5e27bf4e10de0f757938744c">01808</a> <span class="keyword">inline</span> std::pair<iterator, iterator> <a class="code" href="classstx_1_1btree.html#598ffaab5e27bf4e10de0f757938744c" title="Searches the B+ tree and returns both lower_bound() and upper_bound().">equal_range</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>& key)
<a name="l01809"></a>01809 {
<a name="l01810"></a>01810 <span class="keywordflow">return</span> std::pair<iterator, iterator>(<a class="code" href="classstx_1_1btree.html#74e859adf01a516a382579a614f12673" title="Searches the B+ tree and returns an iterator to the first key less or equal to the...">lower_bound</a>(key), <a class="code" href="classstx_1_1btree.html#789cbe4a94251e756041c5504127ac50" title="Searches the B+ tree and returns an iterator to the first key greater than the parameter...">upper_bound</a>(key));
<a name="l01811"></a>01811 }
<a name="l01812"></a>01812
<a name="l01814"></a><a class="code" href="classstx_1_1btree.html#6c0e42e4d10e1ed6af48d449a7a8345f">01814</a> <span class="keyword">inline</span> std::pair<const_iterator, const_iterator> <a class="code" href="classstx_1_1btree.html#598ffaab5e27bf4e10de0f757938744c" title="Searches the B+ tree and returns both lower_bound() and upper_bound().">equal_range</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>& key)<span class="keyword"> const</span>
<a name="l01815"></a>01815 <span class="keyword"> </span>{
<a name="l01816"></a>01816 <span class="keywordflow">return</span> std::pair<const_iterator, const_iterator>(<a class="code" href="classstx_1_1btree.html#74e859adf01a516a382579a614f12673" title="Searches the B+ tree and returns an iterator to the first key less or equal to the...">lower_bound</a>(key), <a class="code" href="classstx_1_1btree.html#789cbe4a94251e756041c5504127ac50" title="Searches the B+ tree and returns an iterator to the first key greater than the parameter...">upper_bound</a>(key));
<a name="l01817"></a>01817 }
<a name="l01818"></a>01818
<a name="l01819"></a>01819 <span class="keyword">public</span>:
<a name="l01820"></a>01820 <span class="comment">// *** B+ Tree Object Comparison Functions</span>
<a name="l01821"></a>01821
<a name="l01825"></a><a class="code" href="classstx_1_1btree.html#081621ee81f875602a1788690879e7f9">01825</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#081621ee81f875602a1788690879e7f9" title="Equality relation of B+ trees of the same type.">operator==</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html" title="Basic class implementing a base B+ tree data structure in memory.">btree_self</a> &other)<span class="keyword"> const</span>
<a name="l01826"></a>01826 <span class="keyword"> </span>{
<a name="l01827"></a>01827 <span class="keywordflow">return</span> (<a class="code" href="classstx_1_1btree.html#5e32032d192795a5f25b49e23e3ef1a1" title="Return the number of key/data pairs in the B+ tree.">size</a>() == other.<a class="code" href="classstx_1_1btree.html#5e32032d192795a5f25b49e23e3ef1a1" title="Return the number of key/data pairs in the B+ tree.">size</a>()) && std::equal(<a class="code" href="classstx_1_1btree.html#6551b60cb8a2f717555ceac61f34b957" title="Constructs a read/data-write iterator that points to the first slot in the first...">begin</a>(), <a class="code" href="classstx_1_1btree.html#14f8bf63680c8950aab8c5d54e580a14" title="Constructs a read/data-write iterator that points to the first invalid slot in the...">end</a>(), other.<a class="code" href="classstx_1_1btree.html#6551b60cb8a2f717555ceac61f34b957" title="Constructs a read/data-write iterator that points to the first slot in the first...">begin</a>());
<a name="l01828"></a>01828 }
<a name="l01829"></a>01829
<a name="l01831"></a><a class="code" href="classstx_1_1btree.html#8bd8cb1bed1ba5ad6224d7f0220d1cad">01831</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#8bd8cb1bed1ba5ad6224d7f0220d1cad" title="Inequality relation. Based on operator==.">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html" title="Basic class implementing a base B+ tree data structure in memory.">btree_self</a> &other)<span class="keyword"> const</span>
<a name="l01832"></a>01832 <span class="keyword"> </span>{
<a name="l01833"></a>01833 <span class="keywordflow">return</span> !(*<span class="keyword">this</span> == other);
<a name="l01834"></a>01834 }
<a name="l01835"></a>01835
<a name="l01838"></a><a class="code" href="classstx_1_1btree.html#2ece54f92f9376137a29dc08a7d2efc9">01838</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#2ece54f92f9376137a29dc08a7d2efc9" title="Total ordering relation of B+ trees of the same type.">operator<</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html" title="Basic class implementing a base B+ tree data structure in memory.">btree_self</a> &other)<span class="keyword"> const</span>
<a name="l01839"></a>01839 <span class="keyword"> </span>{
<a name="l01840"></a>01840 <span class="keywordflow">return</span> std::lexicographical_compare(<a class="code" href="classstx_1_1btree.html#6551b60cb8a2f717555ceac61f34b957" title="Constructs a read/data-write iterator that points to the first slot in the first...">begin</a>(), <a class="code" href="classstx_1_1btree.html#14f8bf63680c8950aab8c5d54e580a14" title="Constructs a read/data-write iterator that points to the first invalid slot in the...">end</a>(), other.<a class="code" href="classstx_1_1btree.html#6551b60cb8a2f717555ceac61f34b957" title="Constructs a read/data-write iterator that points to the first slot in the first...">begin</a>(), other.<a class="code" href="classstx_1_1btree.html#14f8bf63680c8950aab8c5d54e580a14" title="Constructs a read/data-write iterator that points to the first invalid slot in the...">end</a>());
<a name="l01841"></a>01841 }
<a name="l01842"></a>01842
<a name="l01844"></a><a class="code" href="classstx_1_1btree.html#c36903fff62279a5052287c8b1ee38b2">01844</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#c36903fff62279a5052287c8b1ee38b2" title="Greater relation. Based on operator&lt;.">operator></a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html" title="Basic class implementing a base B+ tree data structure in memory.">btree_self</a> &other)<span class="keyword"> const</span>
<a name="l01845"></a>01845 <span class="keyword"> </span>{
<a name="l01846"></a>01846 <span class="keywordflow">return</span> other < *<span class="keyword">this</span>;
<a name="l01847"></a>01847 }
<a name="l01848"></a>01848
<a name="l01850"></a><a class="code" href="classstx_1_1btree.html#2acd154e278f971fca7da303366e528b">01850</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#2acd154e278f971fca7da303366e528b" title="Less-equal relation. Based on operator&lt;.">operator<=</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html" title="Basic class implementing a base B+ tree data structure in memory.">btree_self</a> &other)<span class="keyword"> const</span>
<a name="l01851"></a>01851 <span class="keyword"> </span>{
<a name="l01852"></a>01852 <span class="keywordflow">return</span> !(other < *<span class="keyword">this</span>);
<a name="l01853"></a>01853 }
<a name="l01854"></a>01854
<a name="l01856"></a><a class="code" href="classstx_1_1btree.html#3e0185adba298bb184103a1975b3cbe4">01856</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#3e0185adba298bb184103a1975b3cbe4" title="Greater-equal relation. Based on operator&lt;.">operator>=</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html" title="Basic class implementing a base B+ tree data structure in memory.">btree_self</a> &other)<span class="keyword"> const</span>
<a name="l01857"></a>01857 <span class="keyword"> </span>{
<a name="l01858"></a>01858 <span class="keywordflow">return</span> !(*<span class="keyword">this</span> < other);
<a name="l01859"></a>01859 }
<a name="l01860"></a>01860
<a name="l01861"></a>01861 <span class="keyword">public</span>:
<a name="l01863"></a>01863
<a name="l01865"></a><a class="code" href="classstx_1_1btree.html#bc9ee03092fc58297b2d2c87199a0f66">01865</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree.html" title="Basic class implementing a base B+ tree data structure in memory.">btree_self</a>& <a class="code" href="classstx_1_1btree.html#bc9ee03092fc58297b2d2c87199a0f66" title="*** Fast Copy: Assign Operator and Copy Constructors">operator= </a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html" title="Basic class implementing a base B+ tree data structure in memory.">btree_self</a> &other)
<a name="l01866"></a>01866 {
<a name="l01867"></a>01867 <span class="keywordflow">if</span> (<span class="keyword">this</span> != &other)
<a name="l01868"></a>01868 {
<a name="l01869"></a>01869 <a class="code" href="classstx_1_1btree.html#cf6ccb1acc05ef2845dfa97c81b1be9f" title="Frees all key/data pairs and all nodes of the tree.">clear</a>();
<a name="l01870"></a>01870
<a name="l01871"></a>01871 <a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a> = other.<a class="code" href="classstx_1_1btree.html#43d1c2683f2dc078aa25e49820e9c237" title="Constant access to the key comparison object sorting the B+ tree.">key_comp</a>();
<a name="l01872"></a>01872 <span class="keywordflow">if</span> (other.<a class="code" href="classstx_1_1btree.html#5e32032d192795a5f25b49e23e3ef1a1" title="Return the number of key/data pairs in the B+ tree.">size</a>() != 0)
<a name="l01873"></a>01873 {
<a name="l01874"></a>01874 <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#9e4f92e0aa1d90cbf823a3b072495be6" title="Number of leaves in the B+ tree.">leaves</a> = <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#2899f2f8e09b4f8e9be8effb3492deed" title="Number of inner nodes in the B+ tree.">innernodes</a> = 0;
<a name="l01875"></a>01875 <span class="keywordflow">if</span> (other.<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>) {
<a name="l01876"></a>01876 <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a> = <a class="code" href="classstx_1_1btree.html#f398f002480cf8a7d5c67fd3d2c33a4d" title="Recursively copy nodes from another B+ tree object.">copy_recursive</a>(other.<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>);
<a name="l01877"></a>01877 }
<a name="l01878"></a>01878 <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a> = other.<a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>;
<a name="l01879"></a>01879 }
<a name="l01880"></a>01880
<a name="l01881"></a>01881 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#ee2e25b0fccc7147fd8be0bcf8630b5b" title="Debug parameter: Enables expensive and thorough checking of the B+ tree invariants...">selfverify</a>) <a class="code" href="classstx_1_1btree.html#e382217f25916442745eb83520b20c12" title="Run a thorough verification of all B+ tree invariants.">verify</a>();
<a name="l01882"></a>01882 }
<a name="l01883"></a>01883 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l01884"></a>01884 }
<a name="l01885"></a>01885
<a name="l01888"></a><a class="code" href="classstx_1_1btree.html#af4b2be231fb3cb4c365c516115ed5bf">01888</a> <span class="keyword">inline</span> <a class="code" href="classstx_1_1btree.html#ecde28ffeec27607c2fb56192d95f607" title="Default constructor initializing an empty B+ tree with the standard key comparison...">btree</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html" title="Basic class implementing a base B+ tree data structure in memory.">btree_self</a> &other)
<a name="l01889"></a>01889 : <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>(NULL), <a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a>(NULL), <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>(NULL),
<a name="l01890"></a>01890 <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>( other.<a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a> ),
<a name="l01891"></a>01891 <a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>( other.<a class="code" href="classstx_1_1btree.html#43d1c2683f2dc078aa25e49820e9c237" title="Constant access to the key comparison object sorting the B+ tree.">key_comp</a>() )
<a name="l01892"></a>01892 {
<a name="l01893"></a>01893 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#5e32032d192795a5f25b49e23e3ef1a1" title="Return the number of key/data pairs in the B+ tree.">size</a>() > 0)
<a name="l01894"></a>01894 {
<a name="l01895"></a>01895 <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#9e4f92e0aa1d90cbf823a3b072495be6" title="Number of leaves in the B+ tree.">leaves</a> = <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#2899f2f8e09b4f8e9be8effb3492deed" title="Number of inner nodes in the B+ tree.">innernodes</a> = 0;
<a name="l01896"></a>01896 <span class="keywordflow">if</span> (other.<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>) {
<a name="l01897"></a>01897 <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a> = <a class="code" href="classstx_1_1btree.html#f398f002480cf8a7d5c67fd3d2c33a4d" title="Recursively copy nodes from another B+ tree object.">copy_recursive</a>(other.<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>);
<a name="l01898"></a>01898 }
<a name="l01899"></a>01899 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#ee2e25b0fccc7147fd8be0bcf8630b5b" title="Debug parameter: Enables expensive and thorough checking of the B+ tree invariants...">selfverify</a>) <a class="code" href="classstx_1_1btree.html#e382217f25916442745eb83520b20c12" title="Run a thorough verification of all B+ tree invariants.">verify</a>();
<a name="l01900"></a>01900 }
<a name="l01901"></a>01901 }
<a name="l01902"></a>01902
<a name="l01903"></a>01903 <span class="keyword">private</span>:
<a name="l01905"></a><a class="code" href="classstx_1_1btree.html#f398f002480cf8a7d5c67fd3d2c33a4d">01905</a> <span class="keyword">struct </span>node* <a class="code" href="classstx_1_1btree.html#f398f002480cf8a7d5c67fd3d2c33a4d" title="Recursively copy nodes from another B+ tree object.">copy_recursive</a>(<span class="keyword">const</span> node *n)
<a name="l01906"></a>01906 {
<a name="l01907"></a>01907 <span class="keywordflow">if</span> (n->isleafnode())
<a name="l01908"></a>01908 {
<a name="l01909"></a>01909 <span class="keyword">const</span> leaf_node *leaf = <span class="keyword">static_cast<</span><span class="keyword">const </span>leaf_node*<span class="keyword">></span>(n);
<a name="l01910"></a>01910 leaf_node *newleaf = <a class="code" href="classstx_1_1btree.html#359771538c203e0e8e301135783fa4a4" title="Allocate and initialize a leaf node.">allocate_leaf</a>();
<a name="l01911"></a>01911
<a name="l01912"></a>01912 newleaf->slotuse = leaf->slotuse;
<a name="l01913"></a>01913 std::copy(leaf->slotkey, leaf->slotkey + leaf->slotuse, newleaf->slotkey);
<a name="l01914"></a>01914 std::copy(leaf->slotdata, leaf->slotdata + leaf->slotuse, newleaf->slotdata);
<a name="l01915"></a>01915
<a name="l01916"></a>01916 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a> == NULL)
<a name="l01917"></a>01917 {
<a name="l01918"></a>01918 <a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a> = <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a> = newleaf;
<a name="l01919"></a>01919 newleaf-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a> = newleaf-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a> = NULL;
<a name="l01920"></a>01920 }
<a name="l01921"></a>01921 <span class="keywordflow">else</span>
<a name="l01922"></a>01922 {
<a name="l01923"></a>01923 newleaf-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a> = <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>;
<a name="l01924"></a>01924 <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a> = newleaf;
<a name="l01925"></a>01925 <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a> = newleaf;
<a name="l01926"></a>01926 }
<a name="l01927"></a>01927
<a name="l01928"></a>01928 <span class="keywordflow">return</span> newleaf;
<a name="l01929"></a>01929 }
<a name="l01930"></a>01930 <span class="keywordflow">else</span>
<a name="l01931"></a>01931 {
<a name="l01932"></a>01932 <span class="keyword">const</span> inner_node *inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>inner_node*<span class="keyword">></span>(n);
<a name="l01933"></a>01933 inner_node *newinner = <a class="code" href="classstx_1_1btree.html#48afc242f523282f8833580a5370ff81" title="Allocate and initialize an inner node.">allocate_inner</a>(inner->level);
<a name="l01934"></a>01934
<a name="l01935"></a>01935 newinner->slotuse = inner->slotuse;
<a name="l01936"></a>01936 std::copy(inner->slotkey, inner->slotkey + inner->slotuse, newinner->slotkey);
<a name="l01937"></a>01937
<a name="l01938"></a>01938 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot <= inner->slotuse; ++slot)
<a name="l01939"></a>01939 {
<a name="l01940"></a>01940 newinner->childid[slot] = <a class="code" href="classstx_1_1btree.html#f398f002480cf8a7d5c67fd3d2c33a4d" title="Recursively copy nodes from another B+ tree object.">copy_recursive</a>(inner->childid[slot]);
<a name="l01941"></a>01941 }
<a name="l01942"></a>01942
<a name="l01943"></a>01943 <span class="keywordflow">return</span> newinner;
<a name="l01944"></a>01944 }
<a name="l01945"></a>01945 }
<a name="l01946"></a>01946
<a name="l01947"></a>01947 <span class="keyword">public</span>:
<a name="l01948"></a>01948 <span class="comment">// *** Public Insertion Functions</span>
<a name="l01949"></a>01949
<a name="l01953"></a><a class="code" href="classstx_1_1btree.html#6a96ea1453ad3392ad4722265ceae976">01953</a> <span class="keyword">inline</span> std::pair<iterator, bool> <a class="code" href="classstx_1_1btree.html#6a96ea1453ad3392ad4722265ceae976" title="Attempt to insert a key/data pair into the B+ tree.">insert</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#f7a75a733f8547491913b0e5b8d11a4e" title="The pair of key_type and data_type, this may be different from value_type.">pair_type</a>& x)
<a name="l01954"></a>01954 {
<a name="l01955"></a>01955 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#754a5b04887a9df1cb0e51afffc36bfd" title="Start the insertion descent at the current root and handle root splits.">insert_start</a>(x.first, x.second);
<a name="l01956"></a>01956 }
<a name="l01957"></a>01957
<a name="l01962"></a><a class="code" href="classstx_1_1btree.html#63cf076cefd57cdc773170e8f7dc0b41">01962</a> <span class="keyword">inline</span> std::pair<iterator, bool> <a class="code" href="classstx_1_1btree.html#6a96ea1453ad3392ad4722265ceae976" title="Attempt to insert a key/data pair into the B+ tree.">insert</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>& key, <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#ca29ad902418d86eeb9b9379a38e5fcd" title="Second template parameter: The data type associated with each key.">data_type</a>& data)
<a name="l01963"></a>01963 {
<a name="l01964"></a>01964 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#754a5b04887a9df1cb0e51afffc36bfd" title="Start the insertion descent at the current root and handle root splits.">insert_start</a>(key, data);
<a name="l01965"></a>01965 }
<a name="l01966"></a>01966
<a name="l01971"></a><a class="code" href="classstx_1_1btree.html#45d95a83fbbfa0211a972b8f7451a19c">01971</a> <span class="keyword">inline</span> std::pair<iterator, bool> <a class="code" href="classstx_1_1btree.html#45d95a83fbbfa0211a972b8f7451a19c" title="Attempt to insert a key/data pair into the B+ tree.">insert2</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>& key, <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#ca29ad902418d86eeb9b9379a38e5fcd" title="Second template parameter: The data type associated with each key.">data_type</a>& data)
<a name="l01972"></a>01972 {
<a name="l01973"></a>01973 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#754a5b04887a9df1cb0e51afffc36bfd" title="Start the insertion descent at the current root and handle root splits.">insert_start</a>(key, data);
<a name="l01974"></a>01974 }
<a name="l01975"></a>01975
<a name="l01978"></a><a class="code" href="classstx_1_1btree.html#19879710dc73555397fc83acf1d00328">01978</a> <span class="keyword">inline</span> iterator <a class="code" href="classstx_1_1btree.html#6a96ea1453ad3392ad4722265ceae976" title="Attempt to insert a key/data pair into the B+ tree.">insert</a>(iterator <span class="comment">/* hint */</span>, <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#f7a75a733f8547491913b0e5b8d11a4e" title="The pair of key_type and data_type, this may be different from value_type.">pair_type</a> &x)
<a name="l01979"></a>01979 {
<a name="l01980"></a>01980 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#754a5b04887a9df1cb0e51afffc36bfd" title="Start the insertion descent at the current root and handle root splits.">insert_start</a>(x.first, x.second).first;
<a name="l01981"></a>01981 }
<a name="l01982"></a>01982
<a name="l01985"></a><a class="code" href="classstx_1_1btree.html#21daa4ef5ae703f189ec3c917113b780">01985</a> <span class="keyword">inline</span> iterator <a class="code" href="classstx_1_1btree.html#45d95a83fbbfa0211a972b8f7451a19c" title="Attempt to insert a key/data pair into the B+ tree.">insert2</a>(iterator <span class="comment">/* hint */</span>, <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>& key, <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#ca29ad902418d86eeb9b9379a38e5fcd" title="Second template parameter: The data type associated with each key.">data_type</a>& data)
<a name="l01986"></a>01986 {
<a name="l01987"></a>01987 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#754a5b04887a9df1cb0e51afffc36bfd" title="Start the insertion descent at the current root and handle root splits.">insert_start</a>(key, data).first;
<a name="l01988"></a>01988 }
<a name="l01989"></a>01989
<a name="l01992"></a>01992 <span class="keyword">template</span> <<span class="keyword">typename</span> InputIterator>
<a name="l01993"></a><a class="code" href="classstx_1_1btree.html#0c47337c74d366a69ba38131be49e6fa">01993</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#6a96ea1453ad3392ad4722265ceae976" title="Attempt to insert a key/data pair into the B+ tree.">insert</a>(InputIterator first, InputIterator last)
<a name="l01994"></a>01994 {
<a name="l01995"></a>01995 InputIterator iter = first;
<a name="l01996"></a>01996 <span class="keywordflow">while</span>(iter != last)
<a name="l01997"></a>01997 {
<a name="l01998"></a>01998 <a class="code" href="classstx_1_1btree.html#6a96ea1453ad3392ad4722265ceae976" title="Attempt to insert a key/data pair into the B+ tree.">insert</a>(*iter);
<a name="l01999"></a>01999 ++iter;
<a name="l02000"></a>02000 }
<a name="l02001"></a>02001 }
<a name="l02002"></a>02002
<a name="l02003"></a>02003 <span class="keyword">private</span>:
<a name="l02004"></a>02004 <span class="comment">// *** Private Insertion Functions</span>
<a name="l02005"></a>02005
<a name="l02008"></a><a class="code" href="classstx_1_1btree.html#754a5b04887a9df1cb0e51afffc36bfd">02008</a> std::pair<iterator, bool> <a class="code" href="classstx_1_1btree.html#754a5b04887a9df1cb0e51afffc36bfd" title="Start the insertion descent at the current root and handle root splits.">insert_start</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>& key, <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#ca29ad902418d86eeb9b9379a38e5fcd" title="Second template parameter: The data type associated with each key.">data_type</a>& value)
<a name="l02009"></a>02009 {
<a name="l02010"></a>02010 node *newchild = NULL;
<a name="l02011"></a>02011 <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> newkey = <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>();
<a name="l02012"></a>02012
<a name="l02013"></a>02013 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a> == NULL) {
<a name="l02014"></a>02014 <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a> = <a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a> = <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a> = <a class="code" href="classstx_1_1btree.html#359771538c203e0e8e301135783fa4a4" title="Allocate and initialize a leaf node.">allocate_leaf</a>();
<a name="l02015"></a>02015 }
<a name="l02016"></a>02016
<a name="l02017"></a>02017 std::pair<iterator, bool> r = <a class="code" href="classstx_1_1btree.html#9f24e411dd05b99edb58935389c1664d" title="Insert an item into the B+ tree.">insert_descend</a>(<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>, key, value, &newkey, &newchild);
<a name="l02018"></a>02018
<a name="l02019"></a>02019 <span class="keywordflow">if</span> (newchild)
<a name="l02020"></a>02020 {
<a name="l02021"></a>02021 inner_node *newroot = <a class="code" href="classstx_1_1btree.html#48afc242f523282f8833580a5370ff81" title="Allocate and initialize an inner node.">allocate_inner</a>(<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>-><a class="code" href="structstx_1_1btree_1_1node.html#7f1964408f460bd6aa16231e41548d04" title="Level in the b-tree, if level == 0 -&gt; leaf node.">level</a> + 1);
<a name="l02022"></a>02022 newroot->slotkey[0] = newkey;
<a name="l02023"></a>02023
<a name="l02024"></a>02024 newroot->childid[0] = <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>;
<a name="l02025"></a>02025 newroot->childid[1] = newchild;
<a name="l02026"></a>02026
<a name="l02027"></a>02027 newroot-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a> = 1;
<a name="l02028"></a>02028
<a name="l02029"></a>02029 <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a> = newroot;
<a name="l02030"></a>02030 }
<a name="l02031"></a>02031
<a name="l02032"></a>02032 <span class="comment">// increment itemcount if the item was inserted</span>
<a name="l02033"></a>02033 <span class="keywordflow">if</span> (r.second) ++<a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#8822d400b91499816b6c985e781e9018" title="Number of items in the B+ tree.">itemcount</a>;
<a name="l02034"></a>02034
<a name="l02035"></a>02035 <span class="preprocessor">#ifdef BTREE_DEBUG</span>
<a name="l02036"></a>02036 <span class="preprocessor"></span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#ac6ff74fe9fb9e87958d73c28cb9eef4" title="Debug parameter: Prints out lots of debug information about how the algorithms change...">debug</a>) <a class="code" href="classstx_1_1btree.html#97664fdfb85917808eee2aa8487c5e39" title="Print out the B+ tree structure with keys onto the given ostream.">print</a>(std::cout);
<a name="l02037"></a>02037 <span class="preprocessor">#endif</span>
<a name="l02038"></a>02038 <span class="preprocessor"></span>
<a name="l02039"></a>02039 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#ee2e25b0fccc7147fd8be0bcf8630b5b" title="Debug parameter: Enables expensive and thorough checking of the B+ tree invariants...">selfverify</a>) {
<a name="l02040"></a>02040 <a class="code" href="classstx_1_1btree.html#e382217f25916442745eb83520b20c12" title="Run a thorough verification of all B+ tree invariants.">verify</a>();
<a name="l02041"></a>02041 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(<a class="code" href="classstx_1_1btree.html#9405c7a274bcc76f27b4e84c49fcaa0d" title="Non-STL function checking whether a key is in the B+ tree.">exists</a>(key));
<a name="l02042"></a>02042 }
<a name="l02043"></a>02043
<a name="l02044"></a>02044 <span class="keywordflow">return</span> r;
<a name="l02045"></a>02045 }
<a name="l02046"></a>02046
<a name="l02054"></a><a class="code" href="classstx_1_1btree.html#9f24e411dd05b99edb58935389c1664d">02054</a> std::pair<iterator, bool> <a class="code" href="classstx_1_1btree.html#9f24e411dd05b99edb58935389c1664d" title="Insert an item into the B+ tree.">insert_descend</a>(node* n,
<a name="l02055"></a>02055 <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>& key, <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#ca29ad902418d86eeb9b9379a38e5fcd" title="Second template parameter: The data type associated with each key.">data_type</a>& value,
<a name="l02056"></a>02056 <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>* splitkey, node** splitnode)
<a name="l02057"></a>02057 {
<a name="l02058"></a>02058 <span class="keywordflow">if</span> (!n->isleafnode())
<a name="l02059"></a>02059 {
<a name="l02060"></a>02060 inner_node *inner = <span class="keyword">static_cast<</span>inner_node*<span class="keyword">></span>(n);
<a name="l02061"></a>02061
<a name="l02062"></a>02062 <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> newkey = <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>();
<a name="l02063"></a>02063 node *newchild = NULL;
<a name="l02064"></a>02064
<a name="l02065"></a>02065 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(inner, key);
<a name="l02066"></a>02066
<a name="l02067"></a>02067 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"btree::insert_descend into "</span> << inner->childid[slot] << std::endl);
<a name="l02068"></a>02068
<a name="l02069"></a>02069 std::pair<iterator, bool> r = <a class="code" href="classstx_1_1btree.html#9f24e411dd05b99edb58935389c1664d" title="Insert an item into the B+ tree.">insert_descend</a>(inner->childid[slot],
<a name="l02070"></a>02070 key, value, &newkey, &newchild);
<a name="l02071"></a>02071
<a name="l02072"></a>02072 <span class="keywordflow">if</span> (newchild)
<a name="l02073"></a>02073 {
<a name="l02074"></a>02074 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"btree::insert_descend newchild with key "</span> << newkey << <span class="stringliteral">" node "</span> << newchild << <span class="stringliteral">" at slot "</span> << slot << std::endl);
<a name="l02075"></a>02075
<a name="l02076"></a>02076 <span class="keywordflow">if</span> (inner->isfull())
<a name="l02077"></a>02077 {
<a name="l02078"></a>02078 <a class="code" href="classstx_1_1btree.html#bba0627e1a8a9fa86ff1b44e6c8f8dea" title="Split up an inner node into two equally-filled sibling nodes.">split_inner_node</a>(inner, splitkey, splitnode, slot);
<a name="l02079"></a>02079
<a name="l02080"></a>02080 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"btree::insert_descend done split_inner: putslot: "</span> << slot << <span class="stringliteral">" putkey: "</span> << newkey << <span class="stringliteral">" upkey: "</span> << *splitkey << std::endl);
<a name="l02081"></a>02081
<a name="l02082"></a>02082 <span class="preprocessor">#ifdef BTREE_DEBUG</span>
<a name="l02083"></a>02083 <span class="preprocessor"></span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#ac6ff74fe9fb9e87958d73c28cb9eef4" title="Debug parameter: Prints out lots of debug information about how the algorithms change...">debug</a>)
<a name="l02084"></a>02084 {
<a name="l02085"></a>02085 <a class="code" href="classstx_1_1btree.html#197122d34fc70adfd60219a98bbbb489" title="Recursively descend down the tree and print out nodes.">print_node</a>(std::cout, inner);
<a name="l02086"></a>02086 <a class="code" href="classstx_1_1btree.html#197122d34fc70adfd60219a98bbbb489" title="Recursively descend down the tree and print out nodes.">print_node</a>(std::cout, *splitnode);
<a name="l02087"></a>02087 }
<a name="l02088"></a>02088 <span class="preprocessor">#endif</span>
<a name="l02089"></a>02089 <span class="preprocessor"></span>
<a name="l02090"></a>02090 <span class="comment">// check if insert slot is in the split sibling node</span>
<a name="l02091"></a>02091 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"btree::insert_descend switch: "</span> << slot << <span class="stringliteral">" > "</span> << inner->slotuse+1 << std::endl);
<a name="l02092"></a>02092
<a name="l02093"></a>02093 <span class="keywordflow">if</span> (slot == inner->slotuse+1 && inner->slotuse < (*splitnode)->slotuse)
<a name="l02094"></a>02094 {
<a name="l02095"></a>02095 <span class="comment">// special case when the insert slot matches the split</span>
<a name="l02096"></a>02096 <span class="comment">// place between the two nodes, then the insert key</span>
<a name="l02097"></a>02097 <span class="comment">// becomes the split key.</span>
<a name="l02098"></a>02098
<a name="l02099"></a>02099 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(inner->slotuse + 1 < <a class="code" href="classstx_1_1btree.html#83a18c2fb7f4e9cfd47ce7545d004324" title="Base B+ tree parameter: The number of key slots in each inner node, this can differ...">innerslotmax</a>);
<a name="l02100"></a>02100
<a name="l02101"></a>02101 inner_node *splitinner = <span class="keyword">static_cast<</span>inner_node*<span class="keyword">></span>(*splitnode);
<a name="l02102"></a>02102
<a name="l02103"></a>02103 <span class="comment">// move the split key and it's datum into the left node</span>
<a name="l02104"></a>02104 inner->slotkey[inner->slotuse] = *splitkey;
<a name="l02105"></a>02105 inner->childid[inner->slotuse+1] = splitinner->childid[0];
<a name="l02106"></a>02106 inner->slotuse++;
<a name="l02107"></a>02107
<a name="l02108"></a>02108 <span class="comment">// set new split key and move corresponding datum into right node</span>
<a name="l02109"></a>02109 splitinner->childid[0] = newchild;
<a name="l02110"></a>02110 *splitkey = newkey;
<a name="l02111"></a>02111
<a name="l02112"></a>02112 <span class="keywordflow">return</span> r;
<a name="l02113"></a>02113 }
<a name="l02114"></a>02114 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (slot >= inner->slotuse+1)
<a name="l02115"></a>02115 {
<a name="l02116"></a>02116 <span class="comment">// in case the insert slot is in the newly create split</span>
<a name="l02117"></a>02117 <span class="comment">// node, we reuse the code below.</span>
<a name="l02118"></a>02118
<a name="l02119"></a>02119 slot -= inner->slotuse+1;
<a name="l02120"></a>02120 inner = <span class="keyword">static_cast<</span>inner_node*<span class="keyword">></span>(*splitnode);
<a name="l02121"></a>02121 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"btree::insert_descend switching to splitted node "</span> << inner << <span class="stringliteral">" slot "</span> << slot <<std::endl);
<a name="l02122"></a>02122 }
<a name="l02123"></a>02123 }
<a name="l02124"></a>02124
<a name="l02125"></a>02125 <span class="comment">// put pointer to child node into correct slot</span>
<a name="l02126"></a>02126 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(slot >= 0 && slot <= inner->slotuse);
<a name="l02127"></a>02127
<a name="l02128"></a>02128 <span class="keywordtype">int</span> i = inner->slotuse;
<a name="l02129"></a>02129
<a name="l02130"></a>02130 <span class="keywordflow">while</span>(i > slot) {
<a name="l02131"></a>02131 inner->slotkey[i] = inner->slotkey[i - 1];
<a name="l02132"></a>02132 inner->childid[i + 1] = inner->childid[i];
<a name="l02133"></a>02133 i--;
<a name="l02134"></a>02134 }
<a name="l02135"></a>02135
<a name="l02136"></a>02136 inner->slotkey[slot] = newkey;
<a name="l02137"></a>02137 inner->childid[slot + 1] = newchild;
<a name="l02138"></a>02138 inner->slotuse++;
<a name="l02139"></a>02139 }
<a name="l02140"></a>02140
<a name="l02141"></a>02141 <span class="keywordflow">return</span> r;
<a name="l02142"></a>02142 }
<a name="l02143"></a>02143 <span class="keywordflow">else</span> <span class="comment">// n->isleafnode() == true</span>
<a name="l02144"></a>02144 {
<a name="l02145"></a>02145 leaf_node *leaf = <span class="keyword">static_cast<</span>leaf_node*<span class="keyword">></span>(n);
<a name="l02146"></a>02146
<a name="l02147"></a>02147 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(leaf, key);
<a name="l02148"></a>02148
<a name="l02149"></a>02149 <span class="keywordflow">if</span> (!<a class="code" href="classstx_1_1btree.html#35378979c13861883affefda9ad95df7" title="Sixth template parameter: Allow duplicate keys in the B+ tree.">allow_duplicates</a> && slot < leaf->slotuse && <a class="code" href="classstx_1_1btree.html#f09828d360e903d40c9f8c77183bea0e" title="True if a == b ? constructed from key_less().">key_equal</a>(key, leaf->slotkey[slot])) {
<a name="l02150"></a>02150 <span class="keywordflow">return</span> std::pair<iterator, bool>(iterator(leaf, slot), <span class="keyword">false</span>);
<a name="l02151"></a>02151 }
<a name="l02152"></a>02152
<a name="l02153"></a>02153 <span class="keywordflow">if</span> (leaf->isfull())
<a name="l02154"></a>02154 {
<a name="l02155"></a>02155 <a class="code" href="classstx_1_1btree.html#65184b7ff0a48d7c013041dac45ddab9" title="Split up a leaf node into two equally-filled sibling leaves.">split_leaf_node</a>(leaf, splitkey, splitnode);
<a name="l02156"></a>02156
<a name="l02157"></a>02157 <span class="comment">// check if insert slot is in the split sibling node</span>
<a name="l02158"></a>02158 <span class="keywordflow">if</span> (slot >= leaf->slotuse)
<a name="l02159"></a>02159 {
<a name="l02160"></a>02160 slot -= leaf->slotuse;
<a name="l02161"></a>02161 leaf = <span class="keyword">static_cast<</span>leaf_node*<span class="keyword">></span>(*splitnode);
<a name="l02162"></a>02162 }
<a name="l02163"></a>02163 }
<a name="l02164"></a>02164
<a name="l02165"></a>02165 <span class="comment">// put data item into correct data slot</span>
<a name="l02166"></a>02166
<a name="l02167"></a>02167 <span class="keywordtype">int</span> i = leaf->slotuse - 1;
<a name="l02168"></a>02168 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(i + 1 < <a class="code" href="classstx_1_1btree.html#12a39ca671e962924f4acf879a44eafc" title="Base B+ tree parameter: The number of key/data slots in each leaf.">leafslotmax</a>);
<a name="l02169"></a>02169
<a name="l02170"></a>02170 <span class="keywordflow">while</span>(i >= 0 && <a class="code" href="classstx_1_1btree.html#5e618ec38c852d5b81d997bdc932d592" title="Key comparison object.">key_less</a>(key, leaf->slotkey[i])) {
<a name="l02171"></a>02171 leaf->slotkey[i + 1] = leaf->slotkey[i];
<a name="l02172"></a>02172 leaf->slotdata[i + 1] = leaf->slotdata[i];
<a name="l02173"></a>02173 i--;
<a name="l02174"></a>02174 }
<a name="l02175"></a>02175
<a name="l02176"></a>02176 leaf->slotkey[i + 1] = key;
<a name="l02177"></a>02177 leaf->slotdata[i + 1] = value;
<a name="l02178"></a>02178 leaf->slotuse++;
<a name="l02179"></a>02179
<a name="l02180"></a>02180 <span class="keywordflow">if</span> (splitnode && leaf != *splitnode && slot == leaf->slotuse-1)
<a name="l02181"></a>02181 {
<a name="l02182"></a>02182 <span class="comment">// special case: the node was split, and the insert is at the</span>
<a name="l02183"></a>02183 <span class="comment">// last slot of the old node. then the splitkey must be</span>
<a name="l02184"></a>02184 <span class="comment">// updated.</span>
<a name="l02185"></a>02185 *splitkey = key;
<a name="l02186"></a>02186 }
<a name="l02187"></a>02187
<a name="l02188"></a>02188 <span class="keywordflow">return</span> std::pair<iterator, bool>(iterator(leaf, i + 1), <span class="keyword">true</span>);
<a name="l02189"></a>02189 }
<a name="l02190"></a>02190 }
<a name="l02191"></a>02191
<a name="l02194"></a><a class="code" href="classstx_1_1btree.html#65184b7ff0a48d7c013041dac45ddab9">02194</a> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#65184b7ff0a48d7c013041dac45ddab9" title="Split up a leaf node into two equally-filled sibling leaves.">split_leaf_node</a>(leaf_node* leaf, <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>* _newkey, node** _newleaf)
<a name="l02195"></a>02195 {
<a name="l02196"></a>02196 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(leaf->isfull());
<a name="l02197"></a>02197
<a name="l02198"></a>02198 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> mid = (leaf->slotuse >> 1);
<a name="l02199"></a>02199
<a name="l02200"></a>02200 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"btree::split_leaf_node on "</span> << leaf << std::endl);
<a name="l02201"></a>02201
<a name="l02202"></a>02202 leaf_node *newleaf = <a class="code" href="classstx_1_1btree.html#359771538c203e0e8e301135783fa4a4" title="Allocate and initialize a leaf node.">allocate_leaf</a>();
<a name="l02203"></a>02203
<a name="l02204"></a>02204 newleaf->slotuse = leaf->slotuse - mid;
<a name="l02205"></a>02205
<a name="l02206"></a>02206 newleaf->nextleaf = leaf->nextleaf;
<a name="l02207"></a>02207 <span class="keywordflow">if</span> (newleaf->nextleaf == NULL) {
<a name="l02208"></a>02208 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(leaf == <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>);
<a name="l02209"></a>02209 <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a> = newleaf;
<a name="l02210"></a>02210 }
<a name="l02211"></a>02211 <span class="keywordflow">else</span> {
<a name="l02212"></a>02212 newleaf-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a> = newleaf;
<a name="l02213"></a>02213 }
<a name="l02214"></a>02214
<a name="l02215"></a>02215 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> slot = mid; slot < leaf->slotuse; ++slot)
<a name="l02216"></a>02216 {
<a name="l02217"></a>02217 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ni = slot - mid;
<a name="l02218"></a>02218 newleaf-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#cdae18752022a3f57ecb2be00bbe4dfd" title="Keys of children or data pointers.">slotkey</a>[ni] = leaf->slotkey[slot];
<a name="l02219"></a>02219 newleaf->slotdata[ni] = leaf->slotdata[slot];
<a name="l02220"></a>02220 }
<a name="l02221"></a>02221
<a name="l02222"></a>02222 leaf->slotuse = mid;
<a name="l02223"></a>02223 leaf->nextleaf = newleaf;
<a name="l02224"></a>02224 newleaf->prevleaf = leaf;
<a name="l02225"></a>02225
<a name="l02226"></a>02226 *_newkey = leaf->slotkey[leaf->slotuse-1];
<a name="l02227"></a>02227 *_newleaf = newleaf;
<a name="l02228"></a>02228 }
<a name="l02229"></a>02229
<a name="l02234"></a><a class="code" href="classstx_1_1btree.html#bba0627e1a8a9fa86ff1b44e6c8f8dea">02234</a> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#bba0627e1a8a9fa86ff1b44e6c8f8dea" title="Split up an inner node into two equally-filled sibling nodes.">split_inner_node</a>(inner_node* inner, <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>* _newkey, node** _newinner, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> addslot)
<a name="l02235"></a>02235 {
<a name="l02236"></a>02236 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(inner->isfull());
<a name="l02237"></a>02237
<a name="l02238"></a>02238 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> mid = (inner->slotuse >> 1);
<a name="l02239"></a>02239
<a name="l02240"></a>02240 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"btree::split_inner: mid "</span> << mid << <span class="stringliteral">" addslot "</span> << addslot << std::endl);
<a name="l02241"></a>02241
<a name="l02242"></a>02242 <span class="comment">// if the split is uneven and the overflowing item will be put into the</span>
<a name="l02243"></a>02243 <span class="comment">// larger node, then the smaller split node may underflow</span>
<a name="l02244"></a>02244 <span class="keywordflow">if</span> (addslot <= mid && mid > inner->slotuse - (mid + 1))
<a name="l02245"></a>02245 mid--;
<a name="l02246"></a>02246
<a name="l02247"></a>02247 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"btree::split_inner: mid "</span> << mid << <span class="stringliteral">" addslot "</span> << addslot << std::endl);
<a name="l02248"></a>02248
<a name="l02249"></a>02249 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"btree::split_inner_node on "</span> << inner << <span class="stringliteral">" into two nodes "</span> << mid << <span class="stringliteral">" and "</span> << inner->slotuse - (mid + 1) << <span class="stringliteral">" sized"</span> << std::endl);
<a name="l02250"></a>02250
<a name="l02251"></a>02251 inner_node *newinner = <a class="code" href="classstx_1_1btree.html#48afc242f523282f8833580a5370ff81" title="Allocate and initialize an inner node.">allocate_inner</a>(inner->level);
<a name="l02252"></a>02252
<a name="l02253"></a>02253 newinner->slotuse = inner->slotuse - (mid + 1);
<a name="l02254"></a>02254
<a name="l02255"></a>02255 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> slot = mid + 1; slot < inner->slotuse; ++slot)
<a name="l02256"></a>02256 {
<a name="l02257"></a>02257 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ni = slot - (mid + 1);
<a name="l02258"></a>02258 newinner->slotkey[ni] = inner->slotkey[slot];
<a name="l02259"></a>02259 newinner->childid[ni] = inner->childid[slot];
<a name="l02260"></a>02260 }
<a name="l02261"></a>02261 newinner->childid[newinner->slotuse] = inner->childid[inner->slotuse];
<a name="l02262"></a>02262
<a name="l02263"></a>02263 inner->slotuse = mid;
<a name="l02264"></a>02264
<a name="l02265"></a>02265 *_newkey = inner->slotkey[mid];
<a name="l02266"></a>02266 *_newinner = newinner;
<a name="l02267"></a>02267 }
<a name="l02268"></a>02268
<a name="l02269"></a>02269 <span class="keyword">private</span>:
<a name="l02270"></a>02270 <span class="comment">// *** Support Class Encapsulating Deletion Results</span>
<a name="l02271"></a>02271
<a name="l02273"></a><a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b">02273</a> <span class="keyword">enum</span> <a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b" title="Result flags of recursive deletion.">result_flags_t</a>
<a name="l02274"></a>02274 {
<a name="l02276"></a><a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b76e78fd0f7a6075c905f3ef9581c1ee1">02276</a> <a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b76e78fd0f7a6075c905f3ef9581c1ee1" title="Deletion successful and no fix-ups necessary.">btree_ok</a> = 0,
<a name="l02277"></a>02277
<a name="l02279"></a><a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b6137f9692d832a3df82f0d2139d00c6b">02279</a> <a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b6137f9692d832a3df82f0d2139d00c6b" title="Deletion not successful because key was not found.">btree_not_found</a> = 1,
<a name="l02280"></a>02280
<a name="l02283"></a><a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02bfa91b1cf87110d0008592aeb78ce65e7">02283</a> <a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02bfa91b1cf87110d0008592aeb78ce65e7" title="Deletion successful, the last key was updated so parent slotkeys need updates.">btree_update_lastkey</a> = 2,
<a name="l02284"></a>02284
<a name="l02287"></a><a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b6ad2378afb40ca40049df5f0ec3a0647">02287</a> <a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b6ad2378afb40ca40049df5f0ec3a0647" title="Deletion successful, children nodes were merged and the parent needs to remove the...">btree_fixmerge</a> = 4
<a name="l02288"></a>02288 };
<a name="l02289"></a>02289
<a name="l02292"></a>02292 <span class="keyword">struct </span>result_t
<a name="l02293"></a>02293 {
<a name="l02295"></a>02295 <a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b" title="Result flags of recursive deletion.">result_flags_t</a> flags;
<a name="l02296"></a>02296
<a name="l02298"></a>02298 <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> lastkey;
<a name="l02299"></a>02299
<a name="l02302"></a>02302 <span class="keyword">inline</span> result_t(<a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b" title="Result flags of recursive deletion.">result_flags_t</a> f = <a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b76e78fd0f7a6075c905f3ef9581c1ee1" title="Deletion successful and no fix-ups necessary.">btree_ok</a>)
<a name="l02303"></a>02303 : flags(f), lastkey()
<a name="l02304"></a>02304 { }
<a name="l02305"></a>02305
<a name="l02307"></a>02307 <span class="keyword">inline</span> result_t(<a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b" title="Result flags of recursive deletion.">result_flags_t</a> f, <span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> &k)
<a name="l02308"></a>02308 : flags(f), lastkey(k)
<a name="l02309"></a>02309 { }
<a name="l02310"></a>02310
<a name="l02312"></a>02312 <span class="keyword">inline</span> <span class="keywordtype">bool</span> has(<a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b" title="Result flags of recursive deletion.">result_flags_t</a> f)<span class="keyword"> const</span>
<a name="l02313"></a>02313 <span class="keyword"> </span>{
<a name="l02314"></a>02314 <span class="keywordflow">return</span> (flags & f) != 0;
<a name="l02315"></a>02315 }
<a name="l02316"></a>02316
<a name="l02318"></a>02318 <span class="keyword">inline</span> result_t& operator|= (<span class="keyword">const</span> result_t &other)
<a name="l02319"></a>02319 {
<a name="l02320"></a>02320 flags = <a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b" title="Result flags of recursive deletion.">result_flags_t</a>(flags | other.flags);
<a name="l02321"></a>02321
<a name="l02322"></a>02322 <span class="comment">// we overwrite existing lastkeys on purpose</span>
<a name="l02323"></a>02323 <span class="keywordflow">if</span> (other.has(<a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02bfa91b1cf87110d0008592aeb78ce65e7" title="Deletion successful, the last key was updated so parent slotkeys need updates.">btree_update_lastkey</a>))
<a name="l02324"></a>02324 lastkey = other.lastkey;
<a name="l02325"></a>02325
<a name="l02326"></a>02326 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l02327"></a>02327 }
<a name="l02328"></a>02328 };
<a name="l02329"></a>02329
<a name="l02330"></a>02330 <span class="keyword">public</span>:
<a name="l02331"></a>02331 <span class="comment">// *** Public Erase Functions</span>
<a name="l02332"></a>02332
<a name="l02335"></a><a class="code" href="classstx_1_1btree.html#c01d4b6b26e5c8447e92651168b006d4">02335</a> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#c01d4b6b26e5c8447e92651168b006d4" title="Erases one (the first) of the key/data pairs associated with the given key.">erase_one</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> &key)
<a name="l02336"></a>02336 {
<a name="l02337"></a>02337 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"btree::erase_one("</span> << key << <span class="stringliteral">") on btree size "</span> << <a class="code" href="classstx_1_1btree.html#5e32032d192795a5f25b49e23e3ef1a1" title="Return the number of key/data pairs in the B+ tree.">size</a>() << std::endl);
<a name="l02338"></a>02338
<a name="l02339"></a>02339 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#ee2e25b0fccc7147fd8be0bcf8630b5b" title="Debug parameter: Enables expensive and thorough checking of the B+ tree invariants...">selfverify</a>) <a class="code" href="classstx_1_1btree.html#e382217f25916442745eb83520b20c12" title="Run a thorough verification of all B+ tree invariants.">verify</a>();
<a name="l02340"></a>02340
<a name="l02341"></a>02341 <span class="keywordflow">if</span> (!<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l02342"></a>02342
<a name="l02343"></a>02343 result_t result = <a class="code" href="classstx_1_1btree.html#40e3e935186128e71b90ad2482fc73a7" title="Erase one (the first) key/data pair in the B+ tree matching key.">erase_one_descend</a>(key, <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>, NULL, NULL, NULL, NULL, NULL, 0);
<a name="l02344"></a>02344
<a name="l02345"></a>02345 <span class="keywordflow">if</span> (!result.has(<a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b6137f9692d832a3df82f0d2139d00c6b" title="Deletion not successful because key was not found.">btree_not_found</a>))
<a name="l02346"></a>02346 --<a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#8822d400b91499816b6c985e781e9018" title="Number of items in the B+ tree.">itemcount</a>;
<a name="l02347"></a>02347
<a name="l02348"></a>02348 #ifdef BTREE_DEBUG
<a name="l02349"></a>02349 if (<a class="code" href="classstx_1_1btree.html#ac6ff74fe9fb9e87958d73c28cb9eef4" title="Debug parameter: Prints out lots of debug information about how the algorithms change...">debug</a>) <a class="code" href="classstx_1_1btree.html#97664fdfb85917808eee2aa8487c5e39" title="Print out the B+ tree structure with keys onto the given ostream.">print</a>(std::cout);
<a name="l02350"></a>02350 <span class="preprocessor">#endif</span>
<a name="l02351"></a>02351 <span class="preprocessor"></span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#ee2e25b0fccc7147fd8be0bcf8630b5b" title="Debug parameter: Enables expensive and thorough checking of the B+ tree invariants...">selfverify</a>) <a class="code" href="classstx_1_1btree.html#e382217f25916442745eb83520b20c12" title="Run a thorough verification of all B+ tree invariants.">verify</a>();
<a name="l02352"></a>02352
<a name="l02353"></a>02353 <span class="keywordflow">return</span> !result.has(<a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b6137f9692d832a3df82f0d2139d00c6b" title="Deletion not successful because key was not found.">btree_not_found</a>);
<a name="l02354"></a>02354 }
<a name="l02355"></a>02355
<a name="l02358"></a><a class="code" href="classstx_1_1btree.html#97f6c7874f508e5d1498161a0181606e">02358</a> <a class="code" href="classstx_1_1btree.html#973470864b67129983ea4e1aa2132ac5" title="Size type used to count keys.">size_type</a> <a class="code" href="classstx_1_1btree.html#97f6c7874f508e5d1498161a0181606e" title="Erases all the key/data pairs associated with the given key.">erase</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> &key)
<a name="l02359"></a>02359 {
<a name="l02360"></a>02360 <a class="code" href="classstx_1_1btree.html#973470864b67129983ea4e1aa2132ac5" title="Size type used to count keys.">size_type</a> c = 0;
<a name="l02361"></a>02361
<a name="l02362"></a>02362 <span class="keywordflow">while</span>( <a class="code" href="classstx_1_1btree.html#c01d4b6b26e5c8447e92651168b006d4" title="Erases one (the first) of the key/data pairs associated with the given key.">erase_one</a>(key) )
<a name="l02363"></a>02363 {
<a name="l02364"></a>02364 ++c;
<a name="l02365"></a>02365 <span class="keywordflow">if</span> (!<a class="code" href="classstx_1_1btree.html#35378979c13861883affefda9ad95df7" title="Sixth template parameter: Allow duplicate keys in the B+ tree.">allow_duplicates</a>) <span class="keywordflow">break</span>;
<a name="l02366"></a>02366 }
<a name="l02367"></a>02367
<a name="l02368"></a>02368 <span class="keywordflow">return</span> c;
<a name="l02369"></a>02369 }
<a name="l02370"></a>02370
<a name="l02371"></a>02371 <span class="preprocessor">#ifdef BTREE_TODO</span>
<a name="l02373"></a><a class="code" href="classstx_1_1btree.html#b006ef721a55f2e6eaee5d4b22cc2ebc">02373</a> <span class="preprocessor"> void erase(iterator iter)</span>
<a name="l02374"></a>02374 <span class="preprocessor"></span> {
<a name="l02375"></a>02375
<a name="l02376"></a>02376 }
<a name="l02377"></a>02377 <span class="preprocessor">#endif</span>
<a name="l02378"></a>02378 <span class="preprocessor"></span>
<a name="l02379"></a>02379 <span class="preprocessor">#ifdef BTREE_TODO</span>
<a name="l02382"></a><a class="code" href="classstx_1_1btree.html#20393dc10d658f3e7883bb69aa9cdde8">02382</a> <span class="preprocessor"> void erase(iterator </span><span class="comment">/* first */</span>, iterator <span class="comment">/* last */</span>)
<a name="l02383"></a>02383 {
<a name="l02384"></a>02384 abort();
<a name="l02385"></a>02385 }
<a name="l02386"></a>02386 <span class="preprocessor">#endif</span>
<a name="l02387"></a>02387 <span class="preprocessor"></span>
<a name="l02388"></a>02388 <span class="keyword">private</span>:
<a name="l02389"></a>02389 <span class="comment">// *** Private Erase Functions</span>
<a name="l02390"></a>02390
<a name="l02400"></a><a class="code" href="classstx_1_1btree.html#40e3e935186128e71b90ad2482fc73a7">02400</a> result_t <a class="code" href="classstx_1_1btree.html#40e3e935186128e71b90ad2482fc73a7" title="Erase one (the first) key/data pair in the B+ tree matching key.">erase_one_descend</a>(<span class="keyword">const</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>& key,
<a name="l02401"></a>02401 node *curr,
<a name="l02402"></a>02402 node *left, node *right,
<a name="l02403"></a>02403 inner_node *leftparent, inner_node *rightparent,
<a name="l02404"></a>02404 inner_node *parent, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> parentslot)
<a name="l02405"></a>02405 {
<a name="l02406"></a>02406 <span class="keywordflow">if</span> (curr->isleafnode())
<a name="l02407"></a>02407 {
<a name="l02408"></a>02408 leaf_node *leaf = <span class="keyword">static_cast<</span>leaf_node*<span class="keyword">></span>(curr);
<a name="l02409"></a>02409 leaf_node *leftleaf = <span class="keyword">static_cast<</span>leaf_node*<span class="keyword">></span>(left);
<a name="l02410"></a>02410 leaf_node *rightleaf = <span class="keyword">static_cast<</span>leaf_node*<span class="keyword">></span>(right);
<a name="l02411"></a>02411
<a name="l02412"></a>02412 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(leaf, key);
<a name="l02413"></a>02413
<a name="l02414"></a>02414 <span class="keywordflow">if</span> (slot >= leaf->slotuse || !<a class="code" href="classstx_1_1btree.html#f09828d360e903d40c9f8c77183bea0e" title="True if a == b ? constructed from key_less().">key_equal</a>(key, leaf->slotkey[slot]))
<a name="l02415"></a>02415 {
<a name="l02416"></a>02416 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"Could not find key "</span> << key << <span class="stringliteral">" to erase."</span> << std::endl);
<a name="l02417"></a>02417
<a name="l02418"></a>02418 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b6137f9692d832a3df82f0d2139d00c6b" title="Deletion not successful because key was not found.">btree_not_found</a>;
<a name="l02419"></a>02419 }
<a name="l02420"></a>02420
<a name="l02421"></a>02421 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"Found key in leaf "</span> << curr << <span class="stringliteral">" at slot "</span> << slot << std::endl);
<a name="l02422"></a>02422
<a name="l02423"></a>02423 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = slot; i < leaf->slotuse - 1; i++)
<a name="l02424"></a>02424 {
<a name="l02425"></a>02425 leaf->slotkey[i] = leaf->slotkey[i + 1];
<a name="l02426"></a>02426 leaf->slotdata[i] = leaf->slotdata[i + 1];
<a name="l02427"></a>02427 }
<a name="l02428"></a>02428 leaf->slotuse--;
<a name="l02429"></a>02429
<a name="l02430"></a>02430 result_t myres = <a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b76e78fd0f7a6075c905f3ef9581c1ee1" title="Deletion successful and no fix-ups necessary.">btree_ok</a>;
<a name="l02431"></a>02431
<a name="l02432"></a>02432 <span class="comment">// if the last key of the leaf was changed, the parent is notified</span>
<a name="l02433"></a>02433 <span class="comment">// and updates the key of this leaf</span>
<a name="l02434"></a>02434 <span class="keywordflow">if</span> (slot == leaf->slotuse)
<a name="l02435"></a>02435 {
<a name="l02436"></a>02436 <span class="keywordflow">if</span> (parent && parentslot < parent->slotuse)
<a name="l02437"></a>02437 {
<a name="l02438"></a>02438 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->childid[parentslot] == curr);
<a name="l02439"></a>02439 parent->slotkey[parentslot] = leaf->slotkey[leaf->slotuse - 1];
<a name="l02440"></a>02440 }
<a name="l02441"></a>02441 <span class="keywordflow">else</span>
<a name="l02442"></a>02442 {
<a name="l02443"></a>02443 <span class="keywordflow">if</span> (leaf->slotuse >= 1)
<a name="l02444"></a>02444 {
<a name="l02445"></a>02445 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"Scheduling lastkeyupdate: key "</span> << leaf->slotkey[leaf->slotuse - 1] << std::endl);
<a name="l02446"></a>02446 myres |= result_t(<a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02bfa91b1cf87110d0008592aeb78ce65e7" title="Deletion successful, the last key was updated so parent slotkeys need updates.">btree_update_lastkey</a>, leaf->slotkey[leaf->slotuse - 1]);
<a name="l02447"></a>02447 }
<a name="l02448"></a>02448 <span class="keywordflow">else</span>
<a name="l02449"></a>02449 {
<a name="l02450"></a>02450 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(leaf == <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>);
<a name="l02451"></a>02451 }
<a name="l02452"></a>02452 }
<a name="l02453"></a>02453 }
<a name="l02454"></a>02454
<a name="l02455"></a>02455 <span class="keywordflow">if</span> (leaf->isunderflow() && !(leaf == <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a> && leaf-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a> >= 1))
<a name="l02456"></a>02456 {
<a name="l02457"></a>02457 <span class="comment">// determine what to do about the underflow</span>
<a name="l02458"></a>02458
<a name="l02459"></a>02459 <span class="comment">// case : if this empty leaf is the root, then delete all nodes</span>
<a name="l02460"></a>02460 <span class="comment">// and set root to NULL.</span>
<a name="l02461"></a>02461 <span class="keywordflow">if</span> (leftleaf == NULL && rightleaf == NULL)
<a name="l02462"></a>02462 {
<a name="l02463"></a>02463 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(leaf == <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>);
<a name="l02464"></a>02464 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(leaf->slotuse == 0);
<a name="l02465"></a>02465
<a name="l02466"></a>02466 <a class="code" href="classstx_1_1btree.html#0bbb2111654adc0acbd302488c602ad1" title="Correctly free either inner or leaf node, destructs all contained key and value objects...">free_node</a>(<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>);
<a name="l02467"></a>02467
<a name="l02468"></a>02468 <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a> = leaf = NULL;
<a name="l02469"></a>02469 <a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a> = <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a> = NULL;
<a name="l02470"></a>02470
<a name="l02471"></a>02471 <span class="comment">// will be decremented soon by insert_start()</span>
<a name="l02472"></a>02472 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(<a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#8822d400b91499816b6c985e781e9018" title="Number of items in the B+ tree.">itemcount</a> == 1);
<a name="l02473"></a>02473 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(<a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#9e4f92e0aa1d90cbf823a3b072495be6" title="Number of leaves in the B+ tree.">leaves</a> == 0);
<a name="l02474"></a>02474 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(<a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#2899f2f8e09b4f8e9be8effb3492deed" title="Number of inner nodes in the B+ tree.">innernodes</a> == 0);
<a name="l02475"></a>02475
<a name="l02476"></a>02476 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b76e78fd0f7a6075c905f3ef9581c1ee1" title="Deletion successful and no fix-ups necessary.">btree_ok</a>;
<a name="l02477"></a>02477 }
<a name="l02478"></a>02478 <span class="comment">// case : if both left and right leaves would underflow in case of</span>
<a name="l02479"></a>02479 <span class="comment">// a shift, then merging is necessary. choose the more local merger</span>
<a name="l02480"></a>02480 <span class="comment">// with our parent</span>
<a name="l02481"></a>02481 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (leftleaf == NULL || leftleaf->isfew()) && (rightleaf == NULL || rightleaf->isfew()) )
<a name="l02482"></a>02482 {
<a name="l02483"></a>02483 <span class="keywordflow">if</span> (leftparent == parent)
<a name="l02484"></a>02484 myres |= <a class="code" href="classstx_1_1btree.html#d3713fe9737e461701b4fe44a829df50" title="Merge two leaf nodes.">merge_leaves</a>(leftleaf, leaf, leftparent);
<a name="l02485"></a>02485 <span class="keywordflow">else</span>
<a name="l02486"></a>02486 myres |= <a class="code" href="classstx_1_1btree.html#d3713fe9737e461701b4fe44a829df50" title="Merge two leaf nodes.">merge_leaves</a>(leaf, rightleaf, rightparent);
<a name="l02487"></a>02487 }
<a name="l02488"></a>02488 <span class="comment">// case : the right leaf has extra data, so balance right with current</span>
<a name="l02489"></a>02489 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (leftleaf != NULL && leftleaf->isfew()) && (rightleaf != NULL && !rightleaf->isfew()) )
<a name="l02490"></a>02490 {
<a name="l02491"></a>02491 <span class="keywordflow">if</span> (rightparent == parent)
<a name="l02492"></a>02492 myres |= <a class="code" href="classstx_1_1btree.html#0475590170b5e17b990ab5d5bd95c4f6" title="Balance two leaf nodes.">shift_left_leaf</a>(leaf, rightleaf, rightparent, parentslot);
<a name="l02493"></a>02493 <span class="keywordflow">else</span>
<a name="l02494"></a>02494 myres |= <a class="code" href="classstx_1_1btree.html#d3713fe9737e461701b4fe44a829df50" title="Merge two leaf nodes.">merge_leaves</a>(leftleaf, leaf, leftparent);
<a name="l02495"></a>02495 }
<a name="l02496"></a>02496 <span class="comment">// case : the left leaf has extra data, so balance left with current</span>
<a name="l02497"></a>02497 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (leftleaf != NULL && !leftleaf->isfew()) && (rightleaf != NULL && rightleaf->isfew()) )
<a name="l02498"></a>02498 {
<a name="l02499"></a>02499 <span class="keywordflow">if</span> (leftparent == parent)
<a name="l02500"></a>02500 <a class="code" href="classstx_1_1btree.html#68ca0e18a5d87ac38f651df2120ac8a6" title="Balance two leaf nodes.">shift_right_leaf</a>(leftleaf, leaf, leftparent, parentslot - 1);
<a name="l02501"></a>02501 <span class="keywordflow">else</span>
<a name="l02502"></a>02502 myres |= <a class="code" href="classstx_1_1btree.html#d3713fe9737e461701b4fe44a829df50" title="Merge two leaf nodes.">merge_leaves</a>(leaf, rightleaf, rightparent);
<a name="l02503"></a>02503 }
<a name="l02504"></a>02504 <span class="comment">// case : both the leaf and right leaves have extra data and our</span>
<a name="l02505"></a>02505 <span class="comment">// parent, choose the leaf with more data</span>
<a name="l02506"></a>02506 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (leftparent == rightparent)
<a name="l02507"></a>02507 {
<a name="l02508"></a>02508 <span class="keywordflow">if</span> (leftleaf->slotuse <= rightleaf->slotuse)
<a name="l02509"></a>02509 myres |= <a class="code" href="classstx_1_1btree.html#0475590170b5e17b990ab5d5bd95c4f6" title="Balance two leaf nodes.">shift_left_leaf</a>(leaf, rightleaf, rightparent, parentslot);
<a name="l02510"></a>02510 <span class="keywordflow">else</span>
<a name="l02511"></a>02511 <a class="code" href="classstx_1_1btree.html#68ca0e18a5d87ac38f651df2120ac8a6" title="Balance two leaf nodes.">shift_right_leaf</a>(leftleaf, leaf, leftparent, parentslot - 1);
<a name="l02512"></a>02512 }
<a name="l02513"></a>02513 <span class="keywordflow">else</span>
<a name="l02514"></a>02514 {
<a name="l02515"></a>02515 <span class="keywordflow">if</span> (leftparent == parent)
<a name="l02516"></a>02516 <a class="code" href="classstx_1_1btree.html#68ca0e18a5d87ac38f651df2120ac8a6" title="Balance two leaf nodes.">shift_right_leaf</a>(leftleaf, leaf, leftparent, parentslot - 1);
<a name="l02517"></a>02517 <span class="keywordflow">else</span>
<a name="l02518"></a>02518 myres |= <a class="code" href="classstx_1_1btree.html#0475590170b5e17b990ab5d5bd95c4f6" title="Balance two leaf nodes.">shift_left_leaf</a>(leaf, rightleaf, rightparent, parentslot);
<a name="l02519"></a>02519 }
<a name="l02520"></a>02520 }
<a name="l02521"></a>02521
<a name="l02522"></a>02522 <span class="keywordflow">return</span> myres;
<a name="l02523"></a>02523 }
<a name="l02524"></a>02524 <span class="keywordflow">else</span> <span class="comment">// !curr->isleafnode()</span>
<a name="l02525"></a>02525 {
<a name="l02526"></a>02526 inner_node *inner = <span class="keyword">static_cast<</span>inner_node*<span class="keyword">></span>(curr);
<a name="l02527"></a>02527 inner_node *leftinner = <span class="keyword">static_cast<</span>inner_node*<span class="keyword">></span>(left);
<a name="l02528"></a>02528 inner_node *rightinner = <span class="keyword">static_cast<</span>inner_node*<span class="keyword">></span>(right);
<a name="l02529"></a>02529
<a name="l02530"></a>02530 node *myleft, *myright;
<a name="l02531"></a>02531 inner_node *myleftparent, *myrightparent;
<a name="l02532"></a>02532
<a name="l02533"></a>02533 <span class="keywordtype">int</span> slot = <a class="code" href="classstx_1_1btree.html#a25d79d1749e5eb8a81a103534707a77" title="Searches for the first key in the node n less or equal to key.">find_lower</a>(inner, key);
<a name="l02534"></a>02534
<a name="l02535"></a>02535 <span class="keywordflow">if</span> (slot == 0) {
<a name="l02536"></a>02536 myleft = (left == NULL) ? NULL : (static_cast<inner_node*>(left))->childid[left->slotuse - 1];
<a name="l02537"></a>02537 myleftparent = leftparent;
<a name="l02538"></a>02538 }
<a name="l02539"></a>02539 <span class="keywordflow">else</span> {
<a name="l02540"></a>02540 myleft = inner->childid[slot - 1];
<a name="l02541"></a>02541 myleftparent = inner;
<a name="l02542"></a>02542 }
<a name="l02543"></a>02543
<a name="l02544"></a>02544 <span class="keywordflow">if</span> (slot == inner->slotuse) {
<a name="l02545"></a>02545 myright = (right == NULL) ? NULL : (static_cast<inner_node*>(right))->childid[0];
<a name="l02546"></a>02546 myrightparent = rightparent;
<a name="l02547"></a>02547 }
<a name="l02548"></a>02548 <span class="keywordflow">else</span> {
<a name="l02549"></a>02549 myright = inner->childid[slot + 1];
<a name="l02550"></a>02550 myrightparent = inner;
<a name="l02551"></a>02551 }
<a name="l02552"></a>02552
<a name="l02553"></a>02553 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"erase_one_descend into "</span> << inner->childid[slot] << std::endl);
<a name="l02554"></a>02554
<a name="l02555"></a>02555 result_t result = <a class="code" href="classstx_1_1btree.html#40e3e935186128e71b90ad2482fc73a7" title="Erase one (the first) key/data pair in the B+ tree matching key.">erase_one_descend</a>(key,
<a name="l02556"></a>02556 inner->childid[slot],
<a name="l02557"></a>02557 myleft, myright,
<a name="l02558"></a>02558 myleftparent, myrightparent,
<a name="l02559"></a>02559 inner, slot);
<a name="l02560"></a>02560
<a name="l02561"></a>02561 result_t myres = <a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b76e78fd0f7a6075c905f3ef9581c1ee1" title="Deletion successful and no fix-ups necessary.">btree_ok</a>;
<a name="l02562"></a>02562
<a name="l02563"></a>02563 <span class="keywordflow">if</span> (result.has(<a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b6137f9692d832a3df82f0d2139d00c6b" title="Deletion not successful because key was not found.">btree_not_found</a>))
<a name="l02564"></a>02564 {
<a name="l02565"></a>02565 <span class="keywordflow">return</span> result;
<a name="l02566"></a>02566 }
<a name="l02567"></a>02567
<a name="l02568"></a>02568 <span class="keywordflow">if</span> (result.has(<a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02bfa91b1cf87110d0008592aeb78ce65e7" title="Deletion successful, the last key was updated so parent slotkeys need updates.">btree_update_lastkey</a>))
<a name="l02569"></a>02569 {
<a name="l02570"></a>02570 <span class="keywordflow">if</span> (parent && parentslot < parent->slotuse)
<a name="l02571"></a>02571 {
<a name="l02572"></a>02572 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"Fixing lastkeyupdate: key "</span> << result.lastkey << <span class="stringliteral">" into parent "</span> << parent << <span class="stringliteral">" at parentslot "</span> << parentslot << std::endl);
<a name="l02573"></a>02573
<a name="l02574"></a>02574 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->childid[parentslot] == curr);
<a name="l02575"></a>02575 parent->slotkey[parentslot] = result.lastkey;
<a name="l02576"></a>02576 }
<a name="l02577"></a>02577 <span class="keywordflow">else</span>
<a name="l02578"></a>02578 {
<a name="l02579"></a>02579 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"Forwarding lastkeyupdate: key "</span> << result.lastkey << std::endl);
<a name="l02580"></a>02580 myres |= result_t(<a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02bfa91b1cf87110d0008592aeb78ce65e7" title="Deletion successful, the last key was updated so parent slotkeys need updates.">btree_update_lastkey</a>, result.lastkey);
<a name="l02581"></a>02581 }
<a name="l02582"></a>02582 }
<a name="l02583"></a>02583
<a name="l02584"></a>02584 <span class="keywordflow">if</span> (result.has(<a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b6ad2378afb40ca40049df5f0ec3a0647" title="Deletion successful, children nodes were merged and the parent needs to remove the...">btree_fixmerge</a>))
<a name="l02585"></a>02585 {
<a name="l02586"></a>02586 <span class="comment">// either the current node or the next is empty and should be removed</span>
<a name="l02587"></a>02587 <span class="keywordflow">if</span> (inner->childid[slot]->slotuse != 0)
<a name="l02588"></a>02588 slot++;
<a name="l02589"></a>02589
<a name="l02590"></a>02590 <span class="comment">// this is the child slot invalidated by the merge</span>
<a name="l02591"></a>02591 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(inner->childid[slot]->slotuse == 0);
<a name="l02592"></a>02592
<a name="l02593"></a>02593 <a class="code" href="classstx_1_1btree.html#0bbb2111654adc0acbd302488c602ad1" title="Correctly free either inner or leaf node, destructs all contained key and value objects...">free_node</a>(inner->childid[slot]);
<a name="l02594"></a>02594
<a name="l02595"></a>02595 <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = slot; i < inner->slotuse; i++)
<a name="l02596"></a>02596 {
<a name="l02597"></a>02597 inner->slotkey[i - 1] = inner->slotkey[i];
<a name="l02598"></a>02598 inner->childid[i] = inner->childid[i + 1];
<a name="l02599"></a>02599 }
<a name="l02600"></a>02600 inner->slotuse--;
<a name="l02601"></a>02601
<a name="l02602"></a>02602 <span class="keywordflow">if</span> (inner->level == 1)
<a name="l02603"></a>02603 {
<a name="l02604"></a>02604 <span class="comment">// fix split key for children leaves</span>
<a name="l02605"></a>02605 slot--;
<a name="l02606"></a>02606 leaf_node *child = <span class="keyword">static_cast<</span>leaf_node*<span class="keyword">></span>(inner->childid[slot]);
<a name="l02607"></a>02607 inner->slotkey[slot] = child->slotkey[ child->slotuse-1 ];
<a name="l02608"></a>02608 }
<a name="l02609"></a>02609 }
<a name="l02610"></a>02610
<a name="l02611"></a>02611 <span class="keywordflow">if</span> (inner->isunderflow() && !(inner == <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a> && inner-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a> >= 1))
<a name="l02612"></a>02612 {
<a name="l02613"></a>02613 <span class="comment">// case: the inner node is the root and has just one child. that child becomes the new root</span>
<a name="l02614"></a>02614 <span class="keywordflow">if</span> (leftinner == NULL && rightinner == NULL)
<a name="l02615"></a>02615 {
<a name="l02616"></a>02616 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(inner == <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>);
<a name="l02617"></a>02617 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(inner->slotuse == 0);
<a name="l02618"></a>02618
<a name="l02619"></a>02619 <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a> = inner->childid[0];
<a name="l02620"></a>02620
<a name="l02621"></a>02621 inner-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a> = 0;
<a name="l02622"></a>02622 <a class="code" href="classstx_1_1btree.html#0bbb2111654adc0acbd302488c602ad1" title="Correctly free either inner or leaf node, destructs all contained key and value objects...">free_node</a>(inner);
<a name="l02623"></a>02623
<a name="l02624"></a>02624 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b76e78fd0f7a6075c905f3ef9581c1ee1" title="Deletion successful and no fix-ups necessary.">btree_ok</a>;
<a name="l02625"></a>02625 }
<a name="l02626"></a>02626 <span class="comment">// case : if both left and right leaves would underflow in case of</span>
<a name="l02627"></a>02627 <span class="comment">// a shift, then merging is necessary. choose the more local merger</span>
<a name="l02628"></a>02628 <span class="comment">// with our parent</span>
<a name="l02629"></a>02629 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (leftinner == NULL || leftinner->isfew()) && (rightinner == NULL || rightinner->isfew()) )
<a name="l02630"></a>02630 {
<a name="l02631"></a>02631 <span class="keywordflow">if</span> (leftparent == parent)
<a name="l02632"></a>02632 myres |= <a class="code" href="classstx_1_1btree.html#ba98442f1692cc1c7b4f5ed52f67a186" title="Merge two inner nodes.">merge_inner</a>(leftinner, inner, leftparent, parentslot - 1);
<a name="l02633"></a>02633 <span class="keywordflow">else</span>
<a name="l02634"></a>02634 myres |= <a class="code" href="classstx_1_1btree.html#ba98442f1692cc1c7b4f5ed52f67a186" title="Merge two inner nodes.">merge_inner</a>(inner, rightinner, rightparent, parentslot);
<a name="l02635"></a>02635 }
<a name="l02636"></a>02636 <span class="comment">// case : the right leaf has extra data, so balance right with current</span>
<a name="l02637"></a>02637 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (leftinner != NULL && leftinner->isfew()) && (rightinner != NULL && !rightinner->isfew()) )
<a name="l02638"></a>02638 {
<a name="l02639"></a>02639 <span class="keywordflow">if</span> (rightparent == parent)
<a name="l02640"></a>02640 <a class="code" href="classstx_1_1btree.html#f9728e843262c62d97dec3aaa5203382" title="Balance two inner nodes.">shift_left_inner</a>(inner, rightinner, rightparent, parentslot);
<a name="l02641"></a>02641 <span class="keywordflow">else</span>
<a name="l02642"></a>02642 myres |= <a class="code" href="classstx_1_1btree.html#ba98442f1692cc1c7b4f5ed52f67a186" title="Merge two inner nodes.">merge_inner</a>(leftinner, inner, leftparent, parentslot - 1);
<a name="l02643"></a>02643 }
<a name="l02644"></a>02644 <span class="comment">// case : the left leaf has extra data, so balance left with current</span>
<a name="l02645"></a>02645 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (leftinner != NULL && !leftinner->isfew()) && (rightinner != NULL && rightinner->isfew()) )
<a name="l02646"></a>02646 {
<a name="l02647"></a>02647 <span class="keywordflow">if</span> (leftparent == parent)
<a name="l02648"></a>02648 <a class="code" href="classstx_1_1btree.html#fd62fa2daf91ddd8848022df7d4e4179" title="Balance two inner nodes.">shift_right_inner</a>(leftinner, inner, leftparent, parentslot - 1);
<a name="l02649"></a>02649 <span class="keywordflow">else</span>
<a name="l02650"></a>02650 myres |= <a class="code" href="classstx_1_1btree.html#ba98442f1692cc1c7b4f5ed52f67a186" title="Merge two inner nodes.">merge_inner</a>(inner, rightinner, rightparent, parentslot);
<a name="l02651"></a>02651 }
<a name="l02652"></a>02652 <span class="comment">// case : both the leaf and right leaves have extra data and our</span>
<a name="l02653"></a>02653 <span class="comment">// parent, choose the leaf with more data</span>
<a name="l02654"></a>02654 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (leftparent == rightparent)
<a name="l02655"></a>02655 {
<a name="l02656"></a>02656 <span class="keywordflow">if</span> (leftinner->slotuse <= rightinner->slotuse)
<a name="l02657"></a>02657 <a class="code" href="classstx_1_1btree.html#f9728e843262c62d97dec3aaa5203382" title="Balance two inner nodes.">shift_left_inner</a>(inner, rightinner, rightparent, parentslot);
<a name="l02658"></a>02658 <span class="keywordflow">else</span>
<a name="l02659"></a>02659 <a class="code" href="classstx_1_1btree.html#fd62fa2daf91ddd8848022df7d4e4179" title="Balance two inner nodes.">shift_right_inner</a>(leftinner, inner, leftparent, parentslot - 1);
<a name="l02660"></a>02660 }
<a name="l02661"></a>02661 <span class="keywordflow">else</span>
<a name="l02662"></a>02662 {
<a name="l02663"></a>02663 <span class="keywordflow">if</span> (leftparent == parent)
<a name="l02664"></a>02664 <a class="code" href="classstx_1_1btree.html#fd62fa2daf91ddd8848022df7d4e4179" title="Balance two inner nodes.">shift_right_inner</a>(leftinner, inner, leftparent, parentslot - 1);
<a name="l02665"></a>02665 <span class="keywordflow">else</span>
<a name="l02666"></a>02666 <a class="code" href="classstx_1_1btree.html#f9728e843262c62d97dec3aaa5203382" title="Balance two inner nodes.">shift_left_inner</a>(inner, rightinner, rightparent, parentslot);
<a name="l02667"></a>02667 }
<a name="l02668"></a>02668 }
<a name="l02669"></a>02669
<a name="l02670"></a>02670 <span class="keywordflow">return</span> myres;
<a name="l02671"></a>02671 }
<a name="l02672"></a>02672 }
<a name="l02673"></a>02673
<a name="l02677"></a><a class="code" href="classstx_1_1btree.html#d3713fe9737e461701b4fe44a829df50">02677</a> result_t <a class="code" href="classstx_1_1btree.html#d3713fe9737e461701b4fe44a829df50" title="Merge two leaf nodes.">merge_leaves</a>(leaf_node* left, leaf_node* right, inner_node* parent)
<a name="l02678"></a>02678 {
<a name="l02679"></a>02679 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"Merge leaf nodes "</span> << left << <span class="stringliteral">" and "</span> << right << <span class="stringliteral">" with common parent "</span> << parent << <span class="stringliteral">"."</span> << std::endl);
<a name="l02680"></a>02680 (void)parent;
<a name="l02681"></a>02681
<a name="l02682"></a>02682 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left->isleafnode() && right->isleafnode());
<a name="l02683"></a>02683 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->level == 1);
<a name="l02684"></a>02684
<a name="l02685"></a>02685 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left->slotuse + right->slotuse < <a class="code" href="classstx_1_1btree.html#12a39ca671e962924f4acf879a44eafc" title="Base B+ tree parameter: The number of key/data slots in each leaf.">leafslotmax</a>);
<a name="l02686"></a>02686
<a name="l02687"></a>02687 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < right->slotuse; i++)
<a name="l02688"></a>02688 {
<a name="l02689"></a>02689 left->slotkey[left->slotuse + i] = right->slotkey[i];
<a name="l02690"></a>02690 left->slotdata[left->slotuse + i] = right->slotdata[i];
<a name="l02691"></a>02691 }
<a name="l02692"></a>02692 left->slotuse += right->slotuse;
<a name="l02693"></a>02693
<a name="l02694"></a>02694 left->nextleaf = right->nextleaf;
<a name="l02695"></a>02695 <span class="keywordflow">if</span> (left->nextleaf)
<a name="l02696"></a>02696 left->nextleaf->prevleaf = left;
<a name="l02697"></a>02697 <span class="keywordflow">else</span>
<a name="l02698"></a>02698 <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a> = left;
<a name="l02699"></a>02699
<a name="l02700"></a>02700 right-><a class="code" href="structstx_1_1btree_1_1node.html#3b012ed5aca34a261be978cb0b183812" title="Number of key slotuse use, so number of valid children or data pointers.">slotuse</a> = 0;
<a name="l02701"></a>02701
<a name="l02702"></a>02702 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b6ad2378afb40ca40049df5f0ec3a0647" title="Deletion successful, children nodes were merged and the parent needs to remove the...">btree_fixmerge</a>;
<a name="l02703"></a>02703 }
<a name="l02704"></a>02704
<a name="l02708"></a><a class="code" href="classstx_1_1btree.html#ba98442f1692cc1c7b4f5ed52f67a186">02708</a> <span class="keyword">static</span> result_t <a class="code" href="classstx_1_1btree.html#ba98442f1692cc1c7b4f5ed52f67a186" title="Merge two inner nodes.">merge_inner</a>(inner_node* left, inner_node* right, inner_node* parent, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> parentslot)
<a name="l02709"></a>02709 {
<a name="l02710"></a>02710 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"Merge inner nodes "</span> << left << <span class="stringliteral">" and "</span> << right << <span class="stringliteral">" with common parent "</span> << parent << <span class="stringliteral">"."</span> << std::endl);
<a name="l02711"></a>02711
<a name="l02712"></a>02712 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left->level == right->level);
<a name="l02713"></a>02713 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->level == left->level + 1);
<a name="l02714"></a>02714
<a name="l02715"></a>02715 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->childid[parentslot] == left);
<a name="l02716"></a>02716
<a name="l02717"></a>02717 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left->slotuse + right->slotuse < <a class="code" href="classstx_1_1btree.html#83a18c2fb7f4e9cfd47ce7545d004324" title="Base B+ tree parameter: The number of key slots in each inner node, this can differ...">innerslotmax</a>);
<a name="l02718"></a>02718
<a name="l02719"></a>02719 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#ee2e25b0fccc7147fd8be0bcf8630b5b" title="Debug parameter: Enables expensive and thorough checking of the B+ tree invariants...">selfverify</a>)
<a name="l02720"></a>02720 {
<a name="l02721"></a>02721 <span class="comment">// find the left node's slot in the parent's children</span>
<a name="l02722"></a>02722 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> leftslot = 0;
<a name="l02723"></a>02723 <span class="keywordflow">while</span>(leftslot <= parent->slotuse && parent->childid[leftslot] != left)
<a name="l02724"></a>02724 ++leftslot;
<a name="l02725"></a>02725
<a name="l02726"></a>02726 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(leftslot < parent->slotuse);
<a name="l02727"></a>02727 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->childid[leftslot] == left);
<a name="l02728"></a>02728 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->childid[leftslot+1] == right);
<a name="l02729"></a>02729
<a name="l02730"></a>02730 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parentslot == leftslot);
<a name="l02731"></a>02731 }
<a name="l02732"></a>02732
<a name="l02733"></a>02733 <span class="comment">// retrieve the decision key from parent</span>
<a name="l02734"></a>02734 left->slotkey[left->slotuse] = parent->slotkey[parentslot];
<a name="l02735"></a>02735 left->slotuse++;
<a name="l02736"></a>02736
<a name="l02737"></a>02737 <span class="comment">// copy over keys and children from right</span>
<a name="l02738"></a>02738 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < right->slotuse; i++)
<a name="l02739"></a>02739 {
<a name="l02740"></a>02740 left->slotkey[left->slotuse + i] = right->slotkey[i];
<a name="l02741"></a>02741 left->childid[left->slotuse + i] = right->childid[i];
<a name="l02742"></a>02742 }
<a name="l02743"></a>02743 left->slotuse += right->slotuse;
<a name="l02744"></a>02744
<a name="l02745"></a>02745 left->childid[left->slotuse] = right->childid[right->slotuse];
<a name="l02746"></a>02746
<a name="l02747"></a>02747 right->slotuse = 0;
<a name="l02748"></a>02748
<a name="l02749"></a>02749 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b6ad2378afb40ca40049df5f0ec3a0647" title="Deletion successful, children nodes were merged and the parent needs to remove the...">btree_fixmerge</a>;
<a name="l02750"></a>02750 }
<a name="l02751"></a>02751
<a name="l02755"></a><a class="code" href="classstx_1_1btree.html#0475590170b5e17b990ab5d5bd95c4f6">02755</a> <span class="keyword">static</span> result_t <a class="code" href="classstx_1_1btree.html#0475590170b5e17b990ab5d5bd95c4f6" title="Balance two leaf nodes.">shift_left_leaf</a>(leaf_node *left, leaf_node *right, inner_node *parent, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> parentslot)
<a name="l02756"></a>02756 {
<a name="l02757"></a>02757 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left->isleafnode() && right->isleafnode());
<a name="l02758"></a>02758 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->level == 1);
<a name="l02759"></a>02759
<a name="l02760"></a>02760 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left->nextleaf == right);
<a name="l02761"></a>02761 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left == right->prevleaf);
<a name="l02762"></a>02762
<a name="l02763"></a>02763 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left->slotuse < right->slotuse);
<a name="l02764"></a>02764 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->childid[parentslot] == left);
<a name="l02765"></a>02765
<a name="l02766"></a>02766 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> shiftnum = (right->slotuse - left->slotuse) >> 1;
<a name="l02767"></a>02767
<a name="l02768"></a>02768 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"Shifting (leaf) "</span> << shiftnum << <span class="stringliteral">" entries to left "</span> << left << <span class="stringliteral">" from right "</span> << right << <span class="stringliteral">" with common parent "</span> << parent << <span class="stringliteral">"."</span> << std::endl);
<a name="l02769"></a>02769
<a name="l02770"></a>02770 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left->slotuse + shiftnum < <a class="code" href="classstx_1_1btree.html#12a39ca671e962924f4acf879a44eafc" title="Base B+ tree parameter: The number of key/data slots in each leaf.">leafslotmax</a>);
<a name="l02771"></a>02771
<a name="l02772"></a>02772 <span class="comment">// copy the first items from the right node to the last slot in the left node.</span>
<a name="l02773"></a>02773 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < shiftnum; i++)
<a name="l02774"></a>02774 {
<a name="l02775"></a>02775 left->slotkey[left->slotuse + i] = right->slotkey[i];
<a name="l02776"></a>02776 left->slotdata[left->slotuse + i] = right->slotdata[i];
<a name="l02777"></a>02777 }
<a name="l02778"></a>02778 left->slotuse += shiftnum;
<a name="l02779"></a>02779
<a name="l02780"></a>02780 <span class="comment">// shift all slots in the right node to the left</span>
<a name="l02781"></a>02781
<a name="l02782"></a>02782 right->slotuse -= shiftnum;
<a name="l02783"></a>02783 <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i < right->slotuse; i++)
<a name="l02784"></a>02784 {
<a name="l02785"></a>02785 right->slotkey[i] = right->slotkey[i + shiftnum];
<a name="l02786"></a>02786 right->slotdata[i] = right->slotdata[i + shiftnum];
<a name="l02787"></a>02787 }
<a name="l02788"></a>02788
<a name="l02789"></a>02789 <span class="comment">// fixup parent</span>
<a name="l02790"></a>02790 <span class="keywordflow">if</span> (parentslot < parent->slotuse) {
<a name="l02791"></a>02791 parent->slotkey[parentslot] = left->slotkey[left->slotuse - 1];
<a name="l02792"></a>02792 <span class="keywordflow">return</span> <a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02b76e78fd0f7a6075c905f3ef9581c1ee1" title="Deletion successful and no fix-ups necessary.">btree_ok</a>;
<a name="l02793"></a>02793 }
<a name="l02794"></a>02794 <span class="keywordflow">else</span> { <span class="comment">// the update is further up the tree</span>
<a name="l02795"></a>02795 <span class="keywordflow">return</span> result_t(<a class="code" href="classstx_1_1btree.html#971345163fcd46bfd726cb31ad5cd02bfa91b1cf87110d0008592aeb78ce65e7" title="Deletion successful, the last key was updated so parent slotkeys need updates.">btree_update_lastkey</a>, left->slotkey[left->slotuse - 1]);
<a name="l02796"></a>02796 }
<a name="l02797"></a>02797 }
<a name="l02798"></a>02798
<a name="l02802"></a><a class="code" href="classstx_1_1btree.html#f9728e843262c62d97dec3aaa5203382">02802</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#f9728e843262c62d97dec3aaa5203382" title="Balance two inner nodes.">shift_left_inner</a>(inner_node *left, inner_node *right, inner_node *parent, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> parentslot)
<a name="l02803"></a>02803 {
<a name="l02804"></a>02804 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left->level == right->level);
<a name="l02805"></a>02805 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->level == left->level + 1);
<a name="l02806"></a>02806
<a name="l02807"></a>02807 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left->slotuse < right->slotuse);
<a name="l02808"></a>02808 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->childid[parentslot] == left);
<a name="l02809"></a>02809
<a name="l02810"></a>02810 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> shiftnum = (right->slotuse - left->slotuse) >> 1;
<a name="l02811"></a>02811
<a name="l02812"></a>02812 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"Shifting (inner) "</span> << shiftnum << <span class="stringliteral">" entries to left "</span> << left << <span class="stringliteral">" from right "</span> << right << <span class="stringliteral">" with common parent "</span> << parent << <span class="stringliteral">"."</span> << std::endl);
<a name="l02813"></a>02813
<a name="l02814"></a>02814 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left->slotuse + shiftnum < <a class="code" href="classstx_1_1btree.html#83a18c2fb7f4e9cfd47ce7545d004324" title="Base B+ tree parameter: The number of key slots in each inner node, this can differ...">innerslotmax</a>);
<a name="l02815"></a>02815
<a name="l02816"></a>02816 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#ee2e25b0fccc7147fd8be0bcf8630b5b" title="Debug parameter: Enables expensive and thorough checking of the B+ tree invariants...">selfverify</a>)
<a name="l02817"></a>02817 {
<a name="l02818"></a>02818 <span class="comment">// find the left node's slot in the parent's children and compare to parentslot</span>
<a name="l02819"></a>02819
<a name="l02820"></a>02820 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> leftslot = 0;
<a name="l02821"></a>02821 <span class="keywordflow">while</span>(leftslot <= parent->slotuse && parent->childid[leftslot] != left)
<a name="l02822"></a>02822 ++leftslot;
<a name="l02823"></a>02823
<a name="l02824"></a>02824 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(leftslot < parent->slotuse);
<a name="l02825"></a>02825 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->childid[leftslot] == left);
<a name="l02826"></a>02826 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->childid[leftslot+1] == right);
<a name="l02827"></a>02827
<a name="l02828"></a>02828 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(leftslot == parentslot);
<a name="l02829"></a>02829 }
<a name="l02830"></a>02830
<a name="l02831"></a>02831 <span class="comment">// copy the parent's decision slotkey and childid to the first new key on the left</span>
<a name="l02832"></a>02832 left->slotkey[left->slotuse] = parent->slotkey[parentslot];
<a name="l02833"></a>02833 left->slotuse++;
<a name="l02834"></a>02834
<a name="l02835"></a>02835 <span class="comment">// copy the other items from the right node to the last slots in the left node.</span>
<a name="l02836"></a>02836 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < shiftnum - 1; i++)
<a name="l02837"></a>02837 {
<a name="l02838"></a>02838 left->slotkey[left->slotuse + i] = right->slotkey[i];
<a name="l02839"></a>02839 left->childid[left->slotuse + i] = right->childid[i];
<a name="l02840"></a>02840 }
<a name="l02841"></a>02841 left->slotuse += shiftnum - 1;
<a name="l02842"></a>02842
<a name="l02843"></a>02843 <span class="comment">// fixup parent</span>
<a name="l02844"></a>02844 parent->slotkey[parentslot] = right->slotkey[shiftnum - 1];
<a name="l02845"></a>02845 <span class="comment">// last pointer in left</span>
<a name="l02846"></a>02846 left->childid[left->slotuse] = right->childid[shiftnum - 1];
<a name="l02847"></a>02847
<a name="l02848"></a>02848 <span class="comment">// shift all slots in the right node</span>
<a name="l02849"></a>02849
<a name="l02850"></a>02850 right->slotuse -= shiftnum;
<a name="l02851"></a>02851 <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i < right->slotuse; i++)
<a name="l02852"></a>02852 {
<a name="l02853"></a>02853 right->slotkey[i] = right->slotkey[i + shiftnum];
<a name="l02854"></a>02854 right->childid[i] = right->childid[i + shiftnum];
<a name="l02855"></a>02855 }
<a name="l02856"></a>02856 right->childid[right->slotuse] = right->childid[right->slotuse + shiftnum];
<a name="l02857"></a>02857 }
<a name="l02858"></a>02858
<a name="l02862"></a><a class="code" href="classstx_1_1btree.html#68ca0e18a5d87ac38f651df2120ac8a6">02862</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#68ca0e18a5d87ac38f651df2120ac8a6" title="Balance two leaf nodes.">shift_right_leaf</a>(leaf_node *left, leaf_node *right, inner_node *parent, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> parentslot)
<a name="l02863"></a>02863 {
<a name="l02864"></a>02864 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left->isleafnode() && right->isleafnode());
<a name="l02865"></a>02865 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->level == 1);
<a name="l02866"></a>02866
<a name="l02867"></a>02867 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left->nextleaf == right);
<a name="l02868"></a>02868 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left == right->prevleaf);
<a name="l02869"></a>02869 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->childid[parentslot] == left);
<a name="l02870"></a>02870
<a name="l02871"></a>02871 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left->slotuse > right->slotuse);
<a name="l02872"></a>02872
<a name="l02873"></a>02873 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> shiftnum = (left->slotuse - right->slotuse) >> 1;
<a name="l02874"></a>02874
<a name="l02875"></a>02875 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"Shifting (leaf) "</span> << shiftnum << <span class="stringliteral">" entries to right "</span> << right << <span class="stringliteral">" from left "</span> << left << <span class="stringliteral">" with common parent "</span> << parent << <span class="stringliteral">"."</span> << std::endl);
<a name="l02876"></a>02876
<a name="l02877"></a>02877 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#ee2e25b0fccc7147fd8be0bcf8630b5b" title="Debug parameter: Enables expensive and thorough checking of the B+ tree invariants...">selfverify</a>)
<a name="l02878"></a>02878 {
<a name="l02879"></a>02879 <span class="comment">// find the left node's slot in the parent's children</span>
<a name="l02880"></a>02880 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> leftslot = 0;
<a name="l02881"></a>02881 <span class="keywordflow">while</span>(leftslot <= parent->slotuse && parent->childid[leftslot] != left)
<a name="l02882"></a>02882 ++leftslot;
<a name="l02883"></a>02883
<a name="l02884"></a>02884 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(leftslot < parent->slotuse);
<a name="l02885"></a>02885 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->childid[leftslot] == left);
<a name="l02886"></a>02886 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->childid[leftslot+1] == right);
<a name="l02887"></a>02887
<a name="l02888"></a>02888 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(leftslot == parentslot);
<a name="l02889"></a>02889 }
<a name="l02890"></a>02890
<a name="l02891"></a>02891 <span class="comment">// shift all slots in the right node</span>
<a name="l02892"></a>02892
<a name="l02893"></a>02893 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(right->slotuse + shiftnum < <a class="code" href="classstx_1_1btree.html#12a39ca671e962924f4acf879a44eafc" title="Base B+ tree parameter: The number of key/data slots in each leaf.">leafslotmax</a>);
<a name="l02894"></a>02894
<a name="l02895"></a>02895 <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = right->slotuse; i >= 0; i--)
<a name="l02896"></a>02896 {
<a name="l02897"></a>02897 right->slotkey[i + shiftnum] = right->slotkey[i];
<a name="l02898"></a>02898 right->slotdata[i + shiftnum] = right->slotdata[i];
<a name="l02899"></a>02899 }
<a name="l02900"></a>02900 right->slotuse += shiftnum;
<a name="l02901"></a>02901
<a name="l02902"></a>02902 <span class="comment">// copy the last items from the left node to the first slot in the right node.</span>
<a name="l02903"></a>02903 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < shiftnum; i++)
<a name="l02904"></a>02904 {
<a name="l02905"></a>02905 right->slotkey[i] = left->slotkey[left->slotuse - shiftnum + i];
<a name="l02906"></a>02906 right->slotdata[i] = left->slotdata[left->slotuse - shiftnum + i];
<a name="l02907"></a>02907 }
<a name="l02908"></a>02908 left->slotuse -= shiftnum;
<a name="l02909"></a>02909
<a name="l02910"></a>02910 parent->slotkey[parentslot] = left->slotkey[left->slotuse-1];
<a name="l02911"></a>02911 }
<a name="l02912"></a>02912
<a name="l02916"></a><a class="code" href="classstx_1_1btree.html#fd62fa2daf91ddd8848022df7d4e4179">02916</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#fd62fa2daf91ddd8848022df7d4e4179" title="Balance two inner nodes.">shift_right_inner</a>(inner_node *left, inner_node *right, inner_node *parent, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> parentslot)
<a name="l02917"></a>02917 {
<a name="l02918"></a>02918 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left->level == right->level);
<a name="l02919"></a>02919 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->level == left->level + 1);
<a name="l02920"></a>02920
<a name="l02921"></a>02921 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(left->slotuse > right->slotuse);
<a name="l02922"></a>02922 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->childid[parentslot] == left);
<a name="l02923"></a>02923
<a name="l02924"></a>02924 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> shiftnum = (left->slotuse - right->slotuse) >> 1;
<a name="l02925"></a>02925
<a name="l02926"></a>02926 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"Shifting (leaf) "</span> << shiftnum << <span class="stringliteral">" entries to right "</span> << right << <span class="stringliteral">" from left "</span> << left << <span class="stringliteral">" with common parent "</span> << parent << <span class="stringliteral">"."</span> << std::endl);
<a name="l02927"></a>02927
<a name="l02928"></a>02928 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#ee2e25b0fccc7147fd8be0bcf8630b5b" title="Debug parameter: Enables expensive and thorough checking of the B+ tree invariants...">selfverify</a>)
<a name="l02929"></a>02929 {
<a name="l02930"></a>02930 <span class="comment">// find the left node's slot in the parent's children</span>
<a name="l02931"></a>02931 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> leftslot = 0;
<a name="l02932"></a>02932 <span class="keywordflow">while</span>(leftslot <= parent->slotuse && parent->childid[leftslot] != left)
<a name="l02933"></a>02933 ++leftslot;
<a name="l02934"></a>02934
<a name="l02935"></a>02935 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(leftslot < parent->slotuse);
<a name="l02936"></a>02936 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->childid[leftslot] == left);
<a name="l02937"></a>02937 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(parent->childid[leftslot+1] == right);
<a name="l02938"></a>02938
<a name="l02939"></a>02939 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(leftslot == parentslot);
<a name="l02940"></a>02940 }
<a name="l02941"></a>02941
<a name="l02942"></a>02942 <span class="comment">// shift all slots in the right node</span>
<a name="l02943"></a>02943
<a name="l02944"></a>02944 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(right->slotuse + shiftnum < <a class="code" href="classstx_1_1btree.html#83a18c2fb7f4e9cfd47ce7545d004324" title="Base B+ tree parameter: The number of key slots in each inner node, this can differ...">innerslotmax</a>);
<a name="l02945"></a>02945
<a name="l02946"></a>02946 right->childid[right->slotuse + shiftnum] = right->childid[right->slotuse];
<a name="l02947"></a>02947 <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = right->slotuse-1; i >= 0; i--)
<a name="l02948"></a>02948 {
<a name="l02949"></a>02949 right->slotkey[i + shiftnum] = right->slotkey[i];
<a name="l02950"></a>02950 right->childid[i + shiftnum] = right->childid[i];
<a name="l02951"></a>02951 }
<a name="l02952"></a>02952
<a name="l02953"></a>02953 right->slotuse += shiftnum;
<a name="l02954"></a>02954
<a name="l02955"></a>02955 <span class="comment">// copy the parent's decision slotkey and childid to the last new key on the right</span>
<a name="l02956"></a>02956 right->slotkey[shiftnum - 1] = parent->slotkey[parentslot];
<a name="l02957"></a>02957 right->childid[shiftnum - 1] = left->childid[left->slotuse];
<a name="l02958"></a>02958
<a name="l02959"></a>02959 <span class="comment">// copy the remaining last items from the left node to the first slot in the right node.</span>
<a name="l02960"></a>02960 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < shiftnum - 1; i++)
<a name="l02961"></a>02961 {
<a name="l02962"></a>02962 right->slotkey[i] = left->slotkey[left->slotuse - shiftnum + i + 1];
<a name="l02963"></a>02963 right->childid[i] = left->childid[left->slotuse - shiftnum + i + 1];
<a name="l02964"></a>02964 }
<a name="l02965"></a>02965
<a name="l02966"></a>02966 <span class="comment">// copy the first to-be-removed key from the left node to the parent's decision slot</span>
<a name="l02967"></a>02967 parent->slotkey[parentslot] = left->slotkey[left->slotuse - shiftnum];
<a name="l02968"></a>02968
<a name="l02969"></a>02969 left->slotuse -= shiftnum;
<a name="l02970"></a>02970 }
<a name="l02971"></a>02971
<a name="l02972"></a>02972 <span class="preprocessor">#ifdef BTREE_DEBUG</span>
<a name="l02973"></a>02973 <span class="preprocessor"></span><span class="keyword">public</span>:
<a name="l02974"></a>02974 <span class="comment">// *** Debug Printing</span>
<a name="l02975"></a>02975
<a name="l02979"></a><a class="code" href="classstx_1_1btree.html#97664fdfb85917808eee2aa8487c5e39">02979</a> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#97664fdfb85917808eee2aa8487c5e39" title="Print out the B+ tree structure with keys onto the given ostream.">print</a>(std::ostream &os)<span class="keyword"> const</span>
<a name="l02980"></a>02980 <span class="keyword"> </span>{
<a name="l02981"></a>02981 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>) {
<a name="l02982"></a>02982 <a class="code" href="classstx_1_1btree.html#197122d34fc70adfd60219a98bbbb489" title="Recursively descend down the tree and print out nodes.">print_node</a>(os, <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>, 0, <span class="keyword">true</span>);
<a name="l02983"></a>02983 }
<a name="l02984"></a>02984 }
<a name="l02985"></a>02985
<a name="l02987"></a><a class="code" href="classstx_1_1btree.html#8270dcc972930a6f2c9f112af8b65075">02987</a> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#8270dcc972930a6f2c9f112af8b65075" title="Print out only the leaves via the double linked list.">print_leaves</a>(std::ostream &os)<span class="keyword"> const</span>
<a name="l02988"></a>02988 <span class="keyword"> </span>{
<a name="l02989"></a>02989 os << <span class="stringliteral">"leaves:"</span> << std::endl;
<a name="l02990"></a>02990
<a name="l02991"></a>02991 <span class="keyword">const</span> leaf_node *n = <a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a>;
<a name="l02992"></a>02992
<a name="l02993"></a>02993 <span class="keywordflow">while</span>(n)
<a name="l02994"></a>02994 {
<a name="l02995"></a>02995 os << <span class="stringliteral">" "</span> << n << std::endl;
<a name="l02996"></a>02996
<a name="l02997"></a>02997 n = n-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a>;
<a name="l02998"></a>02998 }
<a name="l02999"></a>02999 }
<a name="l03000"></a>03000
<a name="l03001"></a>03001 <span class="keyword">private</span>:
<a name="l03002"></a>03002
<a name="l03004"></a><a class="code" href="classstx_1_1btree.html#197122d34fc70adfd60219a98bbbb489">03004</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#197122d34fc70adfd60219a98bbbb489" title="Recursively descend down the tree and print out nodes.">print_node</a>(std::ostream &os, <span class="keyword">const</span> node* node, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> depth=0, <span class="keywordtype">bool</span> recursive=<span class="keyword">false</span>)
<a name="l03005"></a>03005 {
<a name="l03006"></a>03006 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < depth; i++) os << <span class="stringliteral">" "</span>;
<a name="l03007"></a>03007
<a name="l03008"></a>03008 os << <span class="stringliteral">"node "</span> << node << <span class="stringliteral">" level "</span> << node->level << <span class="stringliteral">" slotuse "</span> << node->slotuse << std::endl;
<a name="l03009"></a>03009
<a name="l03010"></a>03010 <span class="keywordflow">if</span> (node->isleafnode())
<a name="l03011"></a>03011 {
<a name="l03012"></a>03012 <span class="keyword">const</span> leaf_node *leafnode = <span class="keyword">static_cast<</span><span class="keyword">const </span>leaf_node*<span class="keyword">></span>(node);
<a name="l03013"></a>03013
<a name="l03014"></a>03014 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < depth; i++) os << <span class="stringliteral">" "</span>;
<a name="l03015"></a>03015 os << <span class="stringliteral">" leaf prev "</span> << leafnode->prevleaf << <span class="stringliteral">" next "</span> << leafnode->nextleaf << std::endl;
<a name="l03016"></a>03016
<a name="l03017"></a>03017 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < depth; i++) os << <span class="stringliteral">" "</span>;
<a name="l03018"></a>03018
<a name="l03019"></a>03019 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> slot = 0; slot < leafnode->slotuse; ++slot)
<a name="l03020"></a>03020 {
<a name="l03021"></a>03021 os << leafnode->slotkey[slot] << <span class="stringliteral">" "</span>; <span class="comment">// << "(data: " << leafnode->slotdata[slot] << ") ";</span>
<a name="l03022"></a>03022 }
<a name="l03023"></a>03023 os << std::endl;
<a name="l03024"></a>03024 }
<a name="l03025"></a>03025 <span class="keywordflow">else</span>
<a name="l03026"></a>03026 {
<a name="l03027"></a>03027 <span class="keyword">const</span> inner_node *innernode = <span class="keyword">static_cast<</span><span class="keyword">const </span>inner_node*<span class="keyword">></span>(node);
<a name="l03028"></a>03028
<a name="l03029"></a>03029 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < depth; i++) os << <span class="stringliteral">" "</span>;
<a name="l03030"></a>03030
<a name="l03031"></a>03031 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot < innernode->slotuse; ++slot)
<a name="l03032"></a>03032 {
<a name="l03033"></a>03033 os << <span class="stringliteral">"("</span> << innernode->childid[slot] << <span class="stringliteral">") "</span> << innernode->slotkey[slot] << <span class="stringliteral">" "</span>;
<a name="l03034"></a>03034 }
<a name="l03035"></a>03035 os << <span class="stringliteral">"("</span> << innernode->childid[innernode->slotuse] << <span class="stringliteral">")"</span> << std::endl;
<a name="l03036"></a>03036
<a name="l03037"></a>03037 <span class="keywordflow">if</span> (recursive)
<a name="l03038"></a>03038 {
<a name="l03039"></a>03039 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot < innernode->slotuse + 1; ++slot)
<a name="l03040"></a>03040 {
<a name="l03041"></a>03041 <a class="code" href="classstx_1_1btree.html#197122d34fc70adfd60219a98bbbb489" title="Recursively descend down the tree and print out nodes.">print_node</a>(os, innernode->childid[slot], depth + 1, recursive);
<a name="l03042"></a>03042 }
<a name="l03043"></a>03043 }
<a name="l03044"></a>03044 }
<a name="l03045"></a>03045 }
<a name="l03046"></a>03046 <span class="preprocessor">#endif</span>
<a name="l03047"></a>03047 <span class="preprocessor"></span>
<a name="l03048"></a>03048 <span class="keyword">public</span>:
<a name="l03049"></a>03049 <span class="comment">// *** Verification of B+ Tree Invariants</span>
<a name="l03050"></a>03050
<a name="l03053"></a><a class="code" href="classstx_1_1btree.html#e382217f25916442745eb83520b20c12">03053</a> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#e382217f25916442745eb83520b20c12" title="Run a thorough verification of all B+ tree invariants.">verify</a>()<span class="keyword"> const</span>
<a name="l03054"></a>03054 <span class="keyword"> </span>{
<a name="l03055"></a>03055 <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> minkey, maxkey;
<a name="l03056"></a>03056 tree_stats vstats;
<a name="l03057"></a>03057
<a name="l03058"></a>03058 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>)
<a name="l03059"></a>03059 {
<a name="l03060"></a>03060 <a class="code" href="classstx_1_1btree.html#a801e588f707be300927cf0c5bbd0f24" title="Recursively descend down the tree and verify each node.">verify_node</a>(<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>, &minkey, &maxkey, vstats);
<a name="l03061"></a>03061
<a name="l03062"></a>03062 assert( vstats.itemcount == <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#8822d400b91499816b6c985e781e9018" title="Number of items in the B+ tree.">itemcount</a> );
<a name="l03063"></a>03063 assert( vstats.leaves == <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#9e4f92e0aa1d90cbf823a3b072495be6" title="Number of leaves in the B+ tree.">leaves</a> );
<a name="l03064"></a>03064 assert( vstats.innernodes == <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#2899f2f8e09b4f8e9be8effb3492deed" title="Number of inner nodes in the B+ tree.">innernodes</a> );
<a name="l03065"></a>03065
<a name="l03066"></a>03066 <a class="code" href="classstx_1_1btree.html#2acaf6a7e8ad48bd1c73e9b3b2f2fb18" title="Verify the double linked list of leaves.">verify_leaflinks</a>();
<a name="l03067"></a>03067 }
<a name="l03068"></a>03068 }
<a name="l03069"></a>03069
<a name="l03070"></a>03070 <span class="keyword">private</span>:
<a name="l03071"></a>03071
<a name="l03073"></a><a class="code" href="classstx_1_1btree.html#a801e588f707be300927cf0c5bbd0f24">03073</a> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#a801e588f707be300927cf0c5bbd0f24" title="Recursively descend down the tree and verify each node.">verify_node</a>(<span class="keyword">const</span> node* n, <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>* minkey, <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>* maxkey, tree_stats &vstats)<span class="keyword"> const</span>
<a name="l03074"></a>03074 <span class="keyword"> </span>{
<a name="l03075"></a>03075 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"verifynode "</span> << n << std::endl);
<a name="l03076"></a>03076
<a name="l03077"></a>03077 <span class="keywordflow">if</span> (n->isleafnode())
<a name="l03078"></a>03078 {
<a name="l03079"></a>03079 <span class="keyword">const</span> leaf_node *leaf = <span class="keyword">static_cast<</span><span class="keyword">const </span>leaf_node*<span class="keyword">></span>(n);
<a name="l03080"></a>03080
<a name="l03081"></a>03081 assert( leaf == <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a> || !leaf->isunderflow() );
<a name="l03082"></a>03082 assert( leaf->slotuse > 0 );
<a name="l03083"></a>03083
<a name="l03084"></a>03084 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot < leaf->slotuse - 1; ++slot)
<a name="l03085"></a>03085 {
<a name="l03086"></a>03086 assert(<a class="code" href="classstx_1_1btree.html#b20b48ee5b3b4a1d4e216d5948f8c1a0" title="True if a &lt;= b ? constructed from key_less().">key_lessequal</a>(leaf->slotkey[slot], leaf->slotkey[slot + 1]));
<a name="l03087"></a>03087 }
<a name="l03088"></a>03088
<a name="l03089"></a>03089 *minkey = leaf->slotkey[0];
<a name="l03090"></a>03090 *maxkey = leaf->slotkey[leaf->slotuse - 1];
<a name="l03091"></a>03091
<a name="l03092"></a>03092 vstats.leaves++;
<a name="l03093"></a>03093 vstats.itemcount += leaf->slotuse;
<a name="l03094"></a>03094 }
<a name="l03095"></a>03095 <span class="keywordflow">else</span> <span class="comment">// !n->isleafnode()</span>
<a name="l03096"></a>03096 {
<a name="l03097"></a>03097 <span class="keyword">const</span> inner_node *inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>inner_node*<span class="keyword">></span>(n);
<a name="l03098"></a>03098 vstats.innernodes++;
<a name="l03099"></a>03099
<a name="l03100"></a>03100 assert( inner == <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a> || !inner->isunderflow() );
<a name="l03101"></a>03101 assert( inner->slotuse > 0 );
<a name="l03102"></a>03102
<a name="l03103"></a>03103 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot < inner->slotuse - 1; ++slot)
<a name="l03104"></a>03104 {
<a name="l03105"></a>03105 assert(<a class="code" href="classstx_1_1btree.html#b20b48ee5b3b4a1d4e216d5948f8c1a0" title="True if a &lt;= b ? constructed from key_less().">key_lessequal</a>(inner->slotkey[slot], inner->slotkey[slot + 1]));
<a name="l03106"></a>03106 }
<a name="l03107"></a>03107
<a name="l03108"></a>03108 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot <= inner->slotuse; ++slot)
<a name="l03109"></a>03109 {
<a name="l03110"></a>03110 <span class="keyword">const</span> node *subnode = inner->childid[slot];
<a name="l03111"></a>03111 <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> subminkey = <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>();
<a name="l03112"></a>03112 <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a> submaxkey = <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">key_type</a>();
<a name="l03113"></a>03113
<a name="l03114"></a>03114 assert(subnode->level + 1 == inner->level);
<a name="l03115"></a>03115 <a class="code" href="classstx_1_1btree.html#a801e588f707be300927cf0c5bbd0f24" title="Recursively descend down the tree and verify each node.">verify_node</a>(subnode, &subminkey, &submaxkey, vstats);
<a name="l03116"></a>03116
<a name="l03117"></a>03117 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"verify subnode "</span> << subnode << <span class="stringliteral">": "</span> << subminkey << <span class="stringliteral">" - "</span> << submaxkey << std::endl);
<a name="l03118"></a>03118
<a name="l03119"></a>03119 <span class="keywordflow">if</span> (slot == 0)
<a name="l03120"></a>03120 *minkey = subminkey;
<a name="l03121"></a>03121 <span class="keywordflow">else</span>
<a name="l03122"></a>03122 assert(<a class="code" href="classstx_1_1btree.html#0571b5b68a6ef06b7606975a7176867c" title="True if a &gt;= b ? constructed from key_less().">key_greaterequal</a>(subminkey, inner->slotkey[slot-1]));
<a name="l03123"></a>03123
<a name="l03124"></a>03124 <span class="keywordflow">if</span> (slot == inner->slotuse)
<a name="l03125"></a>03125 *maxkey = submaxkey;
<a name="l03126"></a>03126 <span class="keywordflow">else</span>
<a name="l03127"></a>03127 assert(<a class="code" href="classstx_1_1btree.html#f09828d360e903d40c9f8c77183bea0e" title="True if a == b ? constructed from key_less().">key_equal</a>(inner->slotkey[slot], submaxkey));
<a name="l03128"></a>03128
<a name="l03129"></a>03129 <span class="keywordflow">if</span> (inner->level == 1 && slot < inner->slotuse)
<a name="l03130"></a>03130 {
<a name="l03131"></a>03131 <span class="comment">// children are leaves and must be linked together in the</span>
<a name="l03132"></a>03132 <span class="comment">// correct order</span>
<a name="l03133"></a>03133 <span class="keyword">const</span> leaf_node *leafa = <span class="keyword">static_cast<</span><span class="keyword">const </span>leaf_node*<span class="keyword">></span>(inner->childid[slot]);
<a name="l03134"></a>03134 <span class="keyword">const</span> leaf_node *leafb = <span class="keyword">static_cast<</span><span class="keyword">const </span>leaf_node*<span class="keyword">></span>(inner->childid[slot + 1]);
<a name="l03135"></a>03135
<a name="l03136"></a>03136 assert(leafa->nextleaf == leafb);
<a name="l03137"></a>03137 assert(leafa == leafb->prevleaf);
<a name="l03138"></a>03138 (void)leafa; (void)leafb;
<a name="l03139"></a>03139 }
<a name="l03140"></a>03140 <span class="keywordflow">if</span> (inner->level == 2 && slot < inner->slotuse)
<a name="l03141"></a>03141 {
<a name="l03142"></a>03142 <span class="comment">// verify leaf links between the adjacent inner nodes</span>
<a name="l03143"></a>03143 <span class="keyword">const</span> inner_node *parenta = <span class="keyword">static_cast<</span><span class="keyword">const </span>inner_node*<span class="keyword">></span>(inner->childid[slot]);
<a name="l03144"></a>03144 <span class="keyword">const</span> inner_node *parentb = <span class="keyword">static_cast<</span><span class="keyword">const </span>inner_node*<span class="keyword">></span>(inner->childid[slot+1]);
<a name="l03145"></a>03145
<a name="l03146"></a>03146 <span class="keyword">const</span> leaf_node *leafa = <span class="keyword">static_cast<</span><span class="keyword">const </span>leaf_node*<span class="keyword">></span>(parenta->childid[parenta->slotuse]);
<a name="l03147"></a>03147 <span class="keyword">const</span> leaf_node *leafb = <span class="keyword">static_cast<</span><span class="keyword">const </span>leaf_node*<span class="keyword">></span>(parentb->childid[0]);
<a name="l03148"></a>03148
<a name="l03149"></a>03149 assert(leafa->nextleaf == leafb);
<a name="l03150"></a>03150 assert(leafa == leafb->prevleaf);
<a name="l03151"></a>03151 (void)leafa; (void)leafb;
<a name="l03152"></a>03152 }
<a name="l03153"></a>03153 }
<a name="l03154"></a>03154 }
<a name="l03155"></a>03155 }
<a name="l03156"></a>03156
<a name="l03158"></a><a class="code" href="classstx_1_1btree.html#2acaf6a7e8ad48bd1c73e9b3b2f2fb18">03158</a> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#2acaf6a7e8ad48bd1c73e9b3b2f2fb18" title="Verify the double linked list of leaves.">verify_leaflinks</a>()<span class="keyword"> const</span>
<a name="l03159"></a>03159 <span class="keyword"> </span>{
<a name="l03160"></a>03160 <span class="keyword">const</span> leaf_node *n = <a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a>;
<a name="l03161"></a>03161
<a name="l03162"></a>03162 assert(n->level == 0);
<a name="l03163"></a>03163 assert(!n || n->prevleaf == NULL);
<a name="l03164"></a>03164
<a name="l03165"></a>03165 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> testcount = 0;
<a name="l03166"></a>03166
<a name="l03167"></a>03167 <span class="keywordflow">while</span>(n)
<a name="l03168"></a>03168 {
<a name="l03169"></a>03169 assert(n->level == 0);
<a name="l03170"></a>03170 assert(n->slotuse > 0);
<a name="l03171"></a>03171
<a name="l03172"></a>03172 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot < n->slotuse - 1; ++slot)
<a name="l03173"></a>03173 {
<a name="l03174"></a>03174 assert(<a class="code" href="classstx_1_1btree.html#b20b48ee5b3b4a1d4e216d5948f8c1a0" title="True if a &lt;= b ? constructed from key_less().">key_lessequal</a>(n->slotkey[slot], n->slotkey[slot + 1]));
<a name="l03175"></a>03175 }
<a name="l03176"></a>03176
<a name="l03177"></a>03177 testcount += n->slotuse;
<a name="l03178"></a>03178
<a name="l03179"></a>03179 <span class="keywordflow">if</span> (n->nextleaf)
<a name="l03180"></a>03180 {
<a name="l03181"></a>03181 assert(<a class="code" href="classstx_1_1btree.html#b20b48ee5b3b4a1d4e216d5948f8c1a0" title="True if a &lt;= b ? constructed from key_less().">key_lessequal</a>(n->slotkey[n->slotuse-1], n->nextleaf->slotkey[0]));
<a name="l03182"></a>03182
<a name="l03183"></a>03183 assert(n == n->nextleaf->prevleaf);
<a name="l03184"></a>03184 }
<a name="l03185"></a>03185 <span class="keywordflow">else</span>
<a name="l03186"></a>03186 {
<a name="l03187"></a>03187 assert(<a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a> == n);
<a name="l03188"></a>03188 }
<a name="l03189"></a>03189
<a name="l03190"></a>03190 n = n->nextleaf;
<a name="l03191"></a>03191 }
<a name="l03192"></a>03192
<a name="l03193"></a>03193 assert(testcount == <a class="code" href="classstx_1_1btree.html#5e32032d192795a5f25b49e23e3ef1a1" title="Return the number of key/data pairs in the B+ tree.">size</a>());
<a name="l03194"></a>03194 }
<a name="l03195"></a>03195
<a name="l03196"></a>03196 <span class="keyword">private</span>:
<a name="l03197"></a>03197 <span class="comment">// *** Dump and Restore of B+ Trees</span>
<a name="l03198"></a>03198
<a name="l03202"></a>03202 <span class="keyword">struct </span>dump_header
<a name="l03203"></a>03203 {
<a name="l03205"></a>03205 <span class="keywordtype">char</span> signature[12];
<a name="l03206"></a>03206
<a name="l03208"></a>03208 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> version;
<a name="l03209"></a>03209
<a name="l03211"></a>03211 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> key_type_size;
<a name="l03212"></a>03212
<a name="l03214"></a>03214 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> data_type_size;
<a name="l03215"></a>03215
<a name="l03217"></a>03217 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> leafslots;
<a name="l03218"></a>03218
<a name="l03220"></a>03220 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> innerslots;
<a name="l03221"></a>03221
<a name="l03223"></a>03223 <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#35378979c13861883affefda9ad95df7" title="Sixth template parameter: Allow duplicate keys in the B+ tree.">allow_duplicates</a>;
<a name="l03224"></a>03224
<a name="l03226"></a>03226 <a class="code" href="classstx_1_1btree.html#973470864b67129983ea4e1aa2132ac5" title="Size type used to count keys.">size_type</a> itemcount;
<a name="l03227"></a>03227
<a name="l03230"></a>03230 <span class="keyword">inline</span> <span class="keywordtype">void</span> fill()
<a name="l03231"></a>03231 {
<a name="l03232"></a>03232 <span class="comment">// don't want to include string.h just for this signature</span>
<a name="l03233"></a>03233 *<span class="keyword">reinterpret_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>*<span class="keyword">></span>(signature+0) = 0x2d787473;
<a name="l03234"></a>03234 *<span class="keyword">reinterpret_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>*<span class="keyword">></span>(signature+4) = 0x65727462;
<a name="l03235"></a>03235 *<span class="keyword">reinterpret_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>*<span class="keyword">></span>(signature+8) = 0x00000065;
<a name="l03236"></a>03236
<a name="l03237"></a>03237 version = 0;
<a name="l03238"></a>03238 key_type_size = <span class="keyword">sizeof</span>(<span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#2054714c400894aa8822f0f52bc120cf" title="First template parameter: The key type of the B+ tree.">btree_self::key_type</a>);
<a name="l03239"></a>03239 data_type_size = <span class="keyword">sizeof</span>(<span class="keyword">typename</span> <a class="code" href="classstx_1_1btree.html#ca29ad902418d86eeb9b9379a38e5fcd" title="Second template parameter: The data type associated with each key.">btree_self::data_type</a>);
<a name="l03240"></a>03240 leafslots = <a class="code" href="classstx_1_1btree.html#12a39ca671e962924f4acf879a44eafc" title="Base B+ tree parameter: The number of key/data slots in each leaf.">btree_self::leafslotmax</a>;
<a name="l03241"></a>03241 innerslots = <a class="code" href="classstx_1_1btree.html#83a18c2fb7f4e9cfd47ce7545d004324" title="Base B+ tree parameter: The number of key slots in each inner node, this can differ...">btree_self::innerslotmax</a>;
<a name="l03242"></a>03242 <a class="code" href="classstx_1_1btree.html#35378979c13861883affefda9ad95df7" title="Sixth template parameter: Allow duplicate keys in the B+ tree.">allow_duplicates</a> = <a class="code" href="classstx_1_1btree.html#35378979c13861883affefda9ad95df7" title="Sixth template parameter: Allow duplicate keys in the B+ tree.">btree_self::allow_duplicates</a>;
<a name="l03243"></a>03243 }
<a name="l03244"></a>03244
<a name="l03246"></a>03246 <span class="keyword">inline</span> <span class="keywordtype">bool</span> same(<span class="keyword">const</span> <span class="keyword">struct</span> dump_header &o)<span class="keyword"> const</span>
<a name="l03247"></a>03247 <span class="keyword"> </span>{
<a name="l03248"></a>03248 <span class="keywordflow">return</span> (*reinterpret_cast<const unsigned int*>(signature+0) ==
<a name="l03249"></a>03249 *reinterpret_cast<const unsigned int*>(o.signature+0))
<a name="l03250"></a>03250 && (*<span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>*<span class="keyword">></span>(signature+4) ==
<a name="l03251"></a>03251 *reinterpret_cast<const unsigned int*>(o.signature+4))
<a name="l03252"></a>03252 && (*reinterpret_cast<const unsigned int*>(signature+8) ==
<a name="l03253"></a>03253 *<span class="keyword">reinterpret_cast<</span><span class="keyword">const </span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>*<span class="keyword">></span>(o.signature+8))
<a name="l03254"></a>03254
<a name="l03255"></a>03255 && (version == o.version)
<a name="l03256"></a>03256 && (key_type_size == o.key_type_size)
<a name="l03257"></a>03257 && (data_type_size == o.data_type_size)
<a name="l03258"></a>03258 && (leafslots == o.leafslots)
<a name="l03259"></a>03259 && (innerslots == o.innerslots)
<a name="l03260"></a>03260 && (<a class="code" href="classstx_1_1btree.html#35378979c13861883affefda9ad95df7" title="Sixth template parameter: Allow duplicate keys in the B+ tree.">allow_duplicates</a> == o.allow_duplicates);
<a name="l03261"></a>03261 }
<a name="l03262"></a>03262 };
<a name="l03263"></a>03263
<a name="l03264"></a>03264 <span class="keyword">public</span>:
<a name="l03265"></a>03265
<a name="l03270"></a><a class="code" href="classstx_1_1btree.html#4d83f35e94a64b82ca3648d40fb31507">03270</a> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#4d83f35e94a64b82ca3648d40fb31507" title="Dump the contents of the B+ tree out onto an ostream as a binary image.">dump</a>(std::ostream &os)<span class="keyword"> const</span>
<a name="l03271"></a>03271 <span class="keyword"> </span>{
<a name="l03272"></a>03272 <span class="keyword">struct </span>dump_header header;
<a name="l03273"></a>03273 header.fill();
<a name="l03274"></a>03274 header.itemcount = <a class="code" href="classstx_1_1btree.html#5e32032d192795a5f25b49e23e3ef1a1" title="Return the number of key/data pairs in the B+ tree.">size</a>();
<a name="l03275"></a>03275
<a name="l03276"></a>03276 os.write(reinterpret_cast<char*>(&header), <span class="keyword">sizeof</span>(header));
<a name="l03277"></a>03277
<a name="l03278"></a>03278 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>) {
<a name="l03279"></a>03279 <a class="code" href="classstx_1_1btree.html#62b6b49019ad87ed911e6786bf3cc26a" title="Recursively descend down the tree and dump each node in a precise order.">dump_node</a>(os, <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a>);
<a name="l03280"></a>03280 }
<a name="l03281"></a>03281 }
<a name="l03282"></a>03282
<a name="l03287"></a><a class="code" href="classstx_1_1btree.html#f386da3ca44e31b73f68b50630df3ab9">03287</a> <span class="keywordtype">bool</span> <a class="code" href="classstx_1_1btree.html#f386da3ca44e31b73f68b50630df3ab9" title="Restore a binary image of a dumped B+ tree from an istream.">restore</a>(std::istream &is)
<a name="l03288"></a>03288 {
<a name="l03289"></a>03289 <span class="keyword">struct </span>dump_header fileheader;
<a name="l03290"></a>03290 is.read(reinterpret_cast<char*>(&fileheader), <span class="keyword">sizeof</span>(fileheader));
<a name="l03291"></a>03291 <span class="keywordflow">if</span> (!is.good()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l03292"></a>03292
<a name="l03293"></a>03293 <span class="keyword">struct </span>dump_header myheader;
<a name="l03294"></a>03294 myheader.fill();
<a name="l03295"></a>03295 myheader.itemcount = fileheader.itemcount;
<a name="l03296"></a>03296
<a name="l03297"></a>03297 <span class="keywordflow">if</span> (!myheader.same(fileheader))
<a name="l03298"></a>03298 {
<a name="l03299"></a>03299 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"btree::restore: file header does not match instantiation signature."</span> << std::endl);
<a name="l03300"></a>03300 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l03301"></a>03301 }
<a name="l03302"></a>03302
<a name="l03303"></a>03303 <a class="code" href="classstx_1_1btree.html#cf6ccb1acc05ef2845dfa97c81b1be9f" title="Frees all key/data pairs and all nodes of the tree.">clear</a>();
<a name="l03304"></a>03304
<a name="l03305"></a>03305 <span class="keywordflow">if</span> (fileheader.itemcount > 0)
<a name="l03306"></a>03306 {
<a name="l03307"></a>03307 <a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a> = <a class="code" href="classstx_1_1btree.html#0ff07bf2c03e4a11ef365ba475cb004b" title="Read the dump image and construct a tree from the node order in the serialization...">restore_node</a>(is);
<a name="l03308"></a>03308 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#83837b81c8d30c09c4e91d9921efd4a0" title="Pointer to the B+ tree&#39;s root node, either leaf or inner node.">root</a> == NULL) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l03309"></a>03309
<a name="l03310"></a>03310 <a class="code" href="classstx_1_1btree.html#191ecb365eda1096adef4cb7ae223606" title="Other small statistics about the B+ tree.">stats</a>.<a class="code" href="structstx_1_1btree_1_1tree__stats.html#8822d400b91499816b6c985e781e9018" title="Number of items in the B+ tree.">itemcount</a> = fileheader.itemcount;
<a name="l03311"></a>03311 }
<a name="l03312"></a>03312
<a name="l03313"></a>03313 <span class="preprocessor">#ifdef BTREE_DEBUG</span>
<a name="l03314"></a>03314 <span class="preprocessor"></span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#ac6ff74fe9fb9e87958d73c28cb9eef4" title="Debug parameter: Prints out lots of debug information about how the algorithms change...">debug</a>) <a class="code" href="classstx_1_1btree.html#97664fdfb85917808eee2aa8487c5e39" title="Print out the B+ tree structure with keys onto the given ostream.">print</a>(std::cout);
<a name="l03315"></a>03315 <span class="preprocessor">#endif</span>
<a name="l03316"></a>03316 <span class="preprocessor"></span> <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#ee2e25b0fccc7147fd8be0bcf8630b5b" title="Debug parameter: Enables expensive and thorough checking of the B+ tree invariants...">selfverify</a>) <a class="code" href="classstx_1_1btree.html#e382217f25916442745eb83520b20c12" title="Run a thorough verification of all B+ tree invariants.">verify</a>();
<a name="l03317"></a>03317
<a name="l03318"></a>03318 <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l03319"></a>03319 }
<a name="l03320"></a>03320
<a name="l03321"></a>03321 <span class="keyword">private</span>:
<a name="l03322"></a>03322
<a name="l03324"></a><a class="code" href="classstx_1_1btree.html#62b6b49019ad87ed911e6786bf3cc26a">03324</a> <span class="keywordtype">void</span> <a class="code" href="classstx_1_1btree.html#62b6b49019ad87ed911e6786bf3cc26a" title="Recursively descend down the tree and dump each node in a precise order.">dump_node</a>(std::ostream &os, <span class="keyword">const</span> node* n)<span class="keyword"> const</span>
<a name="l03325"></a>03325 <span class="keyword"> </span>{
<a name="l03326"></a>03326 <a class="code" href="btree_8h.html#cd87b40df0c1d4ead6fac13b49cb5345" title="Print out debug information to std::cout if BTREE_DEBUG is defined.">BTREE_PRINT</a>(<span class="stringliteral">"dump_node "</span> << n << std::endl);
<a name="l03327"></a>03327
<a name="l03328"></a>03328 <span class="keywordflow">if</span> (n->isleafnode())
<a name="l03329"></a>03329 {
<a name="l03330"></a>03330 <span class="keyword">const</span> leaf_node *leaf = <span class="keyword">static_cast<</span><span class="keyword">const </span>leaf_node*<span class="keyword">></span>(n);
<a name="l03331"></a>03331
<a name="l03332"></a>03332 os.write(reinterpret_cast<const char*>(leaf), <span class="keyword">sizeof</span>(*leaf));
<a name="l03333"></a>03333 }
<a name="l03334"></a>03334 <span class="keywordflow">else</span> <span class="comment">// !n->isleafnode()</span>
<a name="l03335"></a>03335 {
<a name="l03336"></a>03336 <span class="keyword">const</span> inner_node *inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>inner_node*<span class="keyword">></span>(n);
<a name="l03337"></a>03337
<a name="l03338"></a>03338 os.write(reinterpret_cast<const char*>(inner), <span class="keyword">sizeof</span>(*inner));
<a name="l03339"></a>03339
<a name="l03340"></a>03340 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot <= inner->slotuse; ++slot)
<a name="l03341"></a>03341 {
<a name="l03342"></a>03342 <span class="keyword">const</span> node *subnode = inner->childid[slot];
<a name="l03343"></a>03343
<a name="l03344"></a>03344 <a class="code" href="classstx_1_1btree.html#62b6b49019ad87ed911e6786bf3cc26a" title="Recursively descend down the tree and dump each node in a precise order.">dump_node</a>(os, subnode);
<a name="l03345"></a>03345 }
<a name="l03346"></a>03346 }
<a name="l03347"></a>03347 }
<a name="l03348"></a>03348
<a name="l03351"></a><a class="code" href="classstx_1_1btree.html#0ff07bf2c03e4a11ef365ba475cb004b">03351</a> node* <a class="code" href="classstx_1_1btree.html#0ff07bf2c03e4a11ef365ba475cb004b" title="Read the dump image and construct a tree from the node order in the serialization...">restore_node</a>(std::istream &is)
<a name="l03352"></a>03352 {
<a name="l03353"></a>03353 <span class="keyword">union </span>{
<a name="l03354"></a>03354 node top;
<a name="l03355"></a>03355 leaf_node leaf;
<a name="l03356"></a>03356 inner_node inner;
<a name="l03357"></a>03357 } nu;
<a name="l03358"></a>03358
<a name="l03359"></a>03359 <span class="comment">// first read only the top of the node</span>
<a name="l03360"></a>03360 is.read(reinterpret_cast<char*>(&nu.top), <span class="keyword">sizeof</span>(nu.top));
<a name="l03361"></a>03361 <span class="keywordflow">if</span> (!is.good()) <span class="keywordflow">return</span> NULL;
<a name="l03362"></a>03362
<a name="l03363"></a>03363 <span class="keywordflow">if</span> (nu.top.isleafnode())
<a name="l03364"></a>03364 {
<a name="l03365"></a>03365 <span class="comment">// read remaining data of leaf node</span>
<a name="l03366"></a>03366 is.read(reinterpret_cast<char*>(&nu.leaf) + <span class="keyword">sizeof</span>(nu.top), <span class="keyword">sizeof</span>(nu.leaf) - <span class="keyword">sizeof</span>(nu.top));
<a name="l03367"></a>03367 <span class="keywordflow">if</span> (!is.good()) <span class="keywordflow">return</span> NULL;
<a name="l03368"></a>03368
<a name="l03369"></a>03369 leaf_node *newleaf = <a class="code" href="classstx_1_1btree.html#359771538c203e0e8e301135783fa4a4" title="Allocate and initialize a leaf node.">allocate_leaf</a>();
<a name="l03370"></a>03370
<a name="l03371"></a>03371 <span class="comment">// copy over all data, the leaf nodes contain only their double linked list pointers</span>
<a name="l03372"></a>03372 *newleaf = nu.leaf;
<a name="l03373"></a>03373
<a name="l03374"></a>03374 <span class="comment">// reconstruct the linked list from the order in the file</span>
<a name="l03375"></a>03375 <span class="keywordflow">if</span> (<a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a> == NULL) {
<a name="l03376"></a>03376 <a class="code" href="btree_8h.html#6ac57b9b59dae34aea28cda65b0d14bb" title="Assertion only if BTREE_DEBUG is defined. This is not used in verify().">BTREE_ASSERT</a>(newleaf->prevleaf == NULL);
<a name="l03377"></a>03377 <a class="code" href="classstx_1_1btree.html#de7d8981baba296625eae14006d2c760" title="Pointer to first leaf in the double linked leaf chain.">headleaf</a> = <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a> = newleaf;
<a name="l03378"></a>03378 }
<a name="l03379"></a>03379 <span class="keywordflow">else</span> {
<a name="l03380"></a>03380 newleaf-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#257df6dcc876599f25df40b5e721fcae" title="Double linked list pointers to traverse the leaves.">prevleaf</a> = <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>;
<a name="l03381"></a>03381 <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a>-><a class="code" href="structstx_1_1btree_1_1leaf__node.html#58266afc9bdcdb6db404db198cec7608" title="Double linked list pointers to traverse the leaves.">nextleaf</a> = newleaf;
<a name="l03382"></a>03382 <a class="code" href="classstx_1_1btree.html#84f024ba0a8d91eb94571092bec9fb96" title="Pointer to last leaf in the double linked leaf chain.">tailleaf</a> = newleaf;
<a name="l03383"></a>03383 }
<a name="l03384"></a>03384
<a name="l03385"></a>03385 <span class="keywordflow">return</span> newleaf;
<a name="l03386"></a>03386 }
<a name="l03387"></a>03387 <span class="keywordflow">else</span>
<a name="l03388"></a>03388 {
<a name="l03389"></a>03389 <span class="comment">// read remaining data of inner node</span>
<a name="l03390"></a>03390 is.read(reinterpret_cast<char*>(&nu.inner) + <span class="keyword">sizeof</span>(nu.top), <span class="keyword">sizeof</span>(nu.inner) - <span class="keyword">sizeof</span>(nu.top));
<a name="l03391"></a>03391 <span class="keywordflow">if</span> (!is.good()) <span class="keywordflow">return</span> NULL;
<a name="l03392"></a>03392
<a name="l03393"></a>03393 inner_node *newinner = <a class="code" href="classstx_1_1btree.html#48afc242f523282f8833580a5370ff81" title="Allocate and initialize an inner node.">allocate_inner</a>(0);
<a name="l03394"></a>03394
<a name="l03395"></a>03395 <span class="comment">// copy over all data, the inner nodes contain only pointers to their children</span>
<a name="l03396"></a>03396 *newinner = nu.inner;
<a name="l03397"></a>03397
<a name="l03398"></a>03398 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot <= newinner->slotuse; ++slot)
<a name="l03399"></a>03399 {
<a name="l03400"></a>03400 newinner->childid[slot] = <a class="code" href="classstx_1_1btree.html#0ff07bf2c03e4a11ef365ba475cb004b" title="Read the dump image and construct a tree from the node order in the serialization...">restore_node</a>(is);
<a name="l03401"></a>03401 }
<a name="l03402"></a>03402
<a name="l03403"></a>03403 <span class="keywordflow">return</span> newinner;
<a name="l03404"></a>03404 }
<a name="l03405"></a>03405 }
<a name="l03406"></a>03406 };
<a name="l03407"></a>03407
<a name="l03408"></a>03408 } <span class="comment">// namespace stx</span>
<a name="l03409"></a>03409
<a name="l03410"></a>03410 <span class="preprocessor">#endif // _STX_BTREE_H_</span>
</pre></div></div>
<hr size="1"><address style="text-align: right;"><small>Generated on Sun Sep 7 17:32:38 2008 for STX B+ Tree Template Classes by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.6 </small></address>
</body>
</html>