-
Notifications
You must be signed in to change notification settings - Fork 0
/
btree_8hpp_source.html
335 lines (333 loc) · 687 KB
/
btree_8hpp_source.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.11"/>
<title>tlx: tlx/container/btree.hpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { init_search(); });
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
extensions: ["tex2jax.js"],
jax: ["input/TeX","output/HTML-CSS"],
});
</script><script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">tlx
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.11 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<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="modules.html"><span>Modules</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>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('btree_8hpp_source.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">btree.hpp</div> </div>
</div><!--header-->
<div class="contents">
<a href="btree_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> * tlx/container/btree.hpp</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * Part of tlx - http://panthema.net/tlx</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> * Copyright (C) 2008-2017 Timo Bingmann <[email protected]></span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> *</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment"> * All rights reserved. Published under the Boost Software License, Version 1.0</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> </div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#ifndef TLX_CONTAINER_BTREE_HEADER</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#define TLX_CONTAINER_BTREE_HEADER</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> </div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include <<a class="code" href="die_2core_8hpp.html">tlx/die/core.hpp</a>></span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> </div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment">// *** Required Headers from the STL</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#include <algorithm></span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#include <cassert></span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="preprocessor">#include <cstddef></span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#include <functional></span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="preprocessor">#include <istream></span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="preprocessor">#include <memory></span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="preprocessor">#include <ostream></span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="preprocessor">#include <utility></span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> </div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="keyword">namespace </span><a class="code" href="namespacetlx.html">tlx</a> {</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"></span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="comment">//! \addtogroup tlx_container</span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="comment">//! \{</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="comment">//! \defgroup tlx_container_btree B+ Trees</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="comment">//! B+ tree variants</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="comment">//! \{</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="comment"></span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="comment">// *** Debugging Macros</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> </div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="preprocessor">#ifdef TLX_BTREE_DEBUG</span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> </div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="preprocessor">#include <iostream></span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="comment"></span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="comment">//! Print out debug information to std::cout if TLX_BTREE_DEBUG is defined.</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="comment"></span><span class="preprocessor">#define TLX_BTREE_PRINT(x) \</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="preprocessor"> do { if (debug) (std::cout << x << std::endl); } while (0)</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="comment"></span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="comment">//! Assertion only if TLX_BTREE_DEBUG is defined. This is not used in verify().</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="comment"></span><span class="preprocessor">#define TLX_BTREE_ASSERT(x) \</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="preprocessor"> do { assert(x); } while (0)</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> </div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="comment"></span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="comment">//! Print out debug information to std::cout if TLX_BTREE_DEBUG is defined.</span></div><div class="line"><a name="l00052"></a><span class="lineno"><a class="line" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c"> 52</a></span> <span class="comment"></span><span class="preprocessor">#define TLX_BTREE_PRINT(x) do { } while (0)</span></div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> <span class="comment"></span></div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> <span class="comment">//! Assertion only if TLX_BTREE_DEBUG is defined. This is not used in verify().</span></div><div class="line"><a name="l00055"></a><span class="lineno"><a class="line" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b"> 55</a></span> <span class="comment"></span><span class="preprocessor">#define TLX_BTREE_ASSERT(x) do { } while (0)</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> </div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="comment"></span></div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <span class="comment">//! The maximum of a and b. Used in some compile-time formulas.</span></div><div class="line"><a name="l00060"></a><span class="lineno"><a class="line" href="group__tlx__container__btree.html#ga069fbcbc52ca1f7cbe681ff86d1e0e73"> 60</a></span> <span class="comment"></span><span class="preprocessor">#define TLX_BTREE_MAX(a, b) ((a) < (b) ? (b) : (a))</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> </div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> <span class="preprocessor">#ifndef TLX_BTREE_FRIENDS</span></div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> <span class="comment">//! The macro TLX_BTREE_FRIENDS can be used by outside class to access the B+</span></div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> <span class="comment"></span><span class="comment">//! tree internals. This was added for wxBTreeDemo to be able to draw the</span></div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> <span class="comment"></span><span class="comment">//! tree.</span></div><div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="group__tlx__container__btree.html#ga615c99c9c9168777ab650dcdc9331947"> 66</a></span> <span class="comment"></span><span class="preprocessor">#define TLX_BTREE_FRIENDS friend class btree_friend</span></div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> <span class="comment"></span></div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span> <span class="comment">/*!</span></div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> <span class="comment"> * Generates default traits for a B+ tree used as a set or map. It estimates</span></div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> <span class="comment"> * leaf and inner node sizes by assuming a cache line multiple of 256 bytes.</span></div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span> <span class="comment">*/</span></div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Key, <span class="keyword">typename</span> Value></div><div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="structtlx_1_1btree__default__traits.html"> 74</a></span> <span class="keyword">struct </span><a class="code" href="structtlx_1_1btree__default__traits.html">btree_default_traits</a> {<span class="comment"></span></div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> <span class="comment"> //! If true, the tree will self verify its invariants after each insert() or</span></div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span> <span class="comment"> //! erase(). The header must have been compiled with TLX_BTREE_DEBUG</span></div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span> <span class="comment"> //! defined.</span></div><div class="line"><a name="l00078"></a><span class="lineno"><a class="line" href="structtlx_1_1btree__default__traits.html#a81a632bc519f850f4af56567ba404f4e"> 78</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="structtlx_1_1btree__default__traits.html#a81a632bc519f850f4af56567ba404f4e">self_verify</a> = <span class="keyword">false</span>;</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span> <span class="comment"></span></div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span> <span class="comment"> //! If true, the tree will print out debug information and a tree dump</span></div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span> <span class="comment"> //! during insert() or erase() operation. The header must have been</span></div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span> <span class="comment"> //! compiled with TLX_BTREE_DEBUG defined and key_type must be std::ostream</span></div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span> <span class="comment"> //! printable.</span></div><div class="line"><a name="l00084"></a><span class="lineno"><a class="line" href="structtlx_1_1btree__default__traits.html#a6295d47efda04de55c38cb8ea1cdb807"> 84</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="structtlx_1_1btree__default__traits.html#a6295d47efda04de55c38cb8ea1cdb807">debug</a> = <span class="keyword">false</span>;</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span> <span class="comment"></span></div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span> <span class="comment"> //! Number of slots in each leaf of the tree. Estimated so that each node</span></div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> <span class="comment"> //! has a size of about 256 bytes.</span></div><div class="line"><a name="l00088"></a><span class="lineno"><a class="line" href="structtlx_1_1btree__default__traits.html#adc2c16c96b684ee7d881e7dab29717a3"> 88</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="structtlx_1_1btree__default__traits.html#adc2c16c96b684ee7d881e7dab29717a3">leaf_slots</a> =</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  <a class="code" href="group__tlx__container__btree.html#ga069fbcbc52ca1f7cbe681ff86d1e0e73">TLX_BTREE_MAX</a>(8, 256 / (<span class="keyword">sizeof</span>(Value)));</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span> <span class="comment"></span></div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span> <span class="comment"> //! Number of slots in each inner node of the tree. Estimated so that each</span></div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span> <span class="comment"> //! node has a size of about 256 bytes.</span></div><div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="structtlx_1_1btree__default__traits.html#a5424ef685b876f253f83fa26ecec5761"> 93</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="structtlx_1_1btree__default__traits.html#a5424ef685b876f253f83fa26ecec5761">inner_slots</a> =</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <a class="code" href="group__tlx__container__btree.html#ga069fbcbc52ca1f7cbe681ff86d1e0e73">TLX_BTREE_MAX</a>(8, 256 / (<span class="keyword">sizeof</span>(Key) + <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*)));</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> <span class="comment"></span></div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span> <span class="comment"> //! As of stx-btree-0.9, the code does linear search in find_lower() and</span></div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span> <span class="comment"> //! find_upper() instead of binary_search, unless the node size is larger</span></div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> <span class="comment"> //! than this threshold. See notes at</span></div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span> <span class="comment"> //! http://panthema.net/2013/0504-STX-B+Tree-Binary-vs-Linear-Search</span></div><div class="line"><a name="l00100"></a><span class="lineno"><a class="line" href="structtlx_1_1btree__default__traits.html#a4fefb7d61067934069f6a783e110ab47"> 100</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="structtlx_1_1btree__default__traits.html#a4fefb7d61067934069f6a783e110ab47">binsearch_threshold</a> = 256;</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> };</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span> <span class="comment"></span></div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span> <span class="comment">/*!</span></div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span> <span class="comment"> * Basic class implementing a B+ tree data structure in memory.</span></div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> <span class="comment"> *</span></div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> <span class="comment"> * The base implementation of an in-memory B+ tree. It is based on the</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> <span class="comment"> * implementation in Cormen's Introduction into Algorithms, Jan Jannink's paper</span></div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span> <span class="comment"> * and other algorithm resources. Almost all STL-required function calls are</span></div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span> <span class="comment"> * implemented. The asymptotic time requirements of the STL are not always</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> <span class="comment"> * fulfilled in theory, however, in practice this B+ tree performs better than a</span></div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span> <span class="comment"> * red-black tree and almost always uses less memory. The insertion function</span></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span> <span class="comment"> * splits the nodes on the recursion unroll. Erase is largely based on Jannink's</span></div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span> <span class="comment"> * ideas.</span></div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span> <span class="comment"> *</span></div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span> <span class="comment"> * This class is specialized into btree_set, btree_multiset, btree_map and</span></div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <span class="comment"> * btree_multimap using default template parameters and facade functions.</span></div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span> <span class="comment"> */</span></div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Key, <span class="keyword">typename</span> Value,</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <span class="keyword">typename</span> KeyOfValue,</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keyword">typename</span> Compare = std::less<Key>,</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keyword">typename</span> Traits = <a class="code" href="structtlx_1_1btree__default__traits.html">btree_default_traits<Key, Value></a>,</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="keywordtype">bool</span> Duplicates = <span class="keyword">false</span>,</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="keyword">typename</span> Allocator = std::allocator<Value> ></div><div class="line"><a name="l00124"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html"> 124</a></span> <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree.html">BTree</a></div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span> {</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> <span class="comment"> //! \name Template Parameter Types</span></div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> <span class="comment"> //! First template parameter: The key type of the B+ tree. This is stored in</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> <span class="comment"> //! inner nodes.</span></div><div class="line"><a name="l00132"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a38ec6d0825c22c2d0ad31f3209ed2d02"> 132</a></span> <span class="comment"></span> <span class="keyword">typedef</span> Key <a class="code" href="classtlx_1_1BTree.html#a38ec6d0825c22c2d0ad31f3209ed2d02">key_type</a>;</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span> <span class="comment"></span></div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span> <span class="comment"> //! Second template parameter: Composition pair of key and data types, or</span></div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span> <span class="comment"> //! just the key for set containers. This data type is stored in the leaves.</span></div><div class="line"><a name="l00136"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a04f69f8f2936ff309627511179c1709b"> 136</a></span> <span class="comment"></span> <span class="keyword">typedef</span> Value <a class="code" href="classtlx_1_1BTree.html#a04f69f8f2936ff309627511179c1709b">value_type</a>;</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span> <span class="comment"></span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span> <span class="comment"> //! Third template: key extractor class to pull key_type from value_type.</span></div><div class="line"><a name="l00139"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a21e576e049c90e014ffeb583c24d2f38"> 139</a></span> <span class="comment"></span> <span class="keyword">typedef</span> KeyOfValue <a class="code" href="classtlx_1_1BTree.html#a21e576e049c90e014ffeb583c24d2f38">key_of_value</a>;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span> <span class="comment"></span></div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span> <span class="comment"> //! Fourth template parameter: key_type comparison function object</span></div><div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a6ff4e347839868db0770859a3dd55a27"> 142</a></span> <span class="comment"></span> <span class="keyword">typedef</span> Compare <a class="code" href="classtlx_1_1BTree.html#a6ff4e347839868db0770859a3dd55a27">key_compare</a>;</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span> <span class="comment"></span></div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span> <span class="comment"> //! Fifth template parameter: Traits object used to define more parameters</span></div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> <span class="comment"> //! of the B+ tree</span></div><div class="line"><a name="l00146"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#ab0d2e59411be6b53e63c29149a17fbcc"> 146</a></span> <span class="comment"></span> <span class="keyword">typedef</span> Traits <a class="code" href="classtlx_1_1BTree.html#ab0d2e59411be6b53e63c29149a17fbcc">traits</a>;</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span> <span class="comment"></span></div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span> <span class="comment"> //! Sixth template parameter: Allow duplicate keys in the B+ tree. Used to</span></div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span> <span class="comment"> //! implement multiset and multimap.</span></div><div class="line"><a name="l00150"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a4a380c8745ff0a1c814742821e85403e"> 150</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> allow_duplicates = Duplicates;</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> <span class="comment"></span></div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span> <span class="comment"> //! Seventh template parameter: STL allocator for tree nodes</span></div><div class="line"><a name="l00153"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#aff35d256caa55f37343da8200179e608"> 153</a></span> <span class="comment"></span> <span class="keyword">typedef</span> Allocator <a class="code" href="classtlx_1_1BTree.html#aff35d256caa55f37343da8200179e608">allocator_type</a>;</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span> <span class="comment"></span></div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span> <span class="comment"></span></div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <span class="comment">// The macro TLX_BTREE_FRIENDS can be used by outside class to access the B+</span></div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="comment">// tree internals. This was added for wxBTreeDemo to be able to draw the</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="comment">// tree.</span></div><div class="line"><a name="l00160"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a38ffbf220e298d1ee8c79307009cfa00"> 160</a></span>  <a class="code" href="classtlx_1_1BTree.html#a38ffbf220e298d1ee8c79307009cfa00">TLX_BTREE_FRIENDS</a>;</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span> </div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> <span class="comment"> //! \name Constructed Types</span></div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span> <span class="comment"> //! Typedef of our own type</span></div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span> <span class="comment"></span> <span class="keyword">typedef</span> <a class="code" href="classtlx_1_1BTree.html">BTree</a><key_type, value_type, key_of_value, key_compare,</div><div class="line"><a name="l00168"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a33b885434598e4d5ac5f06605e53b678"> 168</a></span>  traits, allow_duplicates, allocator_type> <a class="code" href="classtlx_1_1BTree.html#a33b885434598e4d5ac5f06605e53b678">Self</a>;</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span> <span class="comment"></span></div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span> <span class="comment"> //! Size type used to count keys</span></div><div class="line"><a name="l00171"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a49b489a408a211a90e766329c0732d7b"> 171</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <span class="keywordtype">size_t</span> <a class="code" href="classtlx_1_1BTree.html#a49b489a408a211a90e766329c0732d7b">size_type</a>;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span> <span class="comment"></span></div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span> <span class="comment"></span></div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span> <span class="comment"> //! \name Static Constant Options and Values of the B+ Tree</span></div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span> <span class="comment"> //! Base B+ tree parameter: The number of key/data slots in each leaf</span></div><div class="line"><a name="l00180"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a52e57d8d7e32f6d5a56227a8d1f899cf"> 180</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> leaf_slotmax = traits::leaf_slots;</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span> <span class="comment"></span></div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> <span class="comment"> //! Base B+ tree parameter: The number of key slots in each inner node,</span></div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> <span class="comment"> //! this can differ from slots in each leaf.</span></div><div class="line"><a name="l00184"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a004e76f14b7697d3801e3b1d397da5a5"> 184</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> inner_slotmax = traits::inner_slots;</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span> <span class="comment"></span></div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> <span class="comment"> //! Computed B+ tree parameter: The minimum number of key/data slots used</span></div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span> <span class="comment"> //! in a leaf. If fewer slots are used, the leaf will be merged or slots</span></div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span> <span class="comment"> //! shifted from it's siblings.</span></div><div class="line"><a name="l00189"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#abbec00fa1cdcfbf6b78482915c644dba"> 189</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> leaf_slotmin = (leaf_slotmax / 2);</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span> <span class="comment"></span></div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span> <span class="comment"> //! Computed B+ tree parameter: The minimum number of key slots used</span></div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span> <span class="comment"> //! in an inner node. If fewer slots are used, the inner node will be</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> <span class="comment"> //! merged or slots shifted from it's siblings.</span></div><div class="line"><a name="l00194"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a416b2e639a4ec04429632c3ee85e747c"> 194</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> inner_slotmin = (inner_slotmax / 2);</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> <span class="comment"></span></div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span> <span class="comment"> //! Debug parameter: Enables expensive and thorough checking of the B+ tree</span></div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span> <span class="comment"> //! invariants after each insert/erase operation.</span></div><div class="line"><a name="l00198"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a81a632bc519f850f4af56567ba404f4e"> 198</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> self_verify = traits::self_verify;</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span> <span class="comment"></span></div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span> <span class="comment"> //! Debug parameter: Prints out lots of debug information about how the</span></div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> <span class="comment"> //! algorithms change the tree. Requires the header file to be compiled</span></div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span> <span class="comment"> //! with TLX_BTREE_DEBUG and the key type must be std::ostream printable.</span></div><div class="line"><a name="l00203"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a6295d47efda04de55c38cb8ea1cdb807"> 203</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> debug = traits::debug;</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span> <span class="comment"></span></div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span> <span class="comment"></span></div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span> <span class="keyword">private</span>:<span class="comment"></span></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span> <span class="comment"> //! \name Node Classes for In-Memory Nodes</span></div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span> <span class="comment"> //! The header structure of each node in-memory. This structure is extended</span></div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span> <span class="comment"> //! by InnerNode or LeafNode.</span></div><div class="line"><a name="l00213"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1node.html"> 213</a></span> <span class="comment"></span> <span class="keyword">struct </span><a class="code" href="structtlx_1_1BTree_1_1node.html">node</a> {<span class="comment"></span></div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span> <span class="comment"> //! Level in the b-tree, if level == 0 -> leaf node</span></div><div class="line"><a name="l00215"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1node.html#a15137871fddf6b98c4f13fda9d53c33c"> 215</a></span> <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="structtlx_1_1BTree_1_1node.html#a15137871fddf6b98c4f13fda9d53c33c">level</a>;</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span> <span class="comment"></span></div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span> <span class="comment"> //! Number of key slotuse use, so the number of valid children or data</span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span> <span class="comment"> //! pointers</span></div><div class="line"><a name="l00219"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64"> 219</a></span> <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a>;</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span> <span class="comment"></span></div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span> <span class="comment"> //! Delayed initialisation of constructed node.</span></div><div class="line"><a name="l00222"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1node.html#a85fe587cefa3de25d9549aaf09356ba6"> 222</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="structtlx_1_1BTree_1_1node.html#a85fe587cefa3de25d9549aaf09356ba6">initialize</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> l) {</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  level = l;</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  slotuse = 0;</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  }</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span> <span class="comment"></span></div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span> <span class="comment"> //! True if this is a leaf node.</span></div><div class="line"><a name="l00228"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1node.html#af0bb2987233e128054452dc84553b3a9"> 228</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="structtlx_1_1BTree_1_1node.html#af0bb2987233e128054452dc84553b3a9">is_leafnode</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordflow">return</span> (level == 0);</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  }</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  };</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span> <span class="comment"></span></div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span> <span class="comment"> //! Extended structure of a inner node in-memory. Contains only keys and no</span></div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span> <span class="comment"> //! data items.</span></div><div class="line"><a name="l00235"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1InnerNode.html"> 235</a></span> <span class="comment"></span> <span class="keyword">struct </span><a class="code" href="structtlx_1_1BTree_1_1InnerNode.html">InnerNode</a> : <span class="keyword">public</span> <a class="code" href="structtlx_1_1BTree_1_1node.html">node</a> {<span class="comment"></span></div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span> <span class="comment"> //! Define an related allocator for the InnerNode structs.</span></div><div class="line"><a name="l00237"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1InnerNode.html#a4a7d2aabf68288b465287ac1882c0545"> 237</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <span class="keyword">typename</span> std::allocator_traits<Allocator>::template rebind_alloc<InnerNode> <a class="code" href="structtlx_1_1BTree_1_1InnerNode.html#a4a7d2aabf68288b465287ac1882c0545">alloc_type</a>;</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span> <span class="comment"></span></div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> <span class="comment"> //! Keys of children or data pointers</span></div><div class="line"><a name="l00240"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1InnerNode.html#aadab4c4629760352c8b7766669471657"> 240</a></span> <span class="comment"></span> key_type slotkey[inner_slotmax]; <span class="comment">// NOLINT</span></div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span> <span class="comment"></span></div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span> <span class="comment"> //! Pointers to children</span></div><div class="line"><a name="l00243"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1InnerNode.html#a62b9b49e8ee098752fb3893429dfdcb8"> 243</a></span> <span class="comment"></span> <a class="code" href="structtlx_1_1BTree_1_1node.html">node</a>* childid[inner_slotmax + 1]; <span class="comment">// NOLINT</span></div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span> <span class="comment"></span></div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span> <span class="comment"> //! Set variables to initial values.</span></div><div class="line"><a name="l00246"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1InnerNode.html#a85fe587cefa3de25d9549aaf09356ba6"> 246</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="structtlx_1_1BTree_1_1InnerNode.html#a85fe587cefa3de25d9549aaf09356ba6">initialize</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> l) {</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  node::initialize(l);</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  }</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span> <span class="comment"></span></div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span> <span class="comment"> //! Return key in slot s</span></div><div class="line"><a name="l00251"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1InnerNode.html#ab52e5ead4896194d02bf207103be33a8"> 251</a></span> <span class="comment"></span> <span class="keyword">const</span> key_type& <a class="code" href="structtlx_1_1BTree_1_1InnerNode.html#ab52e5ead4896194d02bf207103be33a8">key</a>(<span class="keywordtype">size_t</span> s)<span class="keyword"> const </span>{</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <span class="keywordflow">return</span> slotkey[s];</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  }</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span> <span class="comment"></span></div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span> <span class="comment"> //! True if the node's slots are full.</span></div><div class="line"><a name="l00256"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1InnerNode.html#ae028d16479603404a2f2b71bfc0abe82"> 256</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="structtlx_1_1BTree_1_1InnerNode.html#ae028d16479603404a2f2b71bfc0abe82">is_full</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  <span class="keywordflow">return</span> (node::slotuse == inner_slotmax);</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  }</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span> <span class="comment"></span></div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span> <span class="comment"> //! True if few used entries, less than half full.</span></div><div class="line"><a name="l00261"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1InnerNode.html#a6b3d146cb22feb18ab880a19892aa01a"> 261</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="structtlx_1_1BTree_1_1InnerNode.html#a6b3d146cb22feb18ab880a19892aa01a">is_few</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <span class="keywordflow">return</span> (node::slotuse <= inner_slotmin);</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  }</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span> <span class="comment"></span></div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span> <span class="comment"> //! True if node has too few entries.</span></div><div class="line"><a name="l00266"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1InnerNode.html#a161bc176fff45968605cbbf2bb5f4ef9"> 266</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="structtlx_1_1BTree_1_1InnerNode.html#a161bc176fff45968605cbbf2bb5f4ef9">is_underflow</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="keywordflow">return</span> (node::slotuse < inner_slotmin);</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  }</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  };</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span> <span class="comment"></span></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span> <span class="comment"> //! Extended structure of a leaf node in memory. Contains pairs of keys and</span></div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span> <span class="comment"> //! data items. Key and data slots are kept together in value_type.</span></div><div class="line"><a name="l00273"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1LeafNode.html"> 273</a></span> <span class="comment"></span> <span class="keyword">struct </span><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html">LeafNode</a> : <span class="keyword">public</span> <a class="code" href="structtlx_1_1BTree_1_1node.html">node</a> {<span class="comment"></span></div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span> <span class="comment"> //! Define an related allocator for the LeafNode structs.</span></div><div class="line"><a name="l00275"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1LeafNode.html#a4128fcf2ecb19e1ebecf4552cdde8c89"> 275</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <span class="keyword">typename</span> std::allocator_traits<Allocator>::template rebind_alloc<LeafNode> <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a4128fcf2ecb19e1ebecf4552cdde8c89">alloc_type</a>;</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span> <span class="comment"></span></div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span> <span class="comment"> //! Double linked list pointers to traverse the leaves</span></div><div class="line"><a name="l00278"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60"> 278</a></span> <span class="comment"></span> <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html">LeafNode</a>* <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a>;</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span> <span class="comment"></span></div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span> <span class="comment"> //! Double linked list pointers to traverse the leaves</span></div><div class="line"><a name="l00281"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3"> 281</a></span> <span class="comment"></span> <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html">LeafNode</a>* <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a>;</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span> <span class="comment"></span></div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span> <span class="comment"> //! Array of (key, data) pairs</span></div><div class="line"><a name="l00284"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1LeafNode.html#a05e3d86c2442ace4b66c19e28e2a9585"> 284</a></span> <span class="comment"></span> value_type slotdata[leaf_slotmax]; <span class="comment">// NOLINT</span></div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span> <span class="comment"></span></div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span> <span class="comment"> //! Set variables to initial values</span></div><div class="line"><a name="l00287"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1LeafNode.html#a25a40b6614565f755233080a384c35f1"> 287</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a25a40b6614565f755233080a384c35f1">initialize</a>() {</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  node::initialize(0);</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  prev_leaf = next_leaf = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  }</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span> <span class="comment"></span></div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span> <span class="comment"> //! Return key in slot s.</span></div><div class="line"><a name="l00293"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1LeafNode.html#ab52e5ead4896194d02bf207103be33a8"> 293</a></span> <span class="comment"></span> <span class="keyword">const</span> key_type& <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#ab52e5ead4896194d02bf207103be33a8">key</a>(<span class="keywordtype">size_t</span> s)<span class="keyword"> const </span>{</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <span class="keywordflow">return</span> key_of_value::get(slotdata[s]);</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  }</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span> <span class="comment"></span></div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span> <span class="comment"> //! True if the node's slots are full.</span></div><div class="line"><a name="l00298"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1LeafNode.html#ae028d16479603404a2f2b71bfc0abe82"> 298</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#ae028d16479603404a2f2b71bfc0abe82">is_full</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="keywordflow">return</span> (node::slotuse == leaf_slotmax);</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  }</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span> <span class="comment"></span></div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span> <span class="comment"> //! True if few used entries, less than half full.</span></div><div class="line"><a name="l00303"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1LeafNode.html#a6b3d146cb22feb18ab880a19892aa01a"> 303</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a6b3d146cb22feb18ab880a19892aa01a">is_few</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <span class="keywordflow">return</span> (node::slotuse <= leaf_slotmin);</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  }</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span> <span class="comment"></span></div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span> <span class="comment"> //! True if node has too few entries.</span></div><div class="line"><a name="l00308"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1LeafNode.html#a161bc176fff45968605cbbf2bb5f4ef9"> 308</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a161bc176fff45968605cbbf2bb5f4ef9">is_underflow</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <span class="keywordflow">return</span> (node::slotuse < leaf_slotmin);</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  }</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span> <span class="comment"></span></div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span> <span class="comment"> //! Set the (key,data) pair in slot. Overloaded function used by</span></div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span> <span class="comment"> //! bulk_load().</span></div><div class="line"><a name="l00314"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1LeafNode.html#ad21aa3c1e3f3defa507cbc89cdd7bd37"> 314</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#ad21aa3c1e3f3defa507cbc89cdd7bd37">set_slot</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot, <span class="keyword">const</span> value_type& value) {</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(slot < node::slotuse);</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  slotdata[slot] = value;</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  }</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  };</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span> <span class="comment"></span></div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span> <span class="comment"></span></div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span> <span class="comment"> //! \name Iterators and Reverse Iterators</span></div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span> <span class="comment"></span></div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1iterator.html">iterator</a>;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1const__iterator.html">const_iterator</a>;</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html">reverse_iterator</a>;</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html">const_reverse_iterator</a>;</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span> <span class="comment"></span></div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span> <span class="comment"> //! STL-like iterator object for B+ tree items. The iterator points to a</span></div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span> <span class="comment"> //! specific slot number in a leaf.</span></div><div class="line"><a name="l00333"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html"> 333</a></span> <span class="comment"></span> <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1iterator.html">iterator</a></div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  {</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  <span class="comment">// *** Types</span></div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span> <span class="comment"></span></div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span> <span class="comment"> //! The key type of the btree. Returned by key().</span></div><div class="line"><a name="l00339"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#a0cc59491125a67abc87e8bfe6a4022c1"> 339</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classtlx_1_1BTree.html#a38ec6d0825c22c2d0ad31f3209ed2d02">BTree::key_type</a> <a class="code" href="classtlx_1_1BTree_1_1iterator.html#a0cc59491125a67abc87e8bfe6a4022c1">key_type</a>;</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span> <span class="comment"></span></div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span> <span class="comment"> //! The value type of the btree. Returned by operator*().</span></div><div class="line"><a name="l00342"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#ae6dd5cb1a04fdb444583ffc0b8a29a5b"> 342</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classtlx_1_1BTree.html#a04f69f8f2936ff309627511179c1709b">BTree::value_type</a> <a class="code" href="classtlx_1_1BTree_1_1iterator.html#ae6dd5cb1a04fdb444583ffc0b8a29a5b">value_type</a>;</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span> <span class="comment"></span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span> <span class="comment"> //! Reference to the value_type. STL required.</span></div><div class="line"><a name="l00345"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#abe8933d436779a43cb5c1896ff5f2918"> 345</a></span> <span class="comment"></span> <span class="keyword">typedef</span> value_type& <a class="code" href="classtlx_1_1BTree_1_1iterator.html#abe8933d436779a43cb5c1896ff5f2918">reference</a>;</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span> <span class="comment"></span></div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span> <span class="comment"> //! Pointer to the value_type. STL required.</span></div><div class="line"><a name="l00348"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#ad25b518036b886d8f35a3c059301d007"> 348</a></span> <span class="comment"></span> <span class="keyword">typedef</span> value_type* <a class="code" href="classtlx_1_1BTree_1_1iterator.html#ad25b518036b886d8f35a3c059301d007">pointer</a>;</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span> <span class="comment"></span></div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span> <span class="comment"> //! STL-magic iterator category</span></div><div class="line"><a name="l00351"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#a1662eef91eb8e828a6ef9ba7651c9c8e"> 351</a></span> <span class="comment"></span> <span class="keyword">typedef</span> std::bidirectional_iterator_tag <a class="code" href="classtlx_1_1BTree_1_1iterator.html#a1662eef91eb8e828a6ef9ba7651c9c8e">iterator_category</a>;</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span> <span class="comment"></span></div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span> <span class="comment"> //! STL-magic</span></div><div class="line"><a name="l00354"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#acf947bbb9e09f863cc3572ff8550b183"> 354</a></span> <span class="comment"></span> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="classtlx_1_1BTree_1_1iterator.html#acf947bbb9e09f863cc3572ff8550b183">difference_type</a>;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span> <span class="comment"></span></div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span> <span class="comment"> //! Our own type</span></div><div class="line"><a name="l00357"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#a1ec9e853a95f3067613572cfc58e3bdf"> 357</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <a class="code" href="classtlx_1_1BTree_1_1iterator.html">iterator</a> <span class="keyword">self</span>;</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span> </div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  <span class="comment">// *** Members</span></div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span> <span class="comment"></span></div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span> <span class="comment"> //! The currently referenced leaf node of the tree</span></div><div class="line"><a name="l00363"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#acfda6b3523d47fd797a150186ab42ef0"> 363</a></span> <span class="comment"></span> <span class="keyword">typename</span> <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html">BTree::LeafNode</a>* <a class="code" href="classtlx_1_1BTree_1_1iterator.html#acfda6b3523d47fd797a150186ab42ef0">curr_leaf</a>;</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span> <span class="comment"></span></div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span> <span class="comment"> //! Current key/data slot referenced</span></div><div class="line"><a name="l00366"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#ae606c9d192f5f681a19b60b19d8f18d2"> 366</a></span> <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="classtlx_1_1BTree_1_1iterator.html#ae606c9d192f5f681a19b60b19d8f18d2">curr_slot</a>;</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span> <span class="comment"></span></div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span> <span class="comment"> //! Friendly to the const_iterator, so it may access the two data items</span></div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span> <span class="comment"> //! directly.</span></div><div class="line"><a name="l00370"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#ac220ce1c155db1ac44146c12d178056f"> 370</a></span> <span class="comment"></span> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1const__iterator.html">const_iterator</a>;</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span> <span class="comment"></span></div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span> <span class="comment"> //! Also friendly to the reverse_iterator, so it may access the two</span></div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span> <span class="comment"> //! data items directly.</span></div><div class="line"><a name="l00374"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#af0a70641f2216cc31420487a62dd3b0d"> 374</a></span> <span class="comment"></span> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html">reverse_iterator</a>;</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span> <span class="comment"></span></div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span> <span class="comment"> //! Also friendly to the const_reverse_iterator, so it may access the</span></div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span> <span class="comment"> //! two data items directly.</span></div><div class="line"><a name="l00378"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#a776e261b45ef26d713a4d105a8d7c240"> 378</a></span> <span class="comment"></span> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html">const_reverse_iterator</a>;</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span> <span class="comment"></span></div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span> <span class="comment"> //! Also friendly to the base btree class, because erase_iter() needs</span></div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span> <span class="comment"> //! to read the curr_leaf and curr_slot values directly.</span></div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span> <span class="comment"></span> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree.html">BTree</a><key_type, value_type, key_of_value, key_compare,</div><div class="line"><a name="l00383"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#a76632aa900e0cb04d12e9e93f34a891d"> 383</a></span>  traits, allow_duplicates, allocator_type>;</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span> </div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="comment">// The macro TLX_BTREE_FRIENDS can be used by outside class to access</span></div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="comment">// the B+ tree internals. This was added for wxBTreeDemo to be able to</span></div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="comment">// draw the tree.</span></div><div class="line"><a name="l00388"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#a38ffbf220e298d1ee8c79307009cfa00"> 388</a></span>  <a class="code" href="classtlx_1_1BTree_1_1iterator.html#a38ffbf220e298d1ee8c79307009cfa00">TLX_BTREE_FRIENDS</a>;</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span> </div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="comment">// *** Methods</span></div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span> <span class="comment"></span></div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span> <span class="comment"> //! Default-Constructor of a mutable iterator</span></div><div class="line"><a name="l00394"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#a67d652c2433cf9217ed2a1485092fdd1"> 394</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree_1_1iterator.html#a67d652c2433cf9217ed2a1485092fdd1">iterator</a>()</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  : curr_leaf(nullptr), curr_slot(0)</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  { }</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span> <span class="comment"></span></div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span> <span class="comment"> //! Initializing-Constructor of a mutable iterator</span></div><div class="line"><a name="l00399"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#af55cd2eba9d655b56966add998d51b37"> 399</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree_1_1iterator.html#af55cd2eba9d655b56966add998d51b37">iterator</a>(<span class="keyword">typename</span> <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html">BTree::LeafNode</a>* l, <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> s)</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  : curr_leaf(l), curr_slot(s)</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  { }</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span> <span class="comment"></span></div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span> <span class="comment"> //! Copy-constructor from a reverse iterator</span></div><div class="line"><a name="l00404"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#a07a8e1622ecf59baab04b1cfeaa869a5"> 404</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree_1_1iterator.html#a07a8e1622ecf59baab04b1cfeaa869a5">iterator</a>(<span class="keyword">const</span> <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html">reverse_iterator</a>& it) <span class="comment">// NOLINT</span></div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  : curr_leaf(it.curr_leaf), curr_slot(it.curr_slot)</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  { }</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span> <span class="comment"></span></div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span> <span class="comment"> //! Dereference the iterator.</span></div><div class="line"><a name="l00409"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#aa149c2249879e7727f33688b76bf2c99"> 409</a></span> <span class="comment"></span> reference operator * ()<span class="keyword"> const </span>{</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <span class="keywordflow">return</span> curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a05e3d86c2442ace4b66c19e28e2a9585">slotdata</a>[curr_slot];</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  }</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span> <span class="comment"></span></div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span> <span class="comment"> //! Dereference the iterator.</span></div><div class="line"><a name="l00414"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#a33ce448509e9cc0d73861e4c1919c7a7"> 414</a></span> <span class="comment"></span> pointer operator -> ()<span class="keyword"> const </span>{</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  <span class="keywordflow">return</span> &curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a05e3d86c2442ace4b66c19e28e2a9585">slotdata</a>[curr_slot];</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  }</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span> <span class="comment"></span></div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span> <span class="comment"> //! Key of the current slot.</span></div><div class="line"><a name="l00419"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#a8ba2b56dfdb5b9beba97bb9ba59ae71b"> 419</a></span> <span class="comment"></span> <span class="keyword">const</span> key_type& <a class="code" href="classtlx_1_1BTree_1_1iterator.html#a8ba2b56dfdb5b9beba97bb9ba59ae71b">key</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <span class="keywordflow">return</span> curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#ab52e5ead4896194d02bf207103be33a8">key</a>(curr_slot);</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  }</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span> <span class="comment"></span></div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span> <span class="comment"> //! Prefix++ advance the iterator to the next slot.</span></div><div class="line"><a name="l00424"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#af1b1c7856a59f34c7d3570f946a2ff00"> 424</a></span> <span class="comment"></span> iterator& operator ++ () {</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <span class="keywordflow">if</span> (curr_slot + 1u < curr_leaf->slotuse) {</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  ++curr_slot;</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  }</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a> != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  curr_leaf = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a>;</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  curr_slot = 0;</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  }</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  <span class="comment">// this is end()</span></div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  curr_slot = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a>;</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  }</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span> </div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  }</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span> <span class="comment"></span></div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span> <span class="comment"> //! Postfix++ advance the iterator to the next slot.</span></div><div class="line"><a name="l00441"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#a538d230f8b52d2bc0950e26ce74ec239"> 441</a></span> <span class="comment"></span> iterator operator ++ (<span class="keywordtype">int</span>) {</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  iterator tmp = *<span class="keyword">this</span>; <span class="comment">// copy ourselves</span></div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span> </div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  <span class="keywordflow">if</span> (curr_slot + 1u < curr_leaf->slotuse) {</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  ++curr_slot;</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  }</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a> != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  curr_leaf = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a>;</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  curr_slot = 0;</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  }</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  <span class="comment">// this is end()</span></div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  curr_slot = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a>;</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  }</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span> </div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <span class="keywordflow">return</span> tmp;</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  }</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span> <span class="comment"></span></div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span> <span class="comment"> //! Prefix-- backstep the iterator to the last slot.</span></div><div class="line"><a name="l00460"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#a340d045d3c8ffaa8fff3b2051a979adf"> 460</a></span> <span class="comment"></span> iterator& operator -- () {</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <span class="keywordflow">if</span> (curr_slot > 0) {</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  --curr_slot;</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  }</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a> != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  curr_leaf = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a>;</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  curr_slot = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a> - 1;</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  }</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <span class="comment">// this is begin()</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  curr_slot = 0;</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  }</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span> </div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  }</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span> <span class="comment"></span></div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span> <span class="comment"> //! Postfix-- backstep the iterator to the last slot.</span></div><div class="line"><a name="l00477"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#a276365c456eb3c21c884ad1282173639"> 477</a></span> <span class="comment"></span> iterator operator -- (<span class="keywordtype">int</span>) {</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  iterator tmp = *<span class="keyword">this</span>; <span class="comment">// copy ourselves</span></div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span> </div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  <span class="keywordflow">if</span> (curr_slot > 0) {</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  --curr_slot;</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  }</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a> != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  curr_leaf = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a>;</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  curr_slot = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a> - 1;</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  }</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  <span class="comment">// this is begin()</span></div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  curr_slot = 0;</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  }</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span> </div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  <span class="keywordflow">return</span> tmp;</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  }</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span> <span class="comment"></span></div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span> <span class="comment"> //! Equality of iterators.</span></div><div class="line"><a name="l00496"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#a3cfb3b6f1a8cae1f3fcfb75f7855619f"> 496</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="group__tlx__container.html#gaaf628430227788d04613cf5ffba32e0c">operator == </a>(<span class="keyword">const</span> iterator& x)<span class="keyword"> const </span>{</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <span class="keywordflow">return</span> (x.<a class="code" href="classtlx_1_1BTree_1_1iterator.html#acfda6b3523d47fd797a150186ab42ef0">curr_leaf</a> == curr_leaf) && (x.<a class="code" href="classtlx_1_1BTree_1_1iterator.html#ae606c9d192f5f681a19b60b19d8f18d2">curr_slot</a> == curr_slot);</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  }</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span> <span class="comment"></span></div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span> <span class="comment"> //! Inequality of iterators.</span></div><div class="line"><a name="l00501"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1iterator.html#add6ad60c15c4e0a4afca833bf6e32143"> 501</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="group__tlx__container.html#ga1eaba1000915c20a97170cf3c0c3d6b4">operator != </a>(<span class="keyword">const</span> iterator& x)<span class="keyword"> const </span>{</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  <span class="keywordflow">return</span> (x.<a class="code" href="classtlx_1_1BTree_1_1iterator.html#acfda6b3523d47fd797a150186ab42ef0">curr_leaf</a> != curr_leaf) || (x.<a class="code" href="classtlx_1_1BTree_1_1iterator.html#ae606c9d192f5f681a19b60b19d8f18d2">curr_slot</a> != curr_slot);</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  }</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  };</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span> <span class="comment"></span></div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span> <span class="comment"> //! STL-like read-only iterator object for B+ tree items. The iterator</span></div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span> <span class="comment"> //! points to a specific slot number in a leaf.</span></div><div class="line"><a name="l00508"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html"> 508</a></span> <span class="comment"></span> <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1const__iterator.html">const_iterator</a></div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  {</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  <span class="comment">// *** Types</span></div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span> <span class="comment"></span></div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span> <span class="comment"> //! The key type of the btree. Returned by key().</span></div><div class="line"><a name="l00514"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#a0cc59491125a67abc87e8bfe6a4022c1"> 514</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classtlx_1_1BTree.html#a38ec6d0825c22c2d0ad31f3209ed2d02">BTree::key_type</a> <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#a0cc59491125a67abc87e8bfe6a4022c1">key_type</a>;</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span> <span class="comment"></span></div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span> <span class="comment"> //! The value type of the btree. Returned by operator*().</span></div><div class="line"><a name="l00517"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#ae6dd5cb1a04fdb444583ffc0b8a29a5b"> 517</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classtlx_1_1BTree.html#a04f69f8f2936ff309627511179c1709b">BTree::value_type</a> <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#ae6dd5cb1a04fdb444583ffc0b8a29a5b">value_type</a>;</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span> <span class="comment"></span></div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span> <span class="comment"> //! Reference to the value_type. STL required.</span></div><div class="line"><a name="l00520"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#aac736176f33ad72afc6ab405b1bf9ecc"> 520</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#aac736176f33ad72afc6ab405b1bf9ecc">reference</a>;</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span> <span class="comment"></span></div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span> <span class="comment"> //! Pointer to the value_type. STL required.</span></div><div class="line"><a name="l00523"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#ac8c12b18f0df60ef52a9ab37752bea63"> 523</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#ac8c12b18f0df60ef52a9ab37752bea63">pointer</a>;</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span> <span class="comment"></span></div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span> <span class="comment"> //! STL-magic iterator category</span></div><div class="line"><a name="l00526"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#a1662eef91eb8e828a6ef9ba7651c9c8e"> 526</a></span> <span class="comment"></span> <span class="keyword">typedef</span> std::bidirectional_iterator_tag <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#a1662eef91eb8e828a6ef9ba7651c9c8e">iterator_category</a>;</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span> <span class="comment"></span></div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span> <span class="comment"> //! STL-magic</span></div><div class="line"><a name="l00529"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#acf947bbb9e09f863cc3572ff8550b183"> 529</a></span> <span class="comment"></span> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#acf947bbb9e09f863cc3572ff8550b183">difference_type</a>;</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span> <span class="comment"></span></div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span> <span class="comment"> //! Our own type</span></div><div class="line"><a name="l00532"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#a9f3227c7f281ca3ffba95549ca2641e2"> 532</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html">const_iterator</a> <span class="keyword">self</span>;</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span> </div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  <span class="comment">// *** Members</span></div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span> <span class="comment"></span></div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span> <span class="comment"> //! The currently referenced leaf node of the tree</span></div><div class="line"><a name="l00538"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#a323e325d694e0d5d9a148d5a49b6cfb1"> 538</a></span> <span class="comment"></span> <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html">BTree::LeafNode</a>* <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#a323e325d694e0d5d9a148d5a49b6cfb1">curr_leaf</a>;</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span> <span class="comment"></span></div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span> <span class="comment"> //! Current key/data slot referenced</span></div><div class="line"><a name="l00541"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#ae606c9d192f5f681a19b60b19d8f18d2"> 541</a></span> <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#ae606c9d192f5f681a19b60b19d8f18d2">curr_slot</a>;</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span> <span class="comment"></span></div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span> <span class="comment"> //! Friendly to the reverse_const_iterator, so it may access the two</span></div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span> <span class="comment"> //! data items directly</span></div><div class="line"><a name="l00545"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#a776e261b45ef26d713a4d105a8d7c240"> 545</a></span> <span class="comment"></span> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html">const_reverse_iterator</a>;</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span> </div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <span class="comment">// The macro TLX_BTREE_FRIENDS can be used by outside class to access</span></div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="comment">// the B+ tree internals. This was added for wxBTreeDemo to be able to</span></div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  <span class="comment">// draw the tree.</span></div><div class="line"><a name="l00550"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#a38ffbf220e298d1ee8c79307009cfa00"> 550</a></span>  <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#a38ffbf220e298d1ee8c79307009cfa00">TLX_BTREE_FRIENDS</a>;</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span> </div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  <span class="comment">// *** Methods</span></div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span> <span class="comment"></span></div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span> <span class="comment"> //! Default-Constructor of a const iterator</span></div><div class="line"><a name="l00556"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#abdefca51d553d29c565b08e091f8cd19"> 556</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#abdefca51d553d29c565b08e091f8cd19">const_iterator</a>()</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  : curr_leaf(nullptr), curr_slot(0)</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  { }</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span> <span class="comment"></span></div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span> <span class="comment"> //! Initializing-Constructor of a const iterator</span></div><div class="line"><a name="l00561"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#afcca858d327994cbceec7568655f75de"> 561</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#afcca858d327994cbceec7568655f75de">const_iterator</a>(<span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html">BTree::LeafNode</a>* l, <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> s)</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  : curr_leaf(l), curr_slot(s)</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  { }</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span> <span class="comment"></span></div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span> <span class="comment"> //! Copy-constructor from a mutable iterator</span></div><div class="line"><a name="l00566"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#ac98e8fc34f4b8b545e534f41df43ea3a"> 566</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#ac98e8fc34f4b8b545e534f41df43ea3a">const_iterator</a>(<span class="keyword">const</span> <a class="code" href="classtlx_1_1BTree_1_1iterator.html">iterator</a>& it) <span class="comment">// NOLINT</span></div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  : curr_leaf(it.curr_leaf), curr_slot(it.curr_slot)</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  { }</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span> <span class="comment"></span></div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span> <span class="comment"> //! Copy-constructor from a mutable reverse iterator</span></div><div class="line"><a name="l00571"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#a0389393ef46862bf253a20ee13ad2ceb"> 571</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#a0389393ef46862bf253a20ee13ad2ceb">const_iterator</a>(<span class="keyword">const</span> <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html">reverse_iterator</a>& it) <span class="comment">// NOLINT</span></div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  : curr_leaf(it.curr_leaf), curr_slot(it.curr_slot)</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  { }</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span> <span class="comment"></span></div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span> <span class="comment"> //! Copy-constructor from a const reverse iterator</span></div><div class="line"><a name="l00576"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#ac10a9353cd631d69889ad6aaaf83c0a8"> 576</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#ac10a9353cd631d69889ad6aaaf83c0a8">const_iterator</a>(<span class="keyword">const</span> <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html">const_reverse_iterator</a>& it) <span class="comment">// NOLINT</span></div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  : curr_leaf(it.curr_leaf), curr_slot(it.curr_slot)</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  { }</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span> <span class="comment"></span></div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span> <span class="comment"> //! Dereference the iterator.</span></div><div class="line"><a name="l00581"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#aa149c2249879e7727f33688b76bf2c99"> 581</a></span> <span class="comment"></span> reference operator * ()<span class="keyword"> const </span>{</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  <span class="keywordflow">return</span> curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a05e3d86c2442ace4b66c19e28e2a9585">slotdata</a>[curr_slot];</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  }</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span> <span class="comment"></span></div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span> <span class="comment"> //! Dereference the iterator.</span></div><div class="line"><a name="l00586"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#a33ce448509e9cc0d73861e4c1919c7a7"> 586</a></span> <span class="comment"></span> pointer operator -> ()<span class="keyword"> const </span>{</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <span class="keywordflow">return</span> &curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a05e3d86c2442ace4b66c19e28e2a9585">slotdata</a>[curr_slot];</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  }</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span> <span class="comment"></span></div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span> <span class="comment"> //! Key of the current slot.</span></div><div class="line"><a name="l00591"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#a8ba2b56dfdb5b9beba97bb9ba59ae71b"> 591</a></span> <span class="comment"></span> <span class="keyword">const</span> key_type& <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#a8ba2b56dfdb5b9beba97bb9ba59ae71b">key</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  <span class="keywordflow">return</span> curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#ab52e5ead4896194d02bf207103be33a8">key</a>(curr_slot);</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  }</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span> <span class="comment"></span></div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span> <span class="comment"> //! Prefix++ advance the iterator to the next slot.</span></div><div class="line"><a name="l00596"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#ad5a73e69afab11500e7c48e766bc869e"> 596</a></span> <span class="comment"></span> const_iterator& operator ++ () {</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  <span class="keywordflow">if</span> (curr_slot + 1u < curr_leaf->slotuse) {</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  ++curr_slot;</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  }</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a> != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  curr_leaf = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a>;</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  curr_slot = 0;</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  }</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  <span class="comment">// this is end()</span></div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  curr_slot = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a>;</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  }</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span> </div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  }</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span> <span class="comment"></span></div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span> <span class="comment"> //! Postfix++ advance the iterator to the next slot.</span></div><div class="line"><a name="l00613"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#a644114c330bd0e27ee08a7e1087beaef"> 613</a></span> <span class="comment"></span> const_iterator operator ++ (<span class="keywordtype">int</span>) {</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  const_iterator tmp = *<span class="keyword">this</span>; <span class="comment">// copy ourselves</span></div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span> </div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  <span class="keywordflow">if</span> (curr_slot + 1u < curr_leaf->slotuse) {</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  ++curr_slot;</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  }</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a> != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  curr_leaf = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a>;</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  curr_slot = 0;</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  }</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  <span class="comment">// this is end()</span></div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  curr_slot = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a>;</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  }</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span> </div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  <span class="keywordflow">return</span> tmp;</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  }</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span> <span class="comment"></span></div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span> <span class="comment"> //! Prefix-- backstep the iterator to the last slot.</span></div><div class="line"><a name="l00632"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#a68cddae987349286dd9471b9a78386bc"> 632</a></span> <span class="comment"></span> const_iterator& operator -- () {</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  <span class="keywordflow">if</span> (curr_slot > 0) {</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  --curr_slot;</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  }</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a> != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  curr_leaf = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a>;</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  curr_slot = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a> - 1;</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  }</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  <span class="comment">// this is begin()</span></div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  curr_slot = 0;</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  }</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span> </div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  }</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span> <span class="comment"></span></div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span> <span class="comment"> //! Postfix-- backstep the iterator to the last slot.</span></div><div class="line"><a name="l00649"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#a747ea3cdff0c21af60c79cb0e8202b50"> 649</a></span> <span class="comment"></span> const_iterator operator -- (<span class="keywordtype">int</span>) {</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  const_iterator tmp = *<span class="keyword">this</span>; <span class="comment">// copy ourselves</span></div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span> </div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  <span class="keywordflow">if</span> (curr_slot > 0) {</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  --curr_slot;</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  }</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a> != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  curr_leaf = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a>;</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  curr_slot = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a> - 1;</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  }</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  <span class="comment">// this is begin()</span></div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  curr_slot = 0;</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  }</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span> </div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  <span class="keywordflow">return</span> tmp;</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  }</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span> <span class="comment"></span></div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span> <span class="comment"> //! Equality of iterators.</span></div><div class="line"><a name="l00668"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#a737b24366e00158c2d5b99ab327a2ed4"> 668</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="group__tlx__container.html#gaaf628430227788d04613cf5ffba32e0c">operator == </a>(<span class="keyword">const</span> const_iterator& x)<span class="keyword"> const </span>{</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <span class="keywordflow">return</span> (x.<a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#a323e325d694e0d5d9a148d5a49b6cfb1">curr_leaf</a> == curr_leaf) && (x.<a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#ae606c9d192f5f681a19b60b19d8f18d2">curr_slot</a> == curr_slot);</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  }</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span> <span class="comment"></span></div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span> <span class="comment"> //! Inequality of iterators.</span></div><div class="line"><a name="l00673"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__iterator.html#a7596decd2596dee82f424732176d113d"> 673</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="group__tlx__container.html#ga1eaba1000915c20a97170cf3c0c3d6b4">operator != </a>(<span class="keyword">const</span> const_iterator& x)<span class="keyword"> const </span>{</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  <span class="keywordflow">return</span> (x.<a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#a323e325d694e0d5d9a148d5a49b6cfb1">curr_leaf</a> != curr_leaf) || (x.<a class="code" href="classtlx_1_1BTree_1_1const__iterator.html#ae606c9d192f5f681a19b60b19d8f18d2">curr_slot</a> != curr_slot);</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  }</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  };</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span> <span class="comment"></span></div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span> <span class="comment"> //! STL-like mutable reverse iterator object for B+ tree items. The</span></div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span> <span class="comment"> //! iterator points to a specific slot number in a leaf.</span></div><div class="line"><a name="l00680"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html"> 680</a></span> <span class="comment"></span> <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html">reverse_iterator</a></div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  {</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  <span class="comment">// *** Types</span></div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span> <span class="comment"></span></div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span> <span class="comment"> //! The key type of the btree. Returned by key().</span></div><div class="line"><a name="l00686"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#a0cc59491125a67abc87e8bfe6a4022c1"> 686</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classtlx_1_1BTree.html#a38ec6d0825c22c2d0ad31f3209ed2d02">BTree::key_type</a> <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#a0cc59491125a67abc87e8bfe6a4022c1">key_type</a>;</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span> <span class="comment"></span></div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span> <span class="comment"> //! The value type of the btree. Returned by operator*().</span></div><div class="line"><a name="l00689"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#ae6dd5cb1a04fdb444583ffc0b8a29a5b"> 689</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classtlx_1_1BTree.html#a04f69f8f2936ff309627511179c1709b">BTree::value_type</a> <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#ae6dd5cb1a04fdb444583ffc0b8a29a5b">value_type</a>;</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span> <span class="comment"></span></div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span> <span class="comment"> //! Reference to the value_type. STL required.</span></div><div class="line"><a name="l00692"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#abe8933d436779a43cb5c1896ff5f2918"> 692</a></span> <span class="comment"></span> <span class="keyword">typedef</span> value_type& <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#abe8933d436779a43cb5c1896ff5f2918">reference</a>;</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span> <span class="comment"></span></div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span> <span class="comment"> //! Pointer to the value_type. STL required.</span></div><div class="line"><a name="l00695"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#ad25b518036b886d8f35a3c059301d007"> 695</a></span> <span class="comment"></span> <span class="keyword">typedef</span> value_type* <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#ad25b518036b886d8f35a3c059301d007">pointer</a>;</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span> <span class="comment"></span></div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span> <span class="comment"> //! STL-magic iterator category</span></div><div class="line"><a name="l00698"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#a1662eef91eb8e828a6ef9ba7651c9c8e"> 698</a></span> <span class="comment"></span> <span class="keyword">typedef</span> std::bidirectional_iterator_tag <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#a1662eef91eb8e828a6ef9ba7651c9c8e">iterator_category</a>;</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span> <span class="comment"></span></div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span> <span class="comment"> //! STL-magic</span></div><div class="line"><a name="l00701"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#acf947bbb9e09f863cc3572ff8550b183"> 701</a></span> <span class="comment"></span> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#acf947bbb9e09f863cc3572ff8550b183">difference_type</a>;</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span> <span class="comment"></span></div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span> <span class="comment"> //! Our own type</span></div><div class="line"><a name="l00704"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#a40a59b495e5625b9a427109029353311"> 704</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html">reverse_iterator</a> <span class="keyword">self</span>;</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span> </div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  <span class="comment">// *** Members</span></div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span> <span class="comment"></span></div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span> <span class="comment"> //! The currently referenced leaf node of the tree</span></div><div class="line"><a name="l00710"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#acfda6b3523d47fd797a150186ab42ef0"> 710</a></span> <span class="comment"></span> <span class="keyword">typename</span> <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html">BTree::LeafNode</a>* <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#acfda6b3523d47fd797a150186ab42ef0">curr_leaf</a>;</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span> <span class="comment"></span></div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span> <span class="comment"> //! One slot past the current key/data slot referenced.</span></div><div class="line"><a name="l00713"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#ae606c9d192f5f681a19b60b19d8f18d2"> 713</a></span> <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#ae606c9d192f5f681a19b60b19d8f18d2">curr_slot</a>;</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span> <span class="comment"></span></div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span> <span class="comment"> //! Friendly to the const_iterator, so it may access the two data items</span></div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span> <span class="comment"> //! directly</span></div><div class="line"><a name="l00717"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#a67171474c4da6cc8efe0c7fafefd2b2d"> 717</a></span> <span class="comment"></span> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1iterator.html">iterator</a>;</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span> <span class="comment"></span></div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span> <span class="comment"> //! Also friendly to the const_iterator, so it may access the two data</span></div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span> <span class="comment"> //! items directly</span></div><div class="line"><a name="l00721"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#ac220ce1c155db1ac44146c12d178056f"> 721</a></span> <span class="comment"></span> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1const__iterator.html">const_iterator</a>;</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span> <span class="comment"></span></div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span> <span class="comment"> //! Also friendly to the const_iterator, so it may access the two data</span></div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span> <span class="comment"> //! items directly</span></div><div class="line"><a name="l00725"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#a776e261b45ef26d713a4d105a8d7c240"> 725</a></span> <span class="comment"></span> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html">const_reverse_iterator</a>;</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span> </div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <span class="comment">// The macro TLX_BTREE_FRIENDS can be used by outside class to access</span></div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  <span class="comment">// the B+ tree internals. This was added for wxBTreeDemo to be able to</span></div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  <span class="comment">// draw the tree.</span></div><div class="line"><a name="l00730"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#a38ffbf220e298d1ee8c79307009cfa00"> 730</a></span>  <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#a38ffbf220e298d1ee8c79307009cfa00">TLX_BTREE_FRIENDS</a>;</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span> </div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  <span class="comment">// *** Methods</span></div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span> <span class="comment"></span></div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span> <span class="comment"> //! Default-Constructor of a reverse iterator</span></div><div class="line"><a name="l00736"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#ab01a64ad14e5dad8394b204fba8c41ad"> 736</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#ab01a64ad14e5dad8394b204fba8c41ad">reverse_iterator</a>()</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  : curr_leaf(nullptr), curr_slot(0)</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  { }</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span> <span class="comment"></span></div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span> <span class="comment"> //! Initializing-Constructor of a mutable reverse iterator</span></div><div class="line"><a name="l00741"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#a934db568e9cc178d05533b6a5a255b5f"> 741</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#a934db568e9cc178d05533b6a5a255b5f">reverse_iterator</a>(<span class="keyword">typename</span> <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html">BTree::LeafNode</a>* l, <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> s)</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  : curr_leaf(l), curr_slot(s)</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  { }</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span> <span class="comment"></span></div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span> <span class="comment"> //! Copy-constructor from a mutable iterator</span></div><div class="line"><a name="l00746"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#a3c958f85bfb6214a0fdad8da08c04aab"> 746</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#a3c958f85bfb6214a0fdad8da08c04aab">reverse_iterator</a>(<span class="keyword">const</span> <a class="code" href="classtlx_1_1BTree_1_1iterator.html">iterator</a>& it) <span class="comment">// NOLINT</span></div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  : curr_leaf(it.curr_leaf), curr_slot(it.curr_slot)</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  { }</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span> <span class="comment"></span></div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span> <span class="comment"> //! Dereference the iterator.</span></div><div class="line"><a name="l00751"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#aa149c2249879e7727f33688b76bf2c99"> 751</a></span> <span class="comment"></span> reference operator * ()<span class="keyword"> const </span>{</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(curr_slot > 0);</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  <span class="keywordflow">return</span> curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a05e3d86c2442ace4b66c19e28e2a9585">slotdata</a>[curr_slot - 1];</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  }</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span> <span class="comment"></span></div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span> <span class="comment"> //! Dereference the iterator.</span></div><div class="line"><a name="l00757"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#a33ce448509e9cc0d73861e4c1919c7a7"> 757</a></span> <span class="comment"></span> pointer operator -> ()<span class="keyword"> const </span>{</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(curr_slot > 0);</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  <span class="keywordflow">return</span> &curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a05e3d86c2442ace4b66c19e28e2a9585">slotdata</a>[curr_slot - 1];</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  }</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span> <span class="comment"></span></div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span> <span class="comment"> //! Key of the current slot.</span></div><div class="line"><a name="l00763"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#a8ba2b56dfdb5b9beba97bb9ba59ae71b"> 763</a></span> <span class="comment"></span> <span class="keyword">const</span> key_type& <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#a8ba2b56dfdb5b9beba97bb9ba59ae71b">key</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(curr_slot > 0);</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  <span class="keywordflow">return</span> curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#ab52e5ead4896194d02bf207103be33a8">key</a>(curr_slot - 1);</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  }</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span> <span class="comment"></span></div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span> <span class="comment"> //! Prefix++ advance the iterator to the next slot.</span></div><div class="line"><a name="l00769"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#a44839df34adfadbdbab52e110f164aa9"> 769</a></span> <span class="comment"></span> reverse_iterator& operator ++ () {</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  <span class="keywordflow">if</span> (curr_slot > 1) {</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  --curr_slot;</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  }</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a> != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  curr_leaf = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a>;</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  curr_slot = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a>;</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  }</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  <span class="comment">// this is begin() == rend()</span></div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  curr_slot = 0;</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  }</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span> </div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  }</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span> <span class="comment"></span></div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span> <span class="comment"> //! Postfix++ advance the iterator to the next slot.</span></div><div class="line"><a name="l00786"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#a17b1033b82bf77fe740797e64fa9f05f"> 786</a></span> <span class="comment"></span> reverse_iterator operator ++ (<span class="keywordtype">int</span>) {</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  reverse_iterator tmp = *<span class="keyword">this</span>; <span class="comment">// copy ourselves</span></div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span> </div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  <span class="keywordflow">if</span> (curr_slot > 1) {</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  --curr_slot;</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  }</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a> != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  curr_leaf = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a>;</div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  curr_slot = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a>;</div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  }</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  <span class="comment">// this is begin() == rend()</span></div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  curr_slot = 0;</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  }</div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span> </div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  <span class="keywordflow">return</span> tmp;</div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  }</div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span> <span class="comment"></span></div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span> <span class="comment"> //! Prefix-- backstep the iterator to the last slot.</span></div><div class="line"><a name="l00805"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#aa0dba13fdc2b27b068b71a3f4c0009df"> 805</a></span> <span class="comment"></span> reverse_iterator& operator -- () {</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span>  <span class="keywordflow">if</span> (curr_slot < curr_leaf->slotuse) {</div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  ++curr_slot;</div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  }</div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a> != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  curr_leaf = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a>;</div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span>  curr_slot = 1;</div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span>  }</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  <span class="comment">// this is end() == rbegin()</span></div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  curr_slot = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a>;</div><div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  }</div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span> </div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span>  }</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span> <span class="comment"></span></div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span> <span class="comment"> //! Postfix-- backstep the iterator to the last slot.</span></div><div class="line"><a name="l00822"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#aa49a6913c1ceb2d112f464ef7a981e35"> 822</a></span> <span class="comment"></span> reverse_iterator operator -- (<span class="keywordtype">int</span>) {</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  reverse_iterator tmp = *<span class="keyword">this</span>; <span class="comment">// copy ourselves</span></div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span> </div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  <span class="keywordflow">if</span> (curr_slot < curr_leaf->slotuse) {</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  ++curr_slot;</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  }</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a> != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  curr_leaf = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a>;</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  curr_slot = 1;</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  }</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  <span class="comment">// this is end() == rbegin()</span></div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  curr_slot = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a>;</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  }</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span> </div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  <span class="keywordflow">return</span> tmp;</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  }</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span> <span class="comment"></span></div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span> <span class="comment"> //! Equality of iterators.</span></div><div class="line"><a name="l00841"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#a73f9c45717d5fbaa522259c4953230e0"> 841</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="group__tlx__container.html#gaaf628430227788d04613cf5ffba32e0c">operator == </a>(<span class="keyword">const</span> reverse_iterator& x)<span class="keyword"> const </span>{</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span>  <span class="keywordflow">return</span> (x.<a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#acfda6b3523d47fd797a150186ab42ef0">curr_leaf</a> == curr_leaf) && (x.<a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#ae606c9d192f5f681a19b60b19d8f18d2">curr_slot</a> == curr_slot);</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  }</div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span> <span class="comment"></span></div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span> <span class="comment"> //! Inequality of iterators.</span></div><div class="line"><a name="l00846"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1reverse__iterator.html#a40a837b9a942732509c5b5bdb4c41cc2"> 846</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="group__tlx__container.html#ga1eaba1000915c20a97170cf3c0c3d6b4">operator != </a>(<span class="keyword">const</span> reverse_iterator& x)<span class="keyword"> const </span>{</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  <span class="keywordflow">return</span> (x.<a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#acfda6b3523d47fd797a150186ab42ef0">curr_leaf</a> != curr_leaf) || (x.<a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html#ae606c9d192f5f681a19b60b19d8f18d2">curr_slot</a> != curr_slot);</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  }</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  };</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span> <span class="comment"></span></div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span> <span class="comment"> //! STL-like read-only reverse iterator object for B+ tree items. The</span></div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span> <span class="comment"> //! iterator points to a specific slot number in a leaf.</span></div><div class="line"><a name="l00853"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html"> 853</a></span> <span class="comment"></span> <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html">const_reverse_iterator</a></div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  {</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  <span class="comment">// *** Types</span></div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span> <span class="comment"></span></div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span> <span class="comment"> //! The key type of the btree. Returned by key().</span></div><div class="line"><a name="l00859"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a0cc59491125a67abc87e8bfe6a4022c1"> 859</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classtlx_1_1BTree.html#a38ec6d0825c22c2d0ad31f3209ed2d02">BTree::key_type</a> <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a0cc59491125a67abc87e8bfe6a4022c1">key_type</a>;</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span> <span class="comment"></span></div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span> <span class="comment"> //! The value type of the btree. Returned by operator*().</span></div><div class="line"><a name="l00862"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#ae6dd5cb1a04fdb444583ffc0b8a29a5b"> 862</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classtlx_1_1BTree.html#a04f69f8f2936ff309627511179c1709b">BTree::value_type</a> <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#ae6dd5cb1a04fdb444583ffc0b8a29a5b">value_type</a>;</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span> <span class="comment"></span></div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span> <span class="comment"> //! Reference to the value_type. STL required.</span></div><div class="line"><a name="l00865"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#aac736176f33ad72afc6ab405b1bf9ecc"> 865</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#aac736176f33ad72afc6ab405b1bf9ecc">reference</a>;</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span> <span class="comment"></span></div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span> <span class="comment"> //! Pointer to the value_type. STL required.</span></div><div class="line"><a name="l00868"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#ac8c12b18f0df60ef52a9ab37752bea63"> 868</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#ac8c12b18f0df60ef52a9ab37752bea63">pointer</a>;</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span> <span class="comment"></span></div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span> <span class="comment"> //! STL-magic iterator category</span></div><div class="line"><a name="l00871"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a1662eef91eb8e828a6ef9ba7651c9c8e"> 871</a></span> <span class="comment"></span> <span class="keyword">typedef</span> std::bidirectional_iterator_tag <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a1662eef91eb8e828a6ef9ba7651c9c8e">iterator_category</a>;</div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span> <span class="comment"></span></div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span> <span class="comment"> //! STL-magic</span></div><div class="line"><a name="l00874"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#acf947bbb9e09f863cc3572ff8550b183"> 874</a></span> <span class="comment"></span> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#acf947bbb9e09f863cc3572ff8550b183">difference_type</a>;</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span> <span class="comment"></span></div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span> <span class="comment"> //! Our own type</span></div><div class="line"><a name="l00877"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a50d4a488fb3ac8ae0551ec72a8336c63"> 877</a></span> <span class="comment"></span> <span class="keyword">typedef</span> <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html">const_reverse_iterator</a> <span class="keyword">self</span>;</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span> </div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  <span class="keyword">private</span>:</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  <span class="comment">// *** Members</span></div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span> <span class="comment"></span></div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span> <span class="comment"> //! The currently referenced leaf node of the tree</span></div><div class="line"><a name="l00883"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a323e325d694e0d5d9a148d5a49b6cfb1"> 883</a></span> <span class="comment"></span> <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html">BTree::LeafNode</a>* <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a323e325d694e0d5d9a148d5a49b6cfb1">curr_leaf</a>;</div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span> <span class="comment"></span></div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span> <span class="comment"> //! One slot past the current key/data slot referenced.</span></div><div class="line"><a name="l00886"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#ae606c9d192f5f681a19b60b19d8f18d2"> 886</a></span> <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#ae606c9d192f5f681a19b60b19d8f18d2">curr_slot</a>;</div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span> <span class="comment"></span></div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span> <span class="comment"> //! Friendly to the const_iterator, so it may access the two data items</span></div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span> <span class="comment"> //! directly.</span></div><div class="line"><a name="l00890"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#af0a70641f2216cc31420487a62dd3b0d"> 890</a></span> <span class="comment"></span> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html">reverse_iterator</a>;</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span> </div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  <span class="comment">// The macro TLX_BTREE_FRIENDS can be used by outside class to access</span></div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  <span class="comment">// the B+ tree internals. This was added for wxBTreeDemo to be able to</span></div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  <span class="comment">// draw the tree.</span></div><div class="line"><a name="l00895"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a38ffbf220e298d1ee8c79307009cfa00"> 895</a></span>  <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a38ffbf220e298d1ee8c79307009cfa00">TLX_BTREE_FRIENDS</a>;</div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span> </div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  <span class="comment">// *** Methods</span></div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span> <span class="comment"></span></div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span> <span class="comment"> //! Default-Constructor of a const reverse iterator.</span></div><div class="line"><a name="l00901"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#abc7de3f9fe46e963548008dbc3b90ba4"> 901</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#abc7de3f9fe46e963548008dbc3b90ba4">const_reverse_iterator</a>()</div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span>  : curr_leaf(nullptr), curr_slot(0)</div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  { }</div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span> <span class="comment"></span></div><div class="line"><a name="l00905"></a><span class="lineno"> 905</span> <span class="comment"> //! Initializing-Constructor of a const reverse iterator.</span></div><div class="line"><a name="l00906"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a5b1fb481931f4bff8175a8fd49a29772"> 906</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a5b1fb481931f4bff8175a8fd49a29772">const_reverse_iterator</a>(</div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  <span class="keyword">const</span> <span class="keyword">typename</span> <a class="code" href="structtlx_1_1BTree_1_1LeafNode.html">BTree::LeafNode</a>* l, <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> s)</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  : curr_leaf(l), curr_slot(s)</div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  { }</div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span> <span class="comment"></span></div><div class="line"><a name="l00911"></a><span class="lineno"> 911</span> <span class="comment"> //! Copy-constructor from a mutable iterator.</span></div><div class="line"><a name="l00912"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#ab511c7c1214ceb7d40235e9eda473909"> 912</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#ab511c7c1214ceb7d40235e9eda473909">const_reverse_iterator</a>(<span class="keyword">const</span> <a class="code" href="classtlx_1_1BTree_1_1iterator.html">iterator</a>& it) <span class="comment">// NOLINT</span></div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  : curr_leaf(it.curr_leaf), curr_slot(it.curr_slot)</div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  { }</div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span> <span class="comment"></span></div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span> <span class="comment"> //! Copy-constructor from a const iterator.</span></div><div class="line"><a name="l00917"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a70c277634333dad40a76ed7e6afc2ba7"> 917</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a70c277634333dad40a76ed7e6afc2ba7">const_reverse_iterator</a>(<span class="keyword">const</span> <a class="code" href="classtlx_1_1BTree_1_1const__iterator.html">const_iterator</a>& it) <span class="comment">// NOLINT</span></div><div class="line"><a name="l00918"></a><span class="lineno"> 918</span>  : curr_leaf(it.curr_leaf), curr_slot(it.curr_slot)</div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  { }</div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span> <span class="comment"></span></div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span> <span class="comment"> //! Copy-constructor from a mutable reverse iterator.</span></div><div class="line"><a name="l00922"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a550e11a4821e11e3f45f99b5b9780152"> 922</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a550e11a4821e11e3f45f99b5b9780152">const_reverse_iterator</a>(<span class="keyword">const</span> <a class="code" href="classtlx_1_1BTree_1_1reverse__iterator.html">reverse_iterator</a>& it) <span class="comment">// NOLINT</span></div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  : curr_leaf(it.curr_leaf), curr_slot(it.curr_slot)</div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  { }</div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span> <span class="comment"></span></div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span> <span class="comment"> //! Dereference the iterator.</span></div><div class="line"><a name="l00927"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#aa149c2249879e7727f33688b76bf2c99"> 927</a></span> <span class="comment"></span> reference operator * ()<span class="keyword"> const </span>{</div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(curr_slot > 0);</div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  <span class="keywordflow">return</span> curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a05e3d86c2442ace4b66c19e28e2a9585">slotdata</a>[curr_slot - 1];</div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  }</div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span> <span class="comment"></span></div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span> <span class="comment"> //! Dereference the iterator.</span></div><div class="line"><a name="l00933"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a33ce448509e9cc0d73861e4c1919c7a7"> 933</a></span> <span class="comment"></span> pointer operator -> ()<span class="keyword"> const </span>{</div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(curr_slot > 0);</div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  <span class="keywordflow">return</span> &curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a05e3d86c2442ace4b66c19e28e2a9585">slotdata</a>[curr_slot - 1];</div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  }</div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span> <span class="comment"></span></div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span> <span class="comment"> //! Key of the current slot.</span></div><div class="line"><a name="l00939"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a8ba2b56dfdb5b9beba97bb9ba59ae71b"> 939</a></span> <span class="comment"></span> <span class="keyword">const</span> key_type& <a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a8ba2b56dfdb5b9beba97bb9ba59ae71b">key</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(curr_slot > 0);</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span>  <span class="keywordflow">return</span> curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#ab52e5ead4896194d02bf207103be33a8">key</a>(curr_slot - 1);</div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  }</div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span> <span class="comment"></span></div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span> <span class="comment"> //! Prefix++ advance the iterator to the previous slot.</span></div><div class="line"><a name="l00945"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#aca9a971053856513232996b24a56cf9d"> 945</a></span> <span class="comment"></span> const_reverse_iterator& operator ++ () {</div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  <span class="keywordflow">if</span> (curr_slot > 1) {</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  --curr_slot;</div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  }</div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a> != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span>  curr_leaf = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a>;</div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  curr_slot = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a>;</div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  }</div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  <span class="comment">// this is begin() == rend()</span></div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  curr_slot = 0;</div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  }</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span> </div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  }</div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span> <span class="comment"></span></div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span> <span class="comment"> //! Postfix++ advance the iterator to the previous slot.</span></div><div class="line"><a name="l00962"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#abee934caa9836c7fa347520e77475047"> 962</a></span> <span class="comment"></span> const_reverse_iterator operator ++ (<span class="keywordtype">int</span>) {</div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  const_reverse_iterator tmp = *<span class="keyword">this</span>; <span class="comment">// copy ourselves</span></div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span> </div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  <span class="keywordflow">if</span> (curr_slot > 1) {</div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  --curr_slot;</div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  }</div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a> != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  curr_leaf = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">prev_leaf</a>;</div><div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  curr_slot = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a>;</div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  }</div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span>  <span class="comment">// this is begin() == rend()</span></div><div class="line"><a name="l00974"></a><span class="lineno"> 974</span>  curr_slot = 0;</div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span>  }</div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span> </div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span>  <span class="keywordflow">return</span> tmp;</div><div class="line"><a name="l00978"></a><span class="lineno"> 978</span>  }</div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span> <span class="comment"></span></div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span> <span class="comment"> //! Prefix-- backstep the iterator to the next slot.</span></div><div class="line"><a name="l00981"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a08bf44acd476097346394c760bc16653"> 981</a></span> <span class="comment"></span> const_reverse_iterator& operator -- () {</div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  <span class="keywordflow">if</span> (curr_slot < curr_leaf->slotuse) {</div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  ++curr_slot;</div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  }</div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a> != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span>  curr_leaf = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a>;</div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  curr_slot = 1;</div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  }</div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  <span class="comment">// this is end() == rbegin()</span></div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  curr_slot = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a>;</div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  }</div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span> </div><div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  }</div><div class="line"><a name="l00996"></a><span class="lineno"> 996</span> <span class="comment"></span></div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span> <span class="comment"> //! Postfix-- backstep the iterator to the next slot.</span></div><div class="line"><a name="l00998"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#afe5c249cd34a82f5fed1760682b160eb"> 998</a></span> <span class="comment"></span> const_reverse_iterator operator -- (<span class="keywordtype">int</span>) {</div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span>  const_reverse_iterator tmp = *<span class="keyword">this</span>; <span class="comment">// copy ourselves</span></div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span> </div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>  <span class="keywordflow">if</span> (curr_slot < curr_leaf->slotuse) {</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  ++curr_slot;</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  }</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a> != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>  curr_leaf = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">next_leaf</a>;</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  curr_slot = 1;</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  }</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  <span class="comment">// this is end() == rbegin()</span></div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  curr_slot = curr_leaf-><a class="code" href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">slotuse</a>;</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  }</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span> </div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  <span class="keywordflow">return</span> tmp;</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  }</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span> <span class="comment"></span></div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span> <span class="comment"> //! Equality of iterators.</span></div><div class="line"><a name="l01017"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a5c7c4696c5fef580a58dffe96e1d82fe"> 1017</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="group__tlx__container.html#gaaf628430227788d04613cf5ffba32e0c">operator == </a>(<span class="keyword">const</span> const_reverse_iterator& x)<span class="keyword"> const </span>{</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  <span class="keywordflow">return</span> (x.<a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a323e325d694e0d5d9a148d5a49b6cfb1">curr_leaf</a> == curr_leaf) && (x.<a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#ae606c9d192f5f681a19b60b19d8f18d2">curr_slot</a> == curr_slot);</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  }</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span> <span class="comment"></span></div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span> <span class="comment"> //! Inequality of iterators.</span></div><div class="line"><a name="l01022"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a619270418fe297d8e798420c2d85af0c"> 1022</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="group__tlx__container.html#ga1eaba1000915c20a97170cf3c0c3d6b4">operator != </a>(<span class="keyword">const</span> const_reverse_iterator& x)<span class="keyword"> const </span>{</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  <span class="keywordflow">return</span> (x.<a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a323e325d694e0d5d9a148d5a49b6cfb1">curr_leaf</a> != curr_leaf) || (x.<a class="code" href="classtlx_1_1BTree_1_1const__reverse__iterator.html#ae606c9d192f5f681a19b60b19d8f18d2">curr_slot</a> != curr_slot);</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>  }</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  };</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span> <span class="comment"></span></div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span> <span class="comment"></span></div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span> <span class="comment"> //! \name Small Statistics Structure</span></div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span> <span class="comment"> /*!</span></div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span> <span class="comment"> * A small struct containing basic statistics about the B+ tree. It can be</span></div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span> <span class="comment"> * fetched using get_stats().</span></div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span> <span class="comment"> */</span></div><div class="line"><a name="l01037"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1tree__stats.html"> 1037</a></span>  <span class="keyword">struct </span><a class="code" href="structtlx_1_1BTree_1_1tree__stats.html">tree_stats</a> {<span class="comment"></span></div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span> <span class="comment"> //! Number of items in the B+ tree</span></div><div class="line"><a name="l01039"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1tree__stats.html#a769e947b7bd053d20cc72d6187e1d0fb"> 1039</a></span> <span class="comment"></span> size_type <a class="code" href="structtlx_1_1BTree_1_1tree__stats.html#a769e947b7bd053d20cc72d6187e1d0fb">size</a>;</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span> <span class="comment"></span></div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span> <span class="comment"> //! Number of leaves in the B+ tree</span></div><div class="line"><a name="l01042"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1tree__stats.html#a3df9010ac682baa68b20e01e5df2be3d"> 1042</a></span> <span class="comment"></span> size_type <a class="code" href="structtlx_1_1BTree_1_1tree__stats.html#a3df9010ac682baa68b20e01e5df2be3d">leaves</a>;</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span> <span class="comment"></span></div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span> <span class="comment"> //! Number of inner nodes in the B+ tree</span></div><div class="line"><a name="l01045"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1tree__stats.html#a33acefd815dae0cce39ba5c792abaa0e"> 1045</a></span> <span class="comment"></span> size_type <a class="code" href="structtlx_1_1BTree_1_1tree__stats.html#a33acefd815dae0cce39ba5c792abaa0e">inner_nodes</a>;</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span> <span class="comment"></span></div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span> <span class="comment"> //! Base B+ tree parameter: The number of key/data slots in each leaf</span></div><div class="line"><a name="l01048"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1tree__stats.html#ab3295b4faf3bbe6f7bf7844ff5e4ed54"> 1048</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> leaf_slots = Self::leaf_slotmax;</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span> <span class="comment"></span></div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span> <span class="comment"> //! Base B+ tree parameter: The number of key slots in each inner node.</span></div><div class="line"><a name="l01051"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1tree__stats.html#a84e520604922b0c0ff7aba4cae768e0d"> 1051</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> inner_slots = Self::inner_slotmax;</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span> <span class="comment"></span></div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span> <span class="comment"> //! Zero initialized</span></div><div class="line"><a name="l01054"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1tree__stats.html#aee390aabd0d5706d9a55d51259151704"> 1054</a></span> <span class="comment"></span> <a class="code" href="structtlx_1_1BTree_1_1tree__stats.html#aee390aabd0d5706d9a55d51259151704">tree_stats</a>()</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  : size(0),</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>  leaves(0), inner_nodes(0)</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>  { }</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span> <span class="comment"></span></div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span> <span class="comment"> //! Return the total number of nodes</span></div><div class="line"><a name="l01060"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1tree__stats.html#a942a7c4c9368b0fa17df9feb4e0dbd74"> 1060</a></span> <span class="comment"></span> size_type <a class="code" href="structtlx_1_1BTree_1_1tree__stats.html#a942a7c4c9368b0fa17df9feb4e0dbd74">nodes</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>  <span class="keywordflow">return</span> inner_nodes + leaves;</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>  }</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span> <span class="comment"></span></div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span> <span class="comment"> //! Return the average fill of leaves</span></div><div class="line"><a name="l01065"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1tree__stats.html#a15e93268f0db30aba3e965bd0be33b02"> 1065</a></span> <span class="comment"></span> <span class="keywordtype">double</span> <a class="code" href="structtlx_1_1BTree_1_1tree__stats.html#a15e93268f0db30aba3e965bd0be33b02">avgfill_leaves</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(size) / (leaves * leaf_slots);</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  }</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  };</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span> <span class="comment"></span></div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span> <span class="comment"></span></div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span> <span class="keyword">private</span>:<span class="comment"></span></div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span> <span class="comment"> //! \name Tree Object Data Members</span></div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span> <span class="comment"> //! Pointer to the B+ tree's root node, either leaf or inner node.</span></div><div class="line"><a name="l01077"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#aebc82407c13a86e9551f7984d2e3d356"> 1077</a></span> <span class="comment"></span> node* <a class="code" href="classtlx_1_1BTree.html#aebc82407c13a86e9551f7984d2e3d356">root_</a>;</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span> <span class="comment"></span></div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span> <span class="comment"> //! Pointer to first leaf in the double linked leaf chain.</span></div><div class="line"><a name="l01080"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a8d6ac34d80de837a5e6125c932f1c288"> 1080</a></span> <span class="comment"></span> LeafNode* <a class="code" href="classtlx_1_1BTree.html#a8d6ac34d80de837a5e6125c932f1c288">head_leaf_</a>;</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span> <span class="comment"></span></div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span> <span class="comment"> //! Pointer to last leaf in the double linked leaf chain.</span></div><div class="line"><a name="l01083"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a6747e195cffb9e4dbceef6a4848b3563"> 1083</a></span> <span class="comment"></span> LeafNode* <a class="code" href="classtlx_1_1BTree.html#a6747e195cffb9e4dbceef6a4848b3563">tail_leaf_</a>;</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span> <span class="comment"></span></div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span> <span class="comment"> //! Other small statistics about the B+ tree.</span></div><div class="line"><a name="l01086"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#aed457b19fc617a12201f09de1d885368"> 1086</a></span> <span class="comment"></span> tree_stats <a class="code" href="classtlx_1_1BTree.html#aed457b19fc617a12201f09de1d885368">stats_</a>;</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span> <span class="comment"></span></div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span> <span class="comment"> //! Key comparison object. More comparison functions are generated from</span></div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span> <span class="comment"> //! this < relation.</span></div><div class="line"><a name="l01090"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a5d945dbdb41ca2fe76d87b2ba122e13e"> 1090</a></span> <span class="comment"></span> key_compare <a class="code" href="classtlx_1_1BTree.html#a5d945dbdb41ca2fe76d87b2ba122e13e">key_less_</a>;</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span> <span class="comment"></span></div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span> <span class="comment"> //! Memory allocator.</span></div><div class="line"><a name="l01093"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a8746da7b8170695c17d760f1a43bd4fe"> 1093</a></span> <span class="comment"></span> allocator_type <a class="code" href="classtlx_1_1BTree.html#a8746da7b8170695c17d760f1a43bd4fe">allocator_</a>;</div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span> <span class="comment"></span></div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span> <span class="comment"></span></div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span> <span class="comment"> //! \name Constructors and Destructor</span></div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span> <span class="comment"> //! Default constructor initializing an empty B+ tree with the standard key</span></div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span> <span class="comment"> //! comparison function.</span></div><div class="line"><a name="l01103"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a6f73c3bb670ec75c0b6910927cf6606b"> 1103</a></span> <span class="comment"></span> <span class="keyword">explicit</span> <a class="code" href="classtlx_1_1BTree.html#a6f73c3bb670ec75c0b6910927cf6606b">BTree</a>(<span class="keyword">const</span> allocator_type& alloc = allocator_type())</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>  : root_(nullptr), head_leaf_(nullptr), tail_leaf_(nullptr),</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>  allocator_(alloc)</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  { }</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span> <span class="comment"></span></div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span> <span class="comment"> //! Constructor initializing an empty B+ tree with a special key</span></div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span> <span class="comment"> //! comparison object.</span></div><div class="line"><a name="l01110"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a8f96f907c281e0c29c4f5129b6cf3169"> 1110</a></span> <span class="comment"></span> <span class="keyword">explicit</span> <a class="code" href="classtlx_1_1BTree.html#a8f96f907c281e0c29c4f5129b6cf3169">BTree</a>(<span class="keyword">const</span> key_compare& kcf,</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  <span class="keyword">const</span> allocator_type& alloc = allocator_type())</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  : root_(nullptr), head_leaf_(nullptr), tail_leaf_(nullptr),</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>  key_less_(kcf), allocator_(alloc)</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>  { }</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span> <span class="comment"></span></div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span> <span class="comment"> //! Constructor initializing a B+ tree with the range [first,last). The</span></div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span> <span class="comment"> //! range need not be sorted. To create a B+ tree from a sorted range, use</span></div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span> <span class="comment"> //! bulk_load().</span></div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span> <span class="comment"></span> <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator></div><div class="line"><a name="l01120"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a6cbb054ada3a2e9ebe4f822f0799b10b"> 1120</a></span>  <a class="code" href="classtlx_1_1BTree.html#a6cbb054ada3a2e9ebe4f822f0799b10b">BTree</a>(InputIterator first, InputIterator last,</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>  <span class="keyword">const</span> allocator_type& alloc = allocator_type())</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>  : root_(nullptr), head_leaf_(nullptr), tail_leaf_(nullptr),</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>  allocator_(alloc) {</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>  insert(first, last);</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>  }</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span> <span class="comment"></span></div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span> <span class="comment"> //! Constructor initializing a B+ tree with the range [first,last) and a</span></div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span> <span class="comment"> //! special key comparison object. The range need not be sorted. To create</span></div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span> <span class="comment"> //! a B+ tree from a sorted range, use bulk_load().</span></div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span> <span class="comment"></span> <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator></div><div class="line"><a name="l01131"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#ad9c4fcb14953cafb848894fccab09ebe"> 1131</a></span>  <a class="code" href="classtlx_1_1BTree.html#ad9c4fcb14953cafb848894fccab09ebe">BTree</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> key_compare& kcf,</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>  <span class="keyword">const</span> allocator_type& alloc = allocator_type())</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>  : root_(nullptr), head_leaf_(nullptr), tail_leaf_(nullptr),</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>  key_less_(kcf), allocator_(alloc) {</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>  insert(first, last);</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>  }</div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span> <span class="comment"></span></div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span> <span class="comment"> //! Frees up all used B+ tree memory pages</span></div><div class="line"><a name="l01139"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#af50bbeb39af1051f057b65da1c71a671"> 1139</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree.html#af50bbeb39af1051f057b65da1c71a671">~BTree</a>() {</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>  clear();</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>  }</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span> <span class="comment"></span></div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span> <span class="comment"> //! Fast swapping of two identical B+ tree objects.</span></div><div class="line"><a name="l01144"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a0c1e04d5d606adc2876b61fafc73c645"> 1144</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classtlx_1_1BTree.html#a0c1e04d5d606adc2876b61fafc73c645">swap</a>(<a class="code" href="classtlx_1_1BTree.html">BTree</a>& from) {</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  <a class="code" href="namespacetlx.html#ade1320658af9846df1831480a96e7a38">std::swap</a>(root_, from.<a class="code" href="classtlx_1_1BTree.html#aebc82407c13a86e9551f7984d2e3d356">root_</a>);</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  <a class="code" href="namespacetlx.html#ade1320658af9846df1831480a96e7a38">std::swap</a>(head_leaf_, from.<a class="code" href="classtlx_1_1BTree.html#a8d6ac34d80de837a5e6125c932f1c288">head_leaf_</a>);</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  <a class="code" href="namespacetlx.html#ade1320658af9846df1831480a96e7a38">std::swap</a>(tail_leaf_, from.<a class="code" href="classtlx_1_1BTree.html#a6747e195cffb9e4dbceef6a4848b3563">tail_leaf_</a>);</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>  <a class="code" href="namespacetlx.html#ade1320658af9846df1831480a96e7a38">std::swap</a>(stats_, from.<a class="code" href="classtlx_1_1BTree.html#aed457b19fc617a12201f09de1d885368">stats_</a>);</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  <a class="code" href="namespacetlx.html#ade1320658af9846df1831480a96e7a38">std::swap</a>(key_less_, from.<a class="code" href="classtlx_1_1BTree.html#a5d945dbdb41ca2fe76d87b2ba122e13e">key_less_</a>);</div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>  <a class="code" href="namespacetlx.html#ade1320658af9846df1831480a96e7a38">std::swap</a>(allocator_, from.<a class="code" href="classtlx_1_1BTree.html#a8746da7b8170695c17d760f1a43bd4fe">allocator_</a>);</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>  }</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span> <span class="comment"></span></div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span> <span class="comment"></span></div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span> <span class="comment"> //! \name Key and Value Comparison Function Objects</span></div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span> <span class="comment"> //! Function class to compare value_type objects. Required by the STL</span></div><div class="line"><a name="l01160"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1value__compare.html"> 1160</a></span> <span class="comment"></span> <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree_1_1value__compare.html">value_compare</a></div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>  {</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>  <span class="keyword">protected</span>:<span class="comment"></span></div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span> <span class="comment"> //! Key comparison function from the template parameter</span></div><div class="line"><a name="l01164"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1value__compare.html#ae7dd7fc42fbc38520d612a82099fdd96"> 1164</a></span> <span class="comment"></span> key_compare <a class="code" href="classtlx_1_1BTree_1_1value__compare.html#ae7dd7fc42fbc38520d612a82099fdd96">key_comp</a>;</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span> <span class="comment"></span></div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span> <span class="comment"> //! Constructor called from BTree::value_comp()</span></div><div class="line"><a name="l01167"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1value__compare.html#a1d76a7c31700f21c3a7ad1b06ef42ab8"> 1167</a></span> <span class="comment"></span> <span class="keyword">explicit</span> <a class="code" href="classtlx_1_1BTree_1_1value__compare.html#a1d76a7c31700f21c3a7ad1b06ef42ab8">value_compare</a>(key_compare kc)</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  : key_comp(kc)</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  { }</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span> <span class="comment"></span></div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span> <span class="comment"> //! Friendly to the btree class so it may call the constructor</span></div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span> <span class="comment"></span> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classtlx_1_1BTree.html">BTree</a><key_type, value_type, key_of_value, key_compare,</div><div class="line"><a name="l01173"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1value__compare.html#a76632aa900e0cb04d12e9e93f34a891d"> 1173</a></span>  traits, allow_duplicates, allocator_type>;</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span> </div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span> <span class="comment"> //! Function call "less"-operator resulting in true if x < y.</span></div><div class="line"><a name="l01177"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree_1_1value__compare.html#a701a6d8be1c63afb3821de036a27c2e0"> 1177</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> operator () (<span class="keyword">const</span> value_type& x, <span class="keyword">const</span> value_type& y)<span class="keyword"> const </span>{</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>  <span class="keywordflow">return</span> key_comp(x.first, y.first);</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>  }</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>  };</div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span> <span class="comment"></span></div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span> <span class="comment"> //! Constant access to the key comparison object sorting the B+ tree.</span></div><div class="line"><a name="l01183"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a62c2add0ee33d7acce9f02077cd1da99"> 1183</a></span> <span class="comment"></span> key_compare <a class="code" href="classtlx_1_1BTree.html#a62c2add0ee33d7acce9f02077cd1da99">key_comp</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>  <span class="keywordflow">return</span> key_less_;</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>  }</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span> <span class="comment"></span></div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span> <span class="comment"> //! Constant access to a constructed value_type comparison object. Required</span></div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span> <span class="comment"> //! by the STL.</span></div><div class="line"><a name="l01189"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#ab42ea149fdde84e56ff0a7ed11e13aa8"> 1189</a></span> <span class="comment"></span> value_compare <a class="code" href="classtlx_1_1BTree.html#ab42ea149fdde84e56ff0a7ed11e13aa8">value_comp</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>  <span class="keywordflow">return</span> value_compare(key_less_);</div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>  }</div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span> <span class="comment"></span></div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span> <span class="comment"></span></div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span> <span class="keyword">private</span>:<span class="comment"></span></div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span> <span class="comment"> //! \name Convenient Key Comparison Functions Generated From key_less</span></div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span> <span class="comment"> //! True if a < b ? "constructed" from key_less_()</span></div><div class="line"><a name="l01200"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a4d396f4c2d232e90fabff194a345a283"> 1200</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="classtlx_1_1BTree.html#a4d396f4c2d232e90fabff194a345a283">key_less</a>(<span class="keyword">const</span> key_type& a, <span class="keyword">const</span> key_type& b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>  <span class="keywordflow">return</span> key_less_(a, b);</div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>  }</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span> <span class="comment"></span></div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span> <span class="comment"> //! True if a <= b ? constructed from key_less()</span></div><div class="line"><a name="l01205"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a25950f60bc42a7b7bbd2fa6e9cecc7f4"> 1205</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="classtlx_1_1BTree.html#a25950f60bc42a7b7bbd2fa6e9cecc7f4">key_lessequal</a>(<span class="keyword">const</span> key_type& a, <span class="keyword">const</span> key_type& b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>  <span class="keywordflow">return</span> !key_less_(b, a);</div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>  }</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span> <span class="comment"></span></div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span> <span class="comment"> //! True if a > b ? constructed from key_less()</span></div><div class="line"><a name="l01210"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a8eeb2fd6ed899b070ade045b4957c2a2"> 1210</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="classtlx_1_1BTree.html#a8eeb2fd6ed899b070ade045b4957c2a2">key_greater</a>(<span class="keyword">const</span> key_type& a, <span class="keyword">const</span> key_type& b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>  <span class="keywordflow">return</span> key_less_(b, a);</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>  }</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span> <span class="comment"></span></div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span> <span class="comment"> //! True if a >= b ? constructed from key_less()</span></div><div class="line"><a name="l01215"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a86ce69542070f80643dee49e06bebf64"> 1215</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="classtlx_1_1BTree.html#a86ce69542070f80643dee49e06bebf64">key_greaterequal</a>(<span class="keyword">const</span> key_type& a, <span class="keyword">const</span> key_type& b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>  <span class="keywordflow">return</span> !key_less_(a, b);</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>  }</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span> <span class="comment"></span></div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span> <span class="comment"> //! True if a == b ? constructed from key_less(). This requires the <</span></div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span> <span class="comment"> //! relation to be a total order, otherwise the B+ tree cannot be sorted.</span></div><div class="line"><a name="l01221"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a117b795a14531e05da974077af0ff76e"> 1221</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="classtlx_1_1BTree.html#a117b795a14531e05da974077af0ff76e">key_equal</a>(<span class="keyword">const</span> key_type& a, <span class="keyword">const</span> key_type& b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>  <span class="keywordflow">return</span> !key_less_(a, b) && !key_less_(b, a);</div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  }</div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span> <span class="comment"></span></div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span> <span class="comment"></span></div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span> <span class="comment"> //! \name Allocators</span></div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span> <span class="comment"> //! Return the base node allocator provided during construction.</span></div><div class="line"><a name="l01232"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#acfbc5374e81f060b1cdffeb9c494ae86"> 1232</a></span> <span class="comment"></span> allocator_type <a class="code" href="classtlx_1_1BTree.html#acfbc5374e81f060b1cdffeb9c494ae86">get_allocator</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  <span class="keywordflow">return</span> allocator_;</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  }</div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span> <span class="comment"></span></div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span> <span class="comment"></span></div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span> <span class="keyword">private</span>:<span class="comment"></span></div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span> <span class="comment"> //! \name Node Object Allocation and Deallocation Functions</span></div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span> <span class="comment"> //! Return an allocator for LeafNode objects.</span></div><div class="line"><a name="l01243"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a353e5a73d56e289c9b48a5bc43e72211"> 1243</a></span> <span class="comment"></span> <span class="keyword">typename</span> LeafNode::alloc_type <a class="code" href="classtlx_1_1BTree.html#a353e5a73d56e289c9b48a5bc43e72211">leaf_node_allocator</a>() {</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>  <span class="keywordflow">return</span> <span class="keyword">typename</span> LeafNode::alloc_type(allocator_);</div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>  }</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span> <span class="comment"></span></div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span> <span class="comment"> //! Return an allocator for InnerNode objects.</span></div><div class="line"><a name="l01248"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a791d570451c392e04774581a7d04707a"> 1248</a></span> <span class="comment"></span> <span class="keyword">typename</span> InnerNode::alloc_type <a class="code" href="classtlx_1_1BTree.html#a791d570451c392e04774581a7d04707a">inner_node_allocator</a>() {</div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>  <span class="keywordflow">return</span> <span class="keyword">typename</span> InnerNode::alloc_type(allocator_);</div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>  }</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span> <span class="comment"></span></div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span> <span class="comment"> //! Allocate and initialize a leaf node</span></div><div class="line"><a name="l01253"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#ab3ac8f3e8366bd3a32709a1fb44e8524"> 1253</a></span> <span class="comment"></span> LeafNode * <a class="code" href="classtlx_1_1BTree.html#ab3ac8f3e8366bd3a32709a1fb44e8524">allocate_leaf</a>() {</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>  LeafNode* n = <span class="keyword">new</span> (leaf_node_allocator().allocate(1)) LeafNode();</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>  n->initialize();</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>  stats_.leaves++;</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  <span class="keywordflow">return</span> n;</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  }</div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span> <span class="comment"></span></div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span> <span class="comment"> //! Allocate and initialize an inner node</span></div><div class="line"><a name="l01261"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#aa75eef3ff50d37f5b6c2eeea491cade1"> 1261</a></span> <span class="comment"></span> InnerNode * <a class="code" href="classtlx_1_1BTree.html#aa75eef3ff50d37f5b6c2eeea491cade1">allocate_inner</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> level) {</div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>  InnerNode* n = <span class="keyword">new</span> (inner_node_allocator().allocate(1)) InnerNode();</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>  n->initialize(level);</div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>  stats_.inner_nodes++;</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>  <span class="keywordflow">return</span> n;</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>  }</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span> <span class="comment"></span></div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span> <span class="comment"> //! Correctly free either inner or leaf node, destructs all contained key</span></div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span> <span class="comment"> //! and value objects.</span></div><div class="line"><a name="l01270"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a12d054d5f2dfa6c0d777e2ceb7e4f89d"> 1270</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classtlx_1_1BTree.html#a12d054d5f2dfa6c0d777e2ceb7e4f89d">free_node</a>(node* n) {</div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>  <span class="keywordflow">if</span> (n->is_leafnode()) {</div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>  LeafNode* ln = <span class="keyword">static_cast<</span>LeafNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>  <span class="keyword">typename</span> LeafNode::alloc_type a(leaf_node_allocator());</div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>  std::allocator_traits<typename LeafNode::alloc_type>::destroy(a, ln);</div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>  std::allocator_traits<typename LeafNode::alloc_type>::deallocate(a, ln, 1);</div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>  stats_.leaves--;</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>  }</div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>  InnerNode* in = <span class="keyword">static_cast<</span>InnerNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>  <span class="keyword">typename</span> InnerNode::alloc_type a(inner_node_allocator());</div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>  std::allocator_traits<typename InnerNode::alloc_type>::destroy(a, in);</div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>  std::allocator_traits<typename InnerNode::alloc_type>::deallocate(a, in, 1);</div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>  stats_.inner_nodes--;</div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>  }</div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>  }</div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span> <span class="comment"></span></div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span> <span class="comment"></span></div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span> <span class="comment"> //! \name Fast Destruction of the B+ Tree</span></div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l01292"></a><span class="lineno"> 1292</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span> <span class="comment"> //! Frees all key/data pairs and all nodes of the tree.</span></div><div class="line"><a name="l01294"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#ac8bb3912a3ce86b15842e79d0b421204"> 1294</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classtlx_1_1BTree.html#ac8bb3912a3ce86b15842e79d0b421204">clear</a>() {</div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>  <span class="keywordflow">if</span> (root_)</div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>  {</div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>  clear_recursive(root_);</div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>  free_node(root_);</div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span> </div><div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>  root_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>  head_leaf_ = tail_leaf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span> </div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>  stats_ = tree_stats();</div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>  }</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span> </div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(stats_.size == 0);</div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>  }</div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span> </div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span> <span class="keyword">private</span>:<span class="comment"></span></div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span> <span class="comment"> //! Recursively free up nodes.</span></div><div class="line"><a name="l01311"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a049ea88e87d1254a65596324d47155ed"> 1311</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classtlx_1_1BTree.html#a049ea88e87d1254a65596324d47155ed">clear_recursive</a>(node* n) {</div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  <span class="keywordflow">if</span> (n->is_leafnode())</div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>  {</div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>  LeafNode* leafnode = <span class="keyword">static_cast<</span>LeafNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span> </div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot < leafnode->slotuse; ++slot)</div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>  {</div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>  <span class="comment">// data objects are deleted by LeafNode's destructor</span></div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>  }</div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>  }</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>  {</div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>  InnerNode* innernode = <span class="keyword">static_cast<</span>InnerNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span> </div><div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot < innernode->slotuse + 1; ++slot)</div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>  {</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>  clear_recursive(innernode->childid[slot]);</div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>  free_node(innernode->childid[slot]);</div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>  }</div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>  }</div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>  }</div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span> <span class="comment"></span></div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span> <span class="comment"></span></div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l01336"></a><span class="lineno"> 1336</span> <span class="comment"> //! \name STL Iterator Construction Functions</span></div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span> <span class="comment"> //! Constructs a read/data-write iterator that points to the first slot in</span></div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span> <span class="comment"> //! the first leaf of the B+ tree.</span></div><div class="line"><a name="l01341"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#ad69bd11391be1a1dba5c8202259664f8"> 1341</a></span> <span class="comment"></span> iterator <a class="code" href="classtlx_1_1BTree.html#ad69bd11391be1a1dba5c8202259664f8">begin</a>() {</div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>  <span class="keywordflow">return</span> iterator(head_leaf_, 0);</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>  }</div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span> <span class="comment"></span></div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span> <span class="comment"> //! Constructs a read/data-write iterator that points to the first invalid</span></div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span> <span class="comment"> //! slot in the last leaf of the B+ tree.</span></div><div class="line"><a name="l01347"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#acad38d52497a975bfb6f2f6acd76631f"> 1347</a></span> <span class="comment"></span> iterator <a class="code" href="classtlx_1_1BTree.html#acad38d52497a975bfb6f2f6acd76631f">end</a>() {</div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  <span class="keywordflow">return</span> iterator(tail_leaf_, tail_leaf_ ? tail_leaf_->slotuse : 0);</div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>  }</div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</span> <span class="comment"></span></div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span> <span class="comment"> //! Constructs a read-only constant iterator that points to the first slot</span></div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span> <span class="comment"> //! in the first leaf of the B+ tree.</span></div><div class="line"><a name="l01353"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#aa4b02d4f1a8500fb07a551069060709f"> 1353</a></span> <span class="comment"></span> const_iterator <a class="code" href="classtlx_1_1BTree.html#aa4b02d4f1a8500fb07a551069060709f">begin</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>  <span class="keywordflow">return</span> const_iterator(head_leaf_, 0);</div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  }</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span> <span class="comment"></span></div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span> <span class="comment"> //! Constructs a read-only constant iterator that points to the first</span></div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span> <span class="comment"> //! invalid slot in the last leaf of the B+ tree.</span></div><div class="line"><a name="l01359"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a350132543d80a1c1e5be844e6d2878ea"> 1359</a></span> <span class="comment"></span> const_iterator <a class="code" href="classtlx_1_1BTree.html#a350132543d80a1c1e5be844e6d2878ea">end</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>  <span class="keywordflow">return</span> const_iterator(tail_leaf_, tail_leaf_ ? tail_leaf_->slotuse : 0);</div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>  }</div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span> <span class="comment"></span></div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span> <span class="comment"> //! Constructs a read/data-write reverse iterator that points to the first</span></div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span> <span class="comment"> //! invalid slot in the last leaf of the B+ tree. Uses STL magic.</span></div><div class="line"><a name="l01365"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#acea44ed500a54b2bb93e16b86e81afa8"> 1365</a></span> <span class="comment"></span> reverse_iterator <a class="code" href="classtlx_1_1BTree.html#acea44ed500a54b2bb93e16b86e81afa8">rbegin</a>() {</div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>  <span class="keywordflow">return</span> reverse_iterator(end());</div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>  }</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span> <span class="comment"></span></div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span> <span class="comment"> //! Constructs a read/data-write reverse iterator that points to the first</span></div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span> <span class="comment"> //! slot in the first leaf of the B+ tree. Uses STL magic.</span></div><div class="line"><a name="l01371"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a68c599ddcbfddc65170de524ac165e44"> 1371</a></span> <span class="comment"></span> reverse_iterator <a class="code" href="classtlx_1_1BTree.html#a68c599ddcbfddc65170de524ac165e44">rend</a>() {</div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  <span class="keywordflow">return</span> reverse_iterator(begin());</div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  }</div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span> <span class="comment"></span></div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span> <span class="comment"> //! Constructs a read-only reverse iterator that points to the first</span></div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span> <span class="comment"> //! invalid slot in the last leaf of the B+ tree. Uses STL magic.</span></div><div class="line"><a name="l01377"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a04886aa70c34d66738e78bf70c675e66"> 1377</a></span> <span class="comment"></span> const_reverse_iterator <a class="code" href="classtlx_1_1BTree.html#a04886aa70c34d66738e78bf70c675e66">rbegin</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>  <span class="keywordflow">return</span> const_reverse_iterator(end());</div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>  }</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span> <span class="comment"></span></div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span> <span class="comment"> //! Constructs a read-only reverse iterator that points to the first slot</span></div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span> <span class="comment"> //! in the first leaf of the B+ tree. Uses STL magic.</span></div><div class="line"><a name="l01383"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#ab3c414470d5cea2986cfab7a90146cb6"> 1383</a></span> <span class="comment"></span> const_reverse_iterator <a class="code" href="classtlx_1_1BTree.html#ab3c414470d5cea2986cfab7a90146cb6">rend</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  <span class="keywordflow">return</span> const_reverse_iterator(begin());</div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  }</div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span> <span class="comment"></span></div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span> <span class="comment"></span></div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span> <span class="keyword">private</span>:<span class="comment"></span></div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span> <span class="comment"> //! \name B+ Tree Node Binary Search Functions</span></div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span> <span class="comment"> //! Searches for the first key in the node n greater or equal to key. Uses</span></div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span> <span class="comment"> //! binary search with an optional linear self-verification. This is a</span></div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span> <span class="comment"> //! template function, because the slotkey array is located at different</span></div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span> <span class="comment"> //! places in LeafNode and InnerNode.</span></div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span> <span class="comment"></span> <span class="keyword">template</span> <<span class="keyword">typename</span> node_type></div><div class="line"><a name="l01398"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a8683ae6c55649dd2c6d909cf618de0a0"> 1398</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="classtlx_1_1BTree.html#a8683ae6c55649dd2c6d909cf618de0a0">find_lower</a>(<span class="keyword">const</span> node_type* n, <span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{</div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>  <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(*n) > traits::binsearch_threshold)</div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>  {</div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>  <span class="keywordflow">if</span> (n->slotuse == 0) <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span> </div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> lo = 0, hi = n->slotuse;</div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span> </div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>  <span class="keywordflow">while</span> (lo < hi)</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>  {</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> mid = (lo + hi) >> 1;</div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span> </div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>  <span class="keywordflow">if</span> (key_lessequal(key, n->key(mid))) {</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>  hi = mid; <span class="comment">// key <= mid</span></div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>  }</div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>  lo = mid + 1; <span class="comment">// key > mid</span></div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>  }</div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  }</div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span> </div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"BTree::find_lower: on "</span> << n <<</div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>  <span class="stringliteral">" key "</span> << key << <span class="stringliteral">" -> "</span> << lo << <span class="stringliteral">" / "</span> << hi);</div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span> </div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>  <span class="comment">// verify result using simple linear search</span></div><div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>  <span class="keywordflow">if</span> (self_verify)</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>  {</div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> i = 0;</div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>  <span class="keywordflow">while</span> (i < n->slotuse && key_less(n->key(i), key)) ++i;</div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span> </div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"BTree::find_lower: testfind: "</span> << i);</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(i == lo);</div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>  }</div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span> </div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>  <span class="keywordflow">return</span> lo;</div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>  }</div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>  <span class="keywordflow">else</span> <span class="comment">// for nodes <= binsearch_threshold do linear search.</span></div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>  {</div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> lo = 0;</div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>  <span class="keywordflow">while</span> (lo < n->slotuse && key_less(n->key(lo), key)) ++lo;</div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>  <span class="keywordflow">return</span> lo;</div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>  }</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  }</div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span> <span class="comment"></span></div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span> <span class="comment"> //! Searches for the first key in the node n greater than key. Uses binary</span></div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span> <span class="comment"> //! search with an optional linear self-verification. This is a template</span></div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span> <span class="comment"> //! function, because the slotkey array is located at different places in</span></div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span> <span class="comment"> //! LeafNode and InnerNode.</span></div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span> <span class="comment"></span> <span class="keyword">template</span> <<span class="keyword">typename</span> node_type></div><div class="line"><a name="l01445"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#ad0a6e56ee5e948ed239abafb7ac4f749"> 1445</a></span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code" href="classtlx_1_1BTree.html#ad0a6e56ee5e948ed239abafb7ac4f749">find_upper</a>(<span class="keyword">const</span> node_type* n, <span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{</div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>  <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(*n) > traits::binsearch_threshold)</div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>  {</div><div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>  <span class="keywordflow">if</span> (n->slotuse == 0) <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span> </div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> lo = 0, hi = n->slotuse;</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span> </div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>  <span class="keywordflow">while</span> (lo < hi)</div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>  {</div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> mid = (lo + hi) >> 1;</div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span> </div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>  <span class="keywordflow">if</span> (key_less(key, n->key(mid))) {</div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>  hi = mid; <span class="comment">// key < mid</span></div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>  }</div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>  lo = mid + 1; <span class="comment">// key >= mid</span></div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>  }</div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>  }</div><div class="line"><a name="l01463"></a><span class="lineno"> 1463</span> </div><div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"BTree::find_upper: on "</span> << n <<</div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>  <span class="stringliteral">" key "</span> << key << <span class="stringliteral">" -> "</span> << lo << <span class="stringliteral">" / "</span> << hi);</div><div class="line"><a name="l01466"></a><span class="lineno"> 1466</span> </div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>  <span class="comment">// verify result using simple linear search</span></div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>  <span class="keywordflow">if</span> (self_verify)</div><div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>  {</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> i = 0;</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>  <span class="keywordflow">while</span> (i < n->slotuse && key_lessequal(n->key(i), key)) ++i;</div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span> </div><div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"BTree::find_upper testfind: "</span> << i);</div><div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(i == hi);</div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>  }</div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span> </div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>  <span class="keywordflow">return</span> lo;</div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>  }</div><div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>  <span class="keywordflow">else</span> <span class="comment">// for nodes <= binsearch_threshold do linear search.</span></div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>  {</div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> lo = 0;</div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>  <span class="keywordflow">while</span> (lo < n->slotuse && key_lessequal(n->key(lo), key)) ++lo;</div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>  <span class="keywordflow">return</span> lo;</div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>  }</div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>  }</div><div class="line"><a name="l01486"></a><span class="lineno"> 1486</span> <span class="comment"></span></div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span> <span class="comment"></span></div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span> <span class="comment"> //! \name Access Functions to the Item Count</span></div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l01492"></a><span class="lineno"> 1492</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span> <span class="comment"> //! Return the number of key/data pairs in the B+ tree</span></div><div class="line"><a name="l01494"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a503ab01f6c0142145d3434f6924714e7"> 1494</a></span> <span class="comment"></span> size_type <a class="code" href="classtlx_1_1BTree.html#a503ab01f6c0142145d3434f6924714e7">size</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>  <span class="keywordflow">return</span> stats_.size;</div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>  }</div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span> <span class="comment"></span></div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span> <span class="comment"> //! Returns true if there is at least one key/data pair in the B+ tree</span></div><div class="line"><a name="l01499"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#ac6e61de369e994009e36f344f99c15ad"> 1499</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="classtlx_1_1BTree.html#ac6e61de369e994009e36f344f99c15ad">empty</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>  <span class="keywordflow">return</span> (size() == size_type(0));</div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>  }</div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span> <span class="comment"></span></div><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span> <span class="comment"> //! Returns the largest possible size of the B+ Tree. This is just a</span></div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span> <span class="comment"> //! function required by the STL standard, the B+ Tree can hold more items.</span></div><div class="line"><a name="l01505"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a0ab5ce862c0331d9e45a6e1774fca131"> 1505</a></span> <span class="comment"></span> size_type <a class="code" href="classtlx_1_1BTree.html#a0ab5ce862c0331d9e45a6e1774fca131">max_size</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>  <span class="keywordflow">return</span> size_type(-1);</div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>  }</div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span> <span class="comment"></span></div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span> <span class="comment"> //! Return a const reference to the current statistics.</span></div><div class="line"><a name="l01510"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a3b5e61b63a8f02f388e295a287aab316"> 1510</a></span> <span class="comment"></span> <span class="keyword">const</span> <span class="keyword">struct </span>tree_stats& <a class="code" href="classtlx_1_1BTree.html#a3b5e61b63a8f02f388e295a287aab316">get_stats</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>  <span class="keywordflow">return</span> stats_;</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>  }</div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span> <span class="comment"></span></div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l01515"></a><span class="lineno"> 1515</span> <span class="comment"></span></div><div class="line"><a name="l01516"></a><span class="lineno"> 1516</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span> <span class="comment"> //! \name STL Access Functions Querying the Tree by Descending to a Leaf</span></div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</span> <span class="comment"> //! Non-STL function checking whether a key is in the B+ tree. The same as</span></div><div class="line"><a name="l01521"></a><span class="lineno"> 1521</span> <span class="comment"> //! (find(k) != end()) or (count() != 0).</span></div><div class="line"><a name="l01522"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a0d3d86d13f26293e1ddcff5569ad1ccb"> 1522</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="classtlx_1_1BTree.html#a0d3d86d13f26293e1ddcff5569ad1ccb">exists</a>(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{</div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>  <span class="keyword">const</span> node* n = root_;</div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>  <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span> </div><div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>  <span class="keywordflow">while</span> (!n->is_leafnode())</div><div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>  {</div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>  <span class="keyword">const</span> InnerNode* inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>InnerNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(inner, key);</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span> </div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>  n = inner->childid[slot];</div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>  }</div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span> </div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>  <span class="keyword">const</span> LeafNode* leaf = <span class="keyword">static_cast<</span><span class="keyword">const </span>LeafNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</span> </div><div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(leaf, key);</div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>  <span class="keywordflow">return</span> (slot < leaf->slotuse && key_equal(key, leaf->key(slot)));</div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>  }</div><div class="line"><a name="l01539"></a><span class="lineno"> 1539</span> <span class="comment"></span></div><div class="line"><a name="l01540"></a><span class="lineno"> 1540</span> <span class="comment"> //! Tries to locate a key in the B+ tree and returns an iterator to the</span></div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span> <span class="comment"> //! key/data slot if found. If unsuccessful it returns end().</span></div><div class="line"><a name="l01542"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a9c9766a96c492f3e9e5861d6b4f87387"> 1542</a></span> <span class="comment"></span> iterator <a class="code" href="classtlx_1_1BTree.html#a9c9766a96c492f3e9e5861d6b4f87387">find</a>(<span class="keyword">const</span> key_type& key) {</div><div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>  node* n = root_;</div><div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>  <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> end();</div><div class="line"><a name="l01545"></a><span class="lineno"> 1545</span> </div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>  <span class="keywordflow">while</span> (!n->is_leafnode())</div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>  {</div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>  <span class="keyword">const</span> InnerNode* inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>InnerNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(inner, key);</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span> </div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>  n = inner->childid[slot];</div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>  }</div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span> </div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>  LeafNode* leaf = <span class="keyword">static_cast<</span>LeafNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01555"></a><span class="lineno"> 1555</span> </div><div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(leaf, key);</div><div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>  <span class="keywordflow">return</span> (slot < leaf->slotuse && key_equal(key, leaf->key(slot)))</div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>  ? iterator(leaf, slot) : end();</div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>  }</div><div class="line"><a name="l01560"></a><span class="lineno"> 1560</span> <span class="comment"></span></div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span> <span class="comment"> //! Tries to locate a key in the B+ tree and returns an constant iterator to</span></div><div class="line"><a name="l01562"></a><span class="lineno"> 1562</span> <span class="comment"> //! the key/data slot if found. If unsuccessful it returns end().</span></div><div class="line"><a name="l01563"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#adc204502ef1606c9daa4a613da6aacfb"> 1563</a></span> <span class="comment"></span> const_iterator <a class="code" href="classtlx_1_1BTree.html#adc204502ef1606c9daa4a613da6aacfb">find</a>(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{</div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>  <span class="keyword">const</span> node* n = root_;</div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>  <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> end();</div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span> </div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>  <span class="keywordflow">while</span> (!n->is_leafnode())</div><div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>  {</div><div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>  <span class="keyword">const</span> InnerNode* inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>InnerNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(inner, key);</div><div class="line"><a name="l01571"></a><span class="lineno"> 1571</span> </div><div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>  n = inner->childid[slot];</div><div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>  }</div><div class="line"><a name="l01574"></a><span class="lineno"> 1574</span> </div><div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>  <span class="keyword">const</span> LeafNode* leaf = <span class="keyword">static_cast<</span><span class="keyword">const </span>LeafNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span> </div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(leaf, key);</div><div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>  <span class="keywordflow">return</span> (slot < leaf->slotuse && key_equal(key, leaf->key(slot)))</div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>  ? const_iterator(leaf, slot) : end();</div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>  }</div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span> <span class="comment"></span></div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span> <span class="comment"> //! Tries to locate a key in the B+ tree and returns the number of identical</span></div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span> <span class="comment"> //! key entries found.</span></div><div class="line"><a name="l01584"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#addd4e2b6ff9c7bef508bc908caabb2d4"> 1584</a></span> <span class="comment"></span> size_type <a class="code" href="classtlx_1_1BTree.html#addd4e2b6ff9c7bef508bc908caabb2d4">count</a>(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{</div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>  <span class="keyword">const</span> node* n = root_;</div><div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>  <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span> </div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>  <span class="keywordflow">while</span> (!n->is_leafnode())</div><div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>  {</div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>  <span class="keyword">const</span> InnerNode* inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>InnerNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(inner, key);</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span> </div><div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>  n = inner->childid[slot];</div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>  }</div><div class="line"><a name="l01595"></a><span class="lineno"> 1595</span> </div><div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>  <span class="keyword">const</span> LeafNode* leaf = <span class="keyword">static_cast<</span><span class="keyword">const </span>LeafNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01597"></a><span class="lineno"> 1597</span> </div><div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(leaf, key);</div><div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>  size_type num = 0;</div><div class="line"><a name="l01600"></a><span class="lineno"> 1600</span> </div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>  <span class="keywordflow">while</span> (leaf && slot < leaf->slotuse && key_equal(key, leaf->key(slot)))</div><div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>  {</div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>  ++num;</div><div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>  <span class="keywordflow">if</span> (++slot >= leaf->slotuse)</div><div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>  {</div><div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>  leaf = leaf->next_leaf;</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>  slot = 0;</div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>  }</div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>  }</div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span> </div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>  <span class="keywordflow">return</span> num;</div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>  }</div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</span> <span class="comment"></span></div><div class="line"><a name="l01614"></a><span class="lineno"> 1614</span> <span class="comment"> //! Searches the B+ tree and returns an iterator to the first pair equal to</span></div><div class="line"><a name="l01615"></a><span class="lineno"> 1615</span> <span class="comment"> //! or greater than key, or end() if all keys are smaller.</span></div><div class="line"><a name="l01616"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a373c61cca9b31735f4548b5b59b70184"> 1616</a></span> <span class="comment"></span> iterator <a class="code" href="classtlx_1_1BTree.html#a373c61cca9b31735f4548b5b59b70184">lower_bound</a>(<span class="keyword">const</span> key_type& key) {</div><div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>  node* n = root_;</div><div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>  <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> end();</div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span> </div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>  <span class="keywordflow">while</span> (!n->is_leafnode())</div><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>  {</div><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>  <span class="keyword">const</span> InnerNode* inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>InnerNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(inner, key);</div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span> </div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>  n = inner->childid[slot];</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>  }</div><div class="line"><a name="l01627"></a><span class="lineno"> 1627</span> </div><div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>  LeafNode* leaf = <span class="keyword">static_cast<</span>LeafNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span> </div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(leaf, key);</div><div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>  <span class="keywordflow">return</span> iterator(leaf, slot);</div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>  }</div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span> <span class="comment"></span></div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span> <span class="comment"> //! Searches the B+ tree and returns a constant iterator to the first pair</span></div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span> <span class="comment"> //! equal to or greater than key, or end() if all keys are smaller.</span></div><div class="line"><a name="l01636"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a31fbffbdf311ce68ec99f0aebab5c0ea"> 1636</a></span> <span class="comment"></span> const_iterator <a class="code" href="classtlx_1_1BTree.html#a31fbffbdf311ce68ec99f0aebab5c0ea">lower_bound</a>(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{</div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>  <span class="keyword">const</span> node* n = root_;</div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>  <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> end();</div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span> </div><div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>  <span class="keywordflow">while</span> (!n->is_leafnode())</div><div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>  {</div><div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>  <span class="keyword">const</span> InnerNode* inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>InnerNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(inner, key);</div><div class="line"><a name="l01644"></a><span class="lineno"> 1644</span> </div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>  n = inner->childid[slot];</div><div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>  }</div><div class="line"><a name="l01647"></a><span class="lineno"> 1647</span> </div><div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>  <span class="keyword">const</span> LeafNode* leaf = <span class="keyword">static_cast<</span><span class="keyword">const </span>LeafNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01649"></a><span class="lineno"> 1649</span> </div><div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(leaf, key);</div><div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>  <span class="keywordflow">return</span> const_iterator(leaf, slot);</div><div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>  }</div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span> <span class="comment"></span></div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span> <span class="comment"> //! Searches the B+ tree and returns an iterator to the first pair greater</span></div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span> <span class="comment"> //! than key, or end() if all keys are smaller or equal.</span></div><div class="line"><a name="l01656"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a482b50e623a123f653e2a91f113a507b"> 1656</a></span> <span class="comment"></span> iterator <a class="code" href="classtlx_1_1BTree.html#a482b50e623a123f653e2a91f113a507b">upper_bound</a>(<span class="keyword">const</span> key_type& key) {</div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>  node* n = root_;</div><div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>  <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> end();</div><div class="line"><a name="l01659"></a><span class="lineno"> 1659</span> </div><div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>  <span class="keywordflow">while</span> (!n->is_leafnode())</div><div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>  {</div><div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>  <span class="keyword">const</span> InnerNode* inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>InnerNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_upper(inner, key);</div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span> </div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>  n = inner->childid[slot];</div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>  }</div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span> </div><div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>  LeafNode* leaf = <span class="keyword">static_cast<</span>LeafNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01669"></a><span class="lineno"> 1669</span> </div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_upper(leaf, key);</div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>  <span class="keywordflow">return</span> iterator(leaf, slot);</div><div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>  }</div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span> <span class="comment"></span></div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span> <span class="comment"> //! Searches the B+ tree and returns a constant iterator to the first pair</span></div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span> <span class="comment"> //! greater than key, or end() if all keys are smaller or equal.</span></div><div class="line"><a name="l01676"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a99609d25589437b30cb42dab922bfaa9"> 1676</a></span> <span class="comment"></span> const_iterator <a class="code" href="classtlx_1_1BTree.html#a99609d25589437b30cb42dab922bfaa9">upper_bound</a>(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{</div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>  <span class="keyword">const</span> node* n = root_;</div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>  <span class="keywordflow">if</span> (!n) <span class="keywordflow">return</span> end();</div><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span> </div><div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>  <span class="keywordflow">while</span> (!n->is_leafnode())</div><div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>  {</div><div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>  <span class="keyword">const</span> InnerNode* inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>InnerNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_upper(inner, key);</div><div class="line"><a name="l01684"></a><span class="lineno"> 1684</span> </div><div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>  n = inner->childid[slot];</div><div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>  }</div><div class="line"><a name="l01687"></a><span class="lineno"> 1687</span> </div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>  <span class="keyword">const</span> LeafNode* leaf = <span class="keyword">static_cast<</span><span class="keyword">const </span>LeafNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span> </div><div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_upper(leaf, key);</div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>  <span class="keywordflow">return</span> const_iterator(leaf, slot);</div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>  }</div><div class="line"><a name="l01693"></a><span class="lineno"> 1693</span> <span class="comment"></span></div><div class="line"><a name="l01694"></a><span class="lineno"> 1694</span> <span class="comment"> //! Searches the B+ tree and returns both lower_bound() and upper_bound().</span></div><div class="line"><a name="l01695"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a97bb054bc81e97ec55f0b539cdcbfcde"> 1695</a></span> <span class="comment"></span> std::pair<iterator, iterator> <a class="code" href="classtlx_1_1BTree.html#a97bb054bc81e97ec55f0b539cdcbfcde">equal_range</a>(<span class="keyword">const</span> key_type& key) {</div><div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>  <span class="keywordflow">return</span> std::pair<iterator, iterator>(</div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>  lower_bound(key), upper_bound(key));</div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>  }</div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span> <span class="comment"></span></div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span> <span class="comment"> //! Searches the B+ tree and returns both lower_bound() and upper_bound().</span></div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span> <span class="comment"></span> std::pair<const_iterator, const_iterator></div><div class="line"><a name="l01702"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a33c1ee0eb39360edec2a985301b9d631"> 1702</a></span>  <a class="code" href="classtlx_1_1BTree.html#a33c1ee0eb39360edec2a985301b9d631">equal_range</a>(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{</div><div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>  <span class="keywordflow">return</span> std::pair<const_iterator, const_iterator>(</div><div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>  lower_bound(key), upper_bound(key));</div><div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>  }</div><div class="line"><a name="l01706"></a><span class="lineno"> 1706</span> <span class="comment"></span></div><div class="line"><a name="l01707"></a><span class="lineno"> 1707</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l01708"></a><span class="lineno"> 1708</span> <span class="comment"></span></div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l01710"></a><span class="lineno"> 1710</span> <span class="comment"> //! \name B+ Tree Object Comparison Functions</span></div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span> <span class="comment"> //! Equality relation of B+ trees of the same type. B+ trees of the same</span></div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span> <span class="comment"> //! size and equal elements (both key and data) are considered equal. Beware</span></div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</span> <span class="comment"> //! of the random ordering of duplicate keys.</span></div><div class="line"><a name="l01716"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#ada0daf92dc639ad500156e58427d3cd5"> 1716</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="group__tlx__container.html#gaaf628430227788d04613cf5ffba32e0c">operator == </a>(<span class="keyword">const</span> <a class="code" href="classtlx_1_1BTree.html">BTree</a>& other)<span class="keyword"> const </span>{</div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>  <span class="keywordflow">return</span> (size() == other.<a class="code" href="classtlx_1_1BTree.html#a503ab01f6c0142145d3434f6924714e7">size</a>()) &&</div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>  std::equal(begin(), end(), other.<a class="code" href="classtlx_1_1BTree.html#ad69bd11391be1a1dba5c8202259664f8">begin</a>());</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>  }</div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span> <span class="comment"></span></div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span> <span class="comment"> //! Inequality relation. Based on operator==.</span></div><div class="line"><a name="l01722"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#af618cd9677f92210da00020d6f0920e2"> 1722</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="group__tlx__container.html#ga1eaba1000915c20a97170cf3c0c3d6b4">operator != </a>(<span class="keyword">const</span> <a class="code" href="classtlx_1_1BTree.html">BTree</a>& other)<span class="keyword"> const </span>{</div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>  <span class="keywordflow">return</span> !(*<span class="keyword">this</span> == other);</div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>  }</div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span> <span class="comment"></span></div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span> <span class="comment"> //! Total ordering relation of B+ trees of the same type. It uses</span></div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span> <span class="comment"> //! std::lexicographical_compare() for the actual comparison of elements.</span></div><div class="line"><a name="l01728"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#aff45baa0e3eb1e71b96fbc218603261b"> 1728</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="group__tlx__container.html#gae6cc1a14d8ad295c107ee2cd496de718">operator < </a>(<span class="keyword">const</span> <a class="code" href="classtlx_1_1BTree.html">BTree</a>& other)<span class="keyword"> const </span>{</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>  <span class="keywordflow">return</span> std::lexicographical_compare(</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>  begin(), end(), other.<a class="code" href="classtlx_1_1BTree.html#ad69bd11391be1a1dba5c8202259664f8">begin</a>(), other.<a class="code" href="classtlx_1_1BTree.html#acad38d52497a975bfb6f2f6acd76631f">end</a>());</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>  }</div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span> <span class="comment"></span></div><div class="line"><a name="l01733"></a><span class="lineno"> 1733</span> <span class="comment"> //! Greater relation. Based on operator<.</span></div><div class="line"><a name="l01734"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a668110bf059b213d6c7c07fa1b2f41e4"> 1734</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="group__tlx__container.html#ga7fb66a1c9efa4105671d43b388850b8e">operator > </a>(<span class="keyword">const</span> <a class="code" href="classtlx_1_1BTree.html">BTree</a>& other)<span class="keyword"> const </span>{</div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>  <span class="keywordflow">return</span> other < *<span class="keyword">this</span>;</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>  }</div><div class="line"><a name="l01737"></a><span class="lineno"> 1737</span> <span class="comment"></span></div><div class="line"><a name="l01738"></a><span class="lineno"> 1738</span> <span class="comment"> //! Less-equal relation. Based on operator<.</span></div><div class="line"><a name="l01739"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#abf9cbdd9263c136418648bd1d6fd42be"> 1739</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="group__tlx__container.html#ga9f8b1d83565260f6029a0d980e928a89">operator <= </a>(<span class="keyword">const</span> <a class="code" href="classtlx_1_1BTree.html">BTree</a>& other)<span class="keyword"> const </span>{</div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>  <span class="keywordflow">return</span> !(other < *<span class="keyword">this</span>);</div><div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>  }</div><div class="line"><a name="l01742"></a><span class="lineno"> 1742</span> <span class="comment"></span></div><div class="line"><a name="l01743"></a><span class="lineno"> 1743</span> <span class="comment"> //! Greater-equal relation. Based on operator<.</span></div><div class="line"><a name="l01744"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a3edfcc8ae79e36d8444f993ed53e4dad"> 1744</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="group__tlx__container.html#gac9244ca0e2eb361199a8ea7528495f04">operator >= </a>(<span class="keyword">const</span> <a class="code" href="classtlx_1_1BTree.html">BTree</a>& other)<span class="keyword"> const </span>{</div><div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>  <span class="keywordflow">return</span> !(*<span class="keyword">this</span> < other);</div><div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>  }</div><div class="line"><a name="l01747"></a><span class="lineno"> 1747</span> <span class="comment"></span></div><div class="line"><a name="l01748"></a><span class="lineno"> 1748</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l01749"></a><span class="lineno"> 1749</span> <span class="comment"></span></div><div class="line"><a name="l01750"></a><span class="lineno"> 1750</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l01751"></a><span class="lineno"> 1751</span> <span class="comment"> //! \name Fast Copy: Assign Operator and Copy Constructors</span></div><div class="line"><a name="l01752"></a><span class="lineno"> 1752</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l01753"></a><span class="lineno"> 1753</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01754"></a><span class="lineno"> 1754</span> <span class="comment"> //! Assignment operator. All the key/data pairs are copied.</span></div><div class="line"><a name="l01755"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a5d7edbc2e0e59ec25a21d0950c77a50c"> 1755</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree.html">BTree</a>& operator = (<span class="keyword">const</span> <a class="code" href="classtlx_1_1BTree.html">BTree</a>& other) {</div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>  <span class="keywordflow">if</span> (<span class="keyword">this</span> != &other)</div><div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>  {</div><div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>  clear();</div><div class="line"><a name="l01759"></a><span class="lineno"> 1759</span> </div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>  key_less_ = other.<a class="code" href="classtlx_1_1BTree.html#a62c2add0ee33d7acce9f02077cd1da99">key_comp</a>();</div><div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>  allocator_ = other.<a class="code" href="classtlx_1_1BTree.html#acfbc5374e81f060b1cdffeb9c494ae86">get_allocator</a>();</div><div class="line"><a name="l01762"></a><span class="lineno"> 1762</span> </div><div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>  <span class="keywordflow">if</span> (other.<a class="code" href="classtlx_1_1BTree.html#a503ab01f6c0142145d3434f6924714e7">size</a>() != 0)</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>  {</div><div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>  stats_.leaves = stats_.inner_nodes = 0;</div><div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>  <span class="keywordflow">if</span> (other.<a class="code" href="classtlx_1_1BTree.html#aebc82407c13a86e9551f7984d2e3d356">root_</a>) {</div><div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>  root_ = copy_recursive(other.<a class="code" href="classtlx_1_1BTree.html#aebc82407c13a86e9551f7984d2e3d356">root_</a>);</div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>  }</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>  stats_ = other.<a class="code" href="classtlx_1_1BTree.html#aed457b19fc617a12201f09de1d885368">stats_</a>;</div><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>  }</div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</span> </div><div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>  <span class="keywordflow">if</span> (self_verify) verify();</div><div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>  }</div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>  }</div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span> <span class="comment"></span></div><div class="line"><a name="l01777"></a><span class="lineno"> 1777</span> <span class="comment"> //! Copy constructor. The newly initialized B+ tree object will contain a</span></div><div class="line"><a name="l01778"></a><span class="lineno"> 1778</span> <span class="comment"> //! copy of all key/data pairs.</span></div><div class="line"><a name="l01779"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a62b4c13faa3ff390aeb52760c88210d6"> 1779</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree.html#a62b4c13faa3ff390aeb52760c88210d6">BTree</a>(<span class="keyword">const</span> <a class="code" href="classtlx_1_1BTree.html">BTree</a>& other)</div><div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>  : root_(nullptr), head_leaf_(nullptr), tail_leaf_(nullptr),</div><div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>  stats_(other.stats_),</div><div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>  key_less_(other.key_comp()),</div><div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>  allocator_(other.get_allocator()) {</div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>  <span class="keywordflow">if</span> (size() > 0)</div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>  {</div><div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>  stats_.leaves = stats_.inner_nodes = 0;</div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>  <span class="keywordflow">if</span> (other.<a class="code" href="classtlx_1_1BTree.html#aebc82407c13a86e9551f7984d2e3d356">root_</a>) {</div><div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>  root_ = copy_recursive(other.<a class="code" href="classtlx_1_1BTree.html#aebc82407c13a86e9551f7984d2e3d356">root_</a>);</div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>  }</div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>  <span class="keywordflow">if</span> (self_verify) verify();</div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>  }</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>  }</div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span> </div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span> <span class="keyword">private</span>:<span class="comment"></span></div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span> <span class="comment"> //! Recursively copy nodes from another B+ tree object</span></div><div class="line"><a name="l01796"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a37a9d364cc587fa88fc7e498cbbbd8e9"> 1796</a></span> <span class="comment"></span> <span class="keyword">struct </span>node * <a class="code" href="classtlx_1_1BTree.html#a37a9d364cc587fa88fc7e498cbbbd8e9">copy_recursive</a>(<span class="keyword">const</span> node* n) {</div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>  <span class="keywordflow">if</span> (n->is_leafnode())</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>  {</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>  <span class="keyword">const</span> LeafNode* leaf = <span class="keyword">static_cast<</span><span class="keyword">const </span>LeafNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>  LeafNode* newleaf = allocate_leaf();</div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span> </div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>  newleaf->slotuse = leaf->slotuse;</div><div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>  std::copy(leaf->slotdata, leaf->slotdata + leaf->slotuse,</div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>  newleaf->slotdata);</div><div class="line"><a name="l01805"></a><span class="lineno"> 1805</span> </div><div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>  <span class="keywordflow">if</span> (head_leaf_ == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>  {</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>  head_leaf_ = tail_leaf_ = newleaf;</div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>  newleaf->prev_leaf = newleaf->next_leaf = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>  }</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>  {</div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>  newleaf->prev_leaf = tail_leaf_;</div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>  tail_leaf_->next_leaf = newleaf;</div><div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>  tail_leaf_ = newleaf;</div><div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>  }</div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</span> </div><div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>  <span class="keywordflow">return</span> newleaf;</div><div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>  }</div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>  {</div><div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>  <span class="keyword">const</span> InnerNode* inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>InnerNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>  InnerNode* newinner = allocate_inner(inner->level);</div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span> </div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>  newinner->slotuse = inner->slotuse;</div><div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>  std::copy(inner->slotkey, inner->slotkey + inner->slotuse,</div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>  newinner->slotkey);</div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span> </div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot <= inner->slotuse; ++slot)</div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>  {</div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>  newinner->childid[slot] = copy_recursive(inner->childid[slot]);</div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>  }</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span> </div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>  <span class="keywordflow">return</span> newinner;</div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>  }</div><div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>  }</div><div class="line"><a name="l01837"></a><span class="lineno"> 1837</span> <span class="comment"></span></div><div class="line"><a name="l01838"></a><span class="lineno"> 1838</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l01839"></a><span class="lineno"> 1839</span> <span class="comment"></span></div><div class="line"><a name="l01840"></a><span class="lineno"> 1840</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l01841"></a><span class="lineno"> 1841</span> <span class="comment"> //! \name Public Insertion Functions</span></div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l01843"></a><span class="lineno"> 1843</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</span> <span class="comment"> //! Attempt to insert a key/data pair into the B+ tree. If the tree does not</span></div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</span> <span class="comment"> //! allow duplicate keys, then the insert may fail if it is already present.</span></div><div class="line"><a name="l01846"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#aa218c2c89397f8d0484ef9438d540456"> 1846</a></span> <span class="comment"></span> std::pair<iterator, bool> <a class="code" href="classtlx_1_1BTree.html#aa218c2c89397f8d0484ef9438d540456">insert</a>(<span class="keyword">const</span> value_type& x) {</div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>  <span class="keywordflow">return</span> insert_start(key_of_value::get(x), x);</div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>  }</div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</span> <span class="comment"></span></div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span> <span class="comment"> //! Attempt to insert a key/data pair into the B+ tree. The iterator hint is</span></div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span> <span class="comment"> //! currently ignored by the B+ tree insertion routine.</span></div><div class="line"><a name="l01852"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a3ff25301e2f68b6862c2ea4a36dab058"> 1852</a></span> <span class="comment"></span> iterator <a class="code" href="classtlx_1_1BTree.html#a3ff25301e2f68b6862c2ea4a36dab058">insert</a>(iterator <span class="comment">/* hint */</span>, <span class="keyword">const</span> value_type& x) {</div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>  <span class="keywordflow">return</span> insert_start(key_of_value::get(x), x).first;</div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>  }</div><div class="line"><a name="l01855"></a><span class="lineno"> 1855</span> <span class="comment"></span></div><div class="line"><a name="l01856"></a><span class="lineno"> 1856</span> <span class="comment"> //! Attempt to insert the range [first,last) of value_type pairs into the B+</span></div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span> <span class="comment"> //! tree. Each key/data pair is inserted individually; to bulk load the</span></div><div class="line"><a name="l01858"></a><span class="lineno"> 1858</span> <span class="comment"> //! tree, use a constructor with range.</span></div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span> <span class="comment"></span> <span class="keyword">template</span> <<span class="keyword">typename</span> InputIterator></div><div class="line"><a name="l01860"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#ac048f549259de32da2acd742cce52d5c"> 1860</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtlx_1_1BTree.html#ac048f549259de32da2acd742cce52d5c">insert</a>(InputIterator first, InputIterator last) {</div><div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>  InputIterator iter = first;</div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>  <span class="keywordflow">while</span> (iter != last)</div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>  {</div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>  insert(*iter);</div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>  ++iter;</div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>  }</div><div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>  }</div><div class="line"><a name="l01868"></a><span class="lineno"> 1868</span> <span class="comment"></span></div><div class="line"><a name="l01869"></a><span class="lineno"> 1869</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l01870"></a><span class="lineno"> 1870</span> <span class="comment"></span></div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span> <span class="keyword">private</span>:<span class="comment"></span></div><div class="line"><a name="l01872"></a><span class="lineno"> 1872</span> <span class="comment"> //! \name Private Insertion Functions</span></div><div class="line"><a name="l01873"></a><span class="lineno"> 1873</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l01874"></a><span class="lineno"> 1874</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01875"></a><span class="lineno"> 1875</span> <span class="comment"> //! Start the insertion descent at the current root and handle root splits.</span></div><div class="line"><a name="l01876"></a><span class="lineno"> 1876</span> <span class="comment"> //! Returns true if the item was inserted</span></div><div class="line"><a name="l01877"></a><span class="lineno"> 1877</span> <span class="comment"></span> std::pair<iterator, bool></div><div class="line"><a name="l01878"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#af580a76629eafd1d907fa5e1e18556a2"> 1878</a></span>  <a class="code" href="classtlx_1_1BTree.html#af580a76629eafd1d907fa5e1e18556a2">insert_start</a>(<span class="keyword">const</span> key_type& key, <span class="keyword">const</span> value_type& value) {</div><div class="line"><a name="l01879"></a><span class="lineno"> 1879</span> </div><div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>  node* newchild = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>  key_type newkey = key_type();</div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</span> </div><div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>  <span class="keywordflow">if</span> (root_ == <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>  root_ = head_leaf_ = tail_leaf_ = allocate_leaf();</div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>  }</div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</span> </div><div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>  std::pair<iterator, bool> r =</div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>  insert_descend(root_, key, value, &newkey, &newchild);</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</span> </div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>  <span class="keywordflow">if</span> (newchild)</div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>  {</div><div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>  <span class="comment">// this only occurs if insert_descend() could not insert the key</span></div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>  <span class="comment">// into the root node, this mean the root is full and a new root</span></div><div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>  <span class="comment">// needs to be created.</span></div><div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>  InnerNode* newroot = allocate_inner(root_->level + 1);</div><div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>  newroot->slotkey[0] = newkey;</div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</span> </div><div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>  newroot->childid[0] = root_;</div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>  newroot->childid[1] = newchild;</div><div class="line"><a name="l01900"></a><span class="lineno"> 1900</span> </div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>  newroot->slotuse = 1;</div><div class="line"><a name="l01902"></a><span class="lineno"> 1902</span> </div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>  root_ = newroot;</div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>  }</div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span> </div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>  <span class="comment">// increment size if the item was inserted</span></div><div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>  <span class="keywordflow">if</span> (r.second) ++stats_.size;</div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span> </div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span> <span class="preprocessor">#ifdef TLX_BTREE_DEBUG</span></div><div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>  <span class="keywordflow">if</span> (debug) print(std::cout);</div><div class="line"><a name="l01911"></a><span class="lineno"> 1911</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01912"></a><span class="lineno"> 1912</span> </div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>  <span class="keywordflow">if</span> (self_verify) {</div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>  verify();</div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(exists(key));</div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>  }</div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span> </div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>  <span class="keywordflow">return</span> r;</div><div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>  }</div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span> <span class="comment"></span></div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span> <span class="comment"> /*!</span></div><div class="line"><a name="l01922"></a><span class="lineno"> 1922</span> <span class="comment"> * Insert an item into the B+ tree.</span></div><div class="line"><a name="l01923"></a><span class="lineno"> 1923</span> <span class="comment"> *</span></div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span> <span class="comment"> * Descend down the nodes to a leaf, insert the key/data pair in a free</span></div><div class="line"><a name="l01925"></a><span class="lineno"> 1925</span> <span class="comment"> * slot. If the node overflows, then it must be split and the new split node</span></div><div class="line"><a name="l01926"></a><span class="lineno"> 1926</span> <span class="comment"> * inserted into the parent. Unroll / this splitting up to the root.</span></div><div class="line"><a name="l01927"></a><span class="lineno"> 1927</span> <span class="comment"> */</span></div><div class="line"><a name="l01928"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a3734f27e109c9117ded78c25d6d40624"> 1928</a></span>  std::pair<iterator, bool> <a class="code" href="classtlx_1_1BTree.html#a3734f27e109c9117ded78c25d6d40624">insert_descend</a>(</div><div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>  node* n, <span class="keyword">const</span> key_type& key, <span class="keyword">const</span> value_type& value,</div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>  key_type* splitkey, node** splitnode) {</div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span> </div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>  <span class="keywordflow">if</span> (!n->is_leafnode())</div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>  {</div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>  InnerNode* inner = <span class="keyword">static_cast<</span>InnerNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span> </div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>  key_type newkey = key_type();</div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>  node* newchild = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span> </div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(inner, key);</div><div class="line"><a name="l01940"></a><span class="lineno"> 1940</span> </div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>  <span class="stringliteral">"BTree::insert_descend into "</span> << inner->childid[slot]);</div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span> </div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>  std::pair<iterator, bool> r =</div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>  insert_descend(inner->childid[slot],</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>  key, value, &newkey, &newchild);</div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span> </div><div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>  <span class="keywordflow">if</span> (newchild)</div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>  {</div><div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"BTree::insert_descend newchild"</span> <<</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>  <span class="stringliteral">" with key "</span> << newkey <<</div><div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>  <span class="stringliteral">" node "</span> << newchild << <span class="stringliteral">" at slot "</span> << slot);</div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span> </div><div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>  <span class="keywordflow">if</span> (inner->is_full())</div><div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>  {</div><div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>  split_inner_node(inner, splitkey, splitnode, slot);</div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</span> </div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"BTree::insert_descend done split_inner:"</span> <<</div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>  <span class="stringliteral">" putslot: "</span> << slot <<</div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>  <span class="stringliteral">" putkey: "</span> << newkey <<</div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>  <span class="stringliteral">" upkey: "</span> << *splitkey);</div><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span> </div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span> <span class="preprocessor">#ifdef TLX_BTREE_DEBUG</span></div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>  <span class="keywordflow">if</span> (debug)</div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>  {</div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>  print_node(std::cout, inner);</div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>  print_node(std::cout, *splitnode);</div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>  }</div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span> </div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>  <span class="comment">// check if insert slot is in the split sibling node</span></div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"BTree::insert_descend switch: "</span></div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>  << slot << <span class="stringliteral">" > "</span> << inner->slotuse + 1);</div><div class="line"><a name="l01974"></a><span class="lineno"> 1974</span> </div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>  <span class="keywordflow">if</span> (slot == inner->slotuse + 1 &&</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>  inner->slotuse < (*splitnode)->slotuse)</div><div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>  {</div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>  <span class="comment">// special case when the insert slot matches the split</span></div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>  <span class="comment">// place between the two nodes, then the insert key</span></div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>  <span class="comment">// becomes the split key.</span></div><div class="line"><a name="l01981"></a><span class="lineno"> 1981</span> </div><div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(inner->slotuse + 1 < inner_slotmax);</div><div class="line"><a name="l01983"></a><span class="lineno"> 1983</span> </div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>  InnerNode* <a class="code" href="group__tlx__string.html#ga4fb56b145f00428be03f74257c61f1cc">split</a> = <span class="keyword">static_cast<</span>InnerNode*<span class="keyword">></span>(*splitnode);</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span> </div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>  <span class="comment">// move the split key and it's datum into the left node</span></div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>  inner->slotkey[inner->slotuse] = *splitkey;</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>  inner->childid[inner->slotuse + 1] = split->childid[0];</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>  inner->slotuse++;</div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span> </div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>  <span class="comment">// set new split key and move corresponding datum into</span></div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>  <span class="comment">// right node</span></div><div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>  split->childid[0] = newchild;</div><div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>  *splitkey = newkey;</div><div class="line"><a name="l01995"></a><span class="lineno"> 1995</span> </div><div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>  <span class="keywordflow">return</span> r;</div><div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>  }</div><div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (slot >= inner->slotuse + 1)</div><div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>  {</div><div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>  <span class="comment">// in case the insert slot is in the newly create split</span></div><div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>  <span class="comment">// node, we reuse the code below.</span></div><div class="line"><a name="l02002"></a><span class="lineno"> 2002</span> </div><div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>  slot -= inner->slotuse + 1;</div><div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>  inner = <span class="keyword">static_cast<</span>InnerNode*<span class="keyword">></span>(*splitnode);</div><div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(</div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>  <span class="stringliteral">"BTree::insert_descend switching to "</span></div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>  <span class="stringliteral">"splitted node "</span> << inner << <span class="stringliteral">" slot "</span> << slot);</div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>  }</div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>  }</div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span> </div><div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>  <span class="comment">// move items and put pointer to child node into correct slot</span></div><div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(slot >= 0 && slot <= inner->slotuse);</div><div class="line"><a name="l02013"></a><span class="lineno"> 2013</span> </div><div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>  std::copy_backward(</div><div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>  inner->slotkey + slot, inner->slotkey + inner->slotuse,</div><div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>  inner->slotkey + inner->slotuse + 1);</div><div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>  std::copy_backward(</div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>  inner->childid + slot, inner->childid + inner->slotuse + 1,</div><div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>  inner->childid + inner->slotuse + 2);</div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</span> </div><div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>  inner->slotkey[slot] = newkey;</div><div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>  inner->childid[slot + 1] = newchild;</div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>  inner->slotuse++;</div><div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>  }</div><div class="line"><a name="l02025"></a><span class="lineno"> 2025</span> </div><div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>  <span class="keywordflow">return</span> r;</div><div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>  }</div><div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>  <span class="keywordflow">else</span> <span class="comment">// n->is_leafnode() == true</span></div><div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>  {</div><div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>  LeafNode* leaf = <span class="keyword">static_cast<</span>LeafNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span> </div><div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(leaf, key);</div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</span> </div><div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>  <span class="keywordflow">if</span> (!allow_duplicates &&</div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>  slot < leaf->slotuse && key_equal(key, leaf->key(slot))) {</div><div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>  <span class="keywordflow">return</span> std::pair<iterator, bool>(iterator(leaf, slot), <span class="keyword">false</span>);</div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>  }</div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span> </div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>  <span class="keywordflow">if</span> (leaf->is_full())</div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>  {</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>  split_leaf_node(leaf, splitkey, splitnode);</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span> </div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>  <span class="comment">// check if insert slot is in the split sibling node</span></div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>  <span class="keywordflow">if</span> (slot >= leaf->slotuse)</div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>  {</div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>  slot -= leaf->slotuse;</div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>  leaf = <span class="keyword">static_cast<</span>LeafNode*<span class="keyword">></span>(*splitnode);</div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>  }</div><div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>  }</div><div class="line"><a name="l02050"></a><span class="lineno"> 2050</span> </div><div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>  <span class="comment">// move items and put data item into correct data slot</span></div><div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(slot >= 0 && slot <= leaf->slotuse);</div><div class="line"><a name="l02053"></a><span class="lineno"> 2053</span> </div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>  std::copy_backward(</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>  leaf->slotdata + slot, leaf->slotdata + leaf->slotuse,</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>  leaf->slotdata + leaf->slotuse + 1);</div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</span> </div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>  leaf->slotdata[slot] = value;</div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>  leaf->slotuse++;</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span> </div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>  <span class="keywordflow">if</span> (splitnode && leaf != *splitnode && slot == leaf->slotuse - 1)</div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>  {</div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>  <span class="comment">// special case: the node was split, and the insert is at the</span></div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>  <span class="comment">// last slot of the old node. then the splitkey must be updated.</span></div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>  *splitkey = key;</div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>  }</div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span> </div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>  <span class="keywordflow">return</span> std::pair<iterator, bool>(iterator(leaf, slot), <span class="keyword">true</span>);</div><div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>  }</div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>  }</div><div class="line"><a name="l02071"></a><span class="lineno"> 2071</span> <span class="comment"></span></div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span> <span class="comment"> //! Split up a leaf node into two equally-filled sibling leaves. Returns the</span></div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span> <span class="comment"> //! new nodes and it's insertion key in the two parameters.</span></div><div class="line"><a name="l02074"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a1234e2d209b518ae0396fb36b4be82d4"> 2074</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classtlx_1_1BTree.html#a1234e2d209b518ae0396fb36b4be82d4">split_leaf_node</a>(LeafNode* leaf,</div><div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>  key_type* out_newkey, node** out_newleaf) {</div><div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(leaf->is_full());</div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span> </div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> mid = (leaf->slotuse >> 1);</div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span> </div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"BTree::split_leaf_node on "</span> << leaf);</div><div class="line"><a name="l02081"></a><span class="lineno"> 2081</span> </div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>  LeafNode* newleaf = allocate_leaf();</div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span> </div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>  newleaf->slotuse = leaf->slotuse - mid;</div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</span> </div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>  newleaf->next_leaf = leaf->next_leaf;</div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>  <span class="keywordflow">if</span> (newleaf->next_leaf == <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(leaf == tail_leaf_);</div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>  tail_leaf_ = newleaf;</div><div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>  }</div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>  newleaf->next_leaf->prev_leaf = newleaf;</div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>  }</div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span> </div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>  std::copy(leaf->slotdata + mid, leaf->slotdata + leaf->slotuse,</div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>  newleaf->slotdata);</div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span> </div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>  leaf->slotuse = mid;</div><div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>  leaf->next_leaf = newleaf;</div><div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>  newleaf->prev_leaf = leaf;</div><div class="line"><a name="l02101"></a><span class="lineno"> 2101</span> </div><div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>  *out_newkey = leaf->key(leaf->slotuse - 1);</div><div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>  *out_newleaf = newleaf;</div><div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>  }</div><div class="line"><a name="l02105"></a><span class="lineno"> 2105</span> <span class="comment"></span></div><div class="line"><a name="l02106"></a><span class="lineno"> 2106</span> <span class="comment"> //! Split up an inner node into two equally-filled sibling nodes. Returns</span></div><div class="line"><a name="l02107"></a><span class="lineno"> 2107</span> <span class="comment"> //! the new nodes and it's insertion key in the two parameters. Requires the</span></div><div class="line"><a name="l02108"></a><span class="lineno"> 2108</span> <span class="comment"> //! slot of the item will be inserted, so the nodes will be the same size</span></div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span> <span class="comment"> //! after the insert.</span></div><div class="line"><a name="l02110"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#afd6849b9290c28ea815a0c03b1d9321a"> 2110</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classtlx_1_1BTree.html#afd6849b9290c28ea815a0c03b1d9321a">split_inner_node</a>(InnerNode* inner, key_type* out_newkey,</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>  node** out_newinner, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> addslot) {</div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(inner->is_full());</div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span> </div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> mid = (inner->slotuse >> 1);</div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span> </div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"BTree::split_inner: mid "</span> << mid <<</div><div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>  <span class="stringliteral">" addslot "</span> << addslot);</div><div class="line"><a name="l02118"></a><span class="lineno"> 2118</span> </div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>  <span class="comment">// if the split is uneven and the overflowing item will be put into the</span></div><div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>  <span class="comment">// larger node, then the smaller split node may underflow</span></div><div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>  <span class="keywordflow">if</span> (addslot <= mid && mid > inner->slotuse - (mid + 1))</div><div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>  mid--;</div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span> </div><div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"BTree::split_inner: mid "</span> << mid <<</div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>  <span class="stringliteral">" addslot "</span> << addslot);</div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span> </div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"BTree::split_inner_node on "</span> << inner <<</div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>  <span class="stringliteral">" into two nodes "</span> << mid << <span class="stringliteral">" and "</span> <<</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>  inner->slotuse - (mid + 1) << <span class="stringliteral">" sized"</span>);</div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span> </div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>  InnerNode* newinner = allocate_inner(inner->level);</div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span> </div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>  newinner->slotuse = inner->slotuse - (mid + 1);</div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span> </div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>  std::copy(inner->slotkey + mid + 1, inner->slotkey + inner->slotuse,</div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>  newinner->slotkey);</div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>  std::copy(inner->childid + mid + 1, inner->childid + inner->slotuse + 1,</div><div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>  newinner->childid);</div><div class="line"><a name="l02139"></a><span class="lineno"> 2139</span> </div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>  inner->slotuse = mid;</div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span> </div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>  *out_newkey = inner->key(mid);</div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>  *out_newinner = newinner;</div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>  }</div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span> <span class="comment"></span></div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l02147"></a><span class="lineno"> 2147</span> <span class="comment"></span></div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span> <span class="comment"> //! \name Bulk Loader - Construct Tree from Sorted Sequence</span></div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span> <span class="comment"> //! Bulk load a sorted range. Loads items into leaves and constructs a</span></div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span> <span class="comment"> //! B-tree above them. The tree must be empty when calling this function.</span></div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span> <span class="comment"></span> <span class="keyword">template</span> <<span class="keyword">typename</span> Iterator></div><div class="line"><a name="l02155"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a3d0a35a00bc2ff5608fe613ea8fa47e6"> 2155</a></span>  <span class="keywordtype">void</span> <a class="code" href="classtlx_1_1BTree.html#a3d0a35a00bc2ff5608fe613ea8fa47e6">bulk_load</a>(Iterator ibegin, Iterator iend) {</div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(empty());</div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span> </div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>  stats_.size = iend - ibegin;</div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span> </div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>  <span class="comment">// calculate number of leaves needed, round up.</span></div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>  <span class="keywordtype">size_t</span> num_items = iend - ibegin;</div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>  <span class="keywordtype">size_t</span> num_leaves = (num_items + leaf_slotmax - 1) / leaf_slotmax;</div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span> </div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"BTree::bulk_load, level 0: "</span> << stats_.size <<</div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>  <span class="stringliteral">" items into "</span> << num_leaves <<</div><div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>  <span class="stringliteral">" leaves with up to "</span> <<</div><div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>  ((iend - ibegin + num_leaves - 1) / num_leaves) <<</div><div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>  <span class="stringliteral">" items per leaf."</span>);</div><div class="line"><a name="l02169"></a><span class="lineno"> 2169</span> </div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>  Iterator it = ibegin;</div><div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < num_leaves; ++i)</div><div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>  {</div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>  <span class="comment">// allocate new leaf node</span></div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>  LeafNode* leaf = allocate_leaf();</div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span> </div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>  <span class="comment">// copy keys or (key,value) pairs into leaf nodes, uses template</span></div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>  <span class="comment">// switch leaf->set_slot().</span></div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>  leaf->slotuse = <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(num_items / (num_leaves - i));</div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> s = 0; s < leaf->slotuse; ++s, ++it)</div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>  leaf->set_slot(s, *it);</div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span> </div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>  <span class="keywordflow">if</span> (tail_leaf_ != <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>  tail_leaf_->next_leaf = leaf;</div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>  leaf->prev_leaf = tail_leaf_;</div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>  }</div><div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>  head_leaf_ = leaf;</div><div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>  }</div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>  tail_leaf_ = leaf;</div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span> </div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>  num_items -= leaf->slotuse;</div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>  }</div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span> </div><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(it == iend && num_items == 0);</div><div class="line"><a name="l02195"></a><span class="lineno"> 2195</span> </div><div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>  <span class="comment">// if the btree is so small to fit into one leaf, then we're done.</span></div><div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>  <span class="keywordflow">if</span> (head_leaf_ == tail_leaf_) {</div><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>  root_ = head_leaf_;</div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>  }</div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</span> </div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(stats_.leaves == num_leaves);</div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span> </div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>  <span class="comment">// create first level of inner nodes, pointing to the leaves.</span></div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>  <span class="keywordtype">size_t</span> num_parents =</div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>  (num_leaves + (inner_slotmax + 1) - 1) / (inner_slotmax + 1);</div><div class="line"><a name="l02207"></a><span class="lineno"> 2207</span> </div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"BTree::bulk_load, level 1: "</span> <<</div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>  num_leaves << <span class="stringliteral">" leaves in "</span> <<</div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>  num_parents << <span class="stringliteral">" inner nodes with up to "</span> <<</div><div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>  ((num_leaves + num_parents - 1) / num_parents) <<</div><div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>  <span class="stringliteral">" leaves per inner node."</span>);</div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span> </div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>  <span class="comment">// save inner nodes and maxkey for next level.</span></div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>  <span class="keyword">typedef</span> std::pair<InnerNode*, const key_type*> nextlevel_type;</div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>  nextlevel_type* nextlevel = <span class="keyword">new</span> nextlevel_type[num_parents];</div><div class="line"><a name="l02217"></a><span class="lineno"> 2217</span> </div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>  LeafNode* leaf = head_leaf_;</div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < num_parents; ++i)</div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>  {</div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>  <span class="comment">// allocate new inner node at level 1</span></div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>  InnerNode* n = allocate_inner(1);</div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</span> </div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>  n->slotuse = <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(num_leaves / (num_parents - i));</div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(n->slotuse > 0);</div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>  <span class="comment">// this counts keys, but an inner node has keys+1 children.</span></div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>  --n->slotuse;</div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span> </div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>  <span class="comment">// copy last key from each leaf and set child</span></div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> s = 0; s < n->slotuse; ++s)</div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>  {</div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>  n->slotkey[s] = leaf->key(leaf->slotuse - 1);</div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>  n->childid[s] = leaf;</div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>  leaf = leaf->next_leaf;</div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>  }</div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>  n->childid[n->slotuse] = leaf;</div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span> </div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>  <span class="comment">// track max key of any descendant.</span></div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>  nextlevel[i].first = n;</div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>  nextlevel[i].second = &leaf->key(leaf->slotuse - 1);</div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span> </div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>  leaf = leaf->next_leaf;</div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>  num_leaves -= n->slotuse + 1;</div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>  }</div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span> </div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(leaf == <span class="keyword">nullptr</span> && num_leaves == 0);</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span> </div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>  <span class="comment">// recursively build inner nodes pointing to inner nodes.</span></div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> level = 2; num_parents != 1; ++level)</div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>  {</div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>  <span class="keywordtype">size_t</span> num_children = num_parents;</div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>  num_parents =</div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>  (num_children + (inner_slotmax + 1) - 1) / (inner_slotmax + 1);</div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span> </div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(</div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>  <span class="stringliteral">"BTree::bulk_load, level "</span> << level <<</div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>  <span class="stringliteral">": "</span> << num_children << <span class="stringliteral">" children in "</span> <<</div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>  num_parents << <span class="stringliteral">" inner nodes with up to "</span> <<</div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>  ((num_children + num_parents - 1) / num_parents) <<</div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>  <span class="stringliteral">" children per inner node."</span>);</div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span> </div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>  <span class="keywordtype">size_t</span> inner_index = 0;</div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < num_parents; ++i)</div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>  {</div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>  <span class="comment">// allocate new inner node at level</span></div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>  InnerNode* n = allocate_inner(level);</div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span> </div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>  n->slotuse = <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(num_children / (num_parents - i));</div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(n->slotuse > 0);</div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>  <span class="comment">// this counts keys, but an inner node has keys+1 children.</span></div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>  --n->slotuse;</div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span> </div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>  <span class="comment">// copy children and maxkeys from nextlevel</span></div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> s = 0; s < n->slotuse; ++s)</div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>  {</div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>  n->slotkey[s] = *nextlevel[inner_index].second;</div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>  n->childid[s] = nextlevel[inner_index].first;</div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>  ++inner_index;</div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>  }</div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>  n->childid[n->slotuse] = nextlevel[inner_index].first;</div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span> </div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>  <span class="comment">// reuse nextlevel array for parents, because we can overwrite</span></div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>  <span class="comment">// slots we've already consumed.</span></div><div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>  nextlevel[i].first = n;</div><div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>  nextlevel[i].second = nextlevel[inner_index].second;</div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span> </div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>  ++inner_index;</div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>  num_children -= n->slotuse + 1;</div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>  }</div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span> </div><div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(num_children == 0);</div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>  }</div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span> </div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>  root_ = nextlevel[0].first;</div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>  <span class="keyword">delete</span>[] nextlevel;</div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span> </div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>  <span class="keywordflow">if</span> (self_verify) verify();</div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>  }</div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span> <span class="comment"></span></div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span> <span class="comment"></span></div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span> <span class="keyword">private</span>:<span class="comment"></span></div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span> <span class="comment"> //! \name Support Class Encapsulating Deletion Results</span></div><div class="line"><a name="l02304"></a><span class="lineno"> 2304</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l02305"></a><span class="lineno"> 2305</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span> <span class="comment"> //! Result flags of recursive deletion.</span></div><div class="line"><a name="l02307"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a3a617d72a0b84dcbdf111d1fe19ec0b5"> 2307</a></span> <span class="comment"></span> <span class="keyword">enum</span> <a class="code" href="classtlx_1_1BTree.html#a3a617d72a0b84dcbdf111d1fe19ec0b5">result_flags_t</a> {<span class="comment"></span></div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span> <span class="comment"> //! Deletion successful and no fix-ups necessary.</span></div><div class="line"><a name="l02309"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a3a617d72a0b84dcbdf111d1fe19ec0b5acc548bf14d595f9790f15c6514e626d8"> 2309</a></span> <span class="comment"></span> btree_ok = 0,</div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span> <span class="comment"></span></div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span> <span class="comment"> //! Deletion not successful because key was not found.</span></div><div class="line"><a name="l02312"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a3a617d72a0b84dcbdf111d1fe19ec0b5a828fdc69a5b8ce344d849c52f4002434"> 2312</a></span> <span class="comment"></span> btree_not_found = 1,</div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span> <span class="comment"></span></div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span> <span class="comment"> //! Deletion successful, the last key was updated so parent slotkeys</span></div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span> <span class="comment"> //! need updates.</span></div><div class="line"><a name="l02316"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a3a617d72a0b84dcbdf111d1fe19ec0b5a99aacb09662e9c66cdef8fc5a605ec75"> 2316</a></span> <span class="comment"></span> btree_update_lastkey = 2,</div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span> <span class="comment"></span></div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span> <span class="comment"> //! Deletion successful, children nodes were merged and the parent needs</span></div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span> <span class="comment"> //! to remove the empty node.</span></div><div class="line"><a name="l02320"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a3a617d72a0b84dcbdf111d1fe19ec0b5a1253a0a76ac7b4ca061433c10f7f832a"> 2320</a></span> <span class="comment"></span> btree_fixmerge = 4</div><div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>  };</div><div class="line"><a name="l02322"></a><span class="lineno"> 2322</span> <span class="comment"></span></div><div class="line"><a name="l02323"></a><span class="lineno"> 2323</span> <span class="comment"> //! B+ tree recursive deletion has much information which is needs to be</span></div><div class="line"><a name="l02324"></a><span class="lineno"> 2324</span> <span class="comment"> //! passed upward.</span></div><div class="line"><a name="l02325"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1result__t.html"> 2325</a></span> <span class="comment"></span> <span class="keyword">struct </span><a class="code" href="structtlx_1_1BTree_1_1result__t.html">result_t</a> {<span class="comment"></span></div><div class="line"><a name="l02326"></a><span class="lineno"> 2326</span> <span class="comment"> //! Merged result flags</span></div><div class="line"><a name="l02327"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1result__t.html#a8977bdc6bb20adb10785684083b8077f"> 2327</a></span> <span class="comment"></span> <a class="code" href="classtlx_1_1BTree.html#a3a617d72a0b84dcbdf111d1fe19ec0b5">result_flags_t</a> <a class="code" href="structtlx_1_1BTree_1_1result__t.html#a8977bdc6bb20adb10785684083b8077f">flags</a>;</div><div class="line"><a name="l02328"></a><span class="lineno"> 2328</span> <span class="comment"></span></div><div class="line"><a name="l02329"></a><span class="lineno"> 2329</span> <span class="comment"> //! The key to be updated at the parent's slot</span></div><div class="line"><a name="l02330"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1result__t.html#a8b50d073eba40cd3cd2678b97b7e0002"> 2330</a></span> <span class="comment"></span> key_type <a class="code" href="structtlx_1_1BTree_1_1result__t.html#a8b50d073eba40cd3cd2678b97b7e0002">lastkey</a>;</div><div class="line"><a name="l02331"></a><span class="lineno"> 2331</span> <span class="comment"></span></div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span> <span class="comment"> //! Constructor of a result with a specific flag, this can also be used</span></div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span> <span class="comment"> //! as for implicit conversion.</span></div><div class="line"><a name="l02334"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1result__t.html#a51e8cab78f4a914e9cb4247c84927e8f"> 2334</a></span> <span class="comment"></span> <a class="code" href="structtlx_1_1BTree_1_1result__t.html#a51e8cab78f4a914e9cb4247c84927e8f">result_t</a>(<a class="code" href="classtlx_1_1BTree.html#a3a617d72a0b84dcbdf111d1fe19ec0b5">result_flags_t</a> f = btree_ok) <span class="comment">// NOLINT</span></div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>  : flags(f), lastkey()</div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>  { }</div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span> <span class="comment"></span></div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span> <span class="comment"> //! Constructor with a lastkey value.</span></div><div class="line"><a name="l02339"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1result__t.html#adbc903b428081896ec43d6eb50a30d50"> 2339</a></span> <span class="comment"></span> <a class="code" href="structtlx_1_1BTree_1_1result__t.html#adbc903b428081896ec43d6eb50a30d50">result_t</a>(<a class="code" href="classtlx_1_1BTree.html#a3a617d72a0b84dcbdf111d1fe19ec0b5">result_flags_t</a> f, <span class="keyword">const</span> key_type& k)</div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>  : flags(f), lastkey(k)</div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>  { }</div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span> <span class="comment"></span></div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span> <span class="comment"> //! Test if this result object has a given flag set.</span></div><div class="line"><a name="l02344"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1result__t.html#ae1c20bab9719dbdf19bb660a0a4a700d"> 2344</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="structtlx_1_1BTree_1_1result__t.html#ae1c20bab9719dbdf19bb660a0a4a700d">has</a>(<a class="code" href="classtlx_1_1BTree.html#a3a617d72a0b84dcbdf111d1fe19ec0b5">result_flags_t</a> f)<span class="keyword"> const </span>{</div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>  <span class="keywordflow">return</span> (flags & f) != 0;</div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>  }</div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span> <span class="comment"></span></div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span> <span class="comment"> //! Merge two results OR-ing the result flags and overwriting lastkeys.</span></div><div class="line"><a name="l02349"></a><span class="lineno"><a class="line" href="structtlx_1_1BTree_1_1result__t.html#a5303413c5fc55a269163161efc2398a4"> 2349</a></span> <span class="comment"></span> <a class="code" href="structtlx_1_1BTree_1_1result__t.html">result_t</a>& operator |= (<span class="keyword">const</span> <a class="code" href="structtlx_1_1BTree_1_1result__t.html">result_t</a>& other) {</div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>  flags = <a class="code" href="classtlx_1_1BTree.html#a3a617d72a0b84dcbdf111d1fe19ec0b5">result_flags_t</a>(flags | other.<a class="code" href="structtlx_1_1BTree_1_1result__t.html#a8977bdc6bb20adb10785684083b8077f">flags</a>);</div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span> </div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>  <span class="comment">// we overwrite existing lastkeys on purpose</span></div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>  <span class="keywordflow">if</span> (other.<a class="code" href="structtlx_1_1BTree_1_1result__t.html#ae1c20bab9719dbdf19bb660a0a4a700d">has</a>(btree_update_lastkey))</div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>  lastkey = other.<a class="code" href="structtlx_1_1BTree_1_1result__t.html#a8b50d073eba40cd3cd2678b97b7e0002">lastkey</a>;</div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span> </div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>  }</div><div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>  };</div><div class="line"><a name="l02359"></a><span class="lineno"> 2359</span> <span class="comment"></span></div><div class="line"><a name="l02360"></a><span class="lineno"> 2360</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l02361"></a><span class="lineno"> 2361</span> <span class="comment"></span></div><div class="line"><a name="l02362"></a><span class="lineno"> 2362</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l02363"></a><span class="lineno"> 2363</span> <span class="comment"> //! \name Public Erase Functions</span></div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span> <span class="comment"> //! Erases one (the first) of the key/data pairs associated with the given</span></div><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span> <span class="comment"> //! key.</span></div><div class="line"><a name="l02368"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a3a79f5c030eea924dbd8fcc9417b9263"> 2368</a></span> <span class="comment"></span> <span class="keywordtype">bool</span> <a class="code" href="classtlx_1_1BTree.html#a3a79f5c030eea924dbd8fcc9417b9263">erase_one</a>(<span class="keyword">const</span> key_type& key) {</div><div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"BTree::erase_one("</span> << key <<</div><div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>  <span class="stringliteral">") on btree size "</span> << size());</div><div class="line"><a name="l02371"></a><span class="lineno"> 2371</span> </div><div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>  <span class="keywordflow">if</span> (self_verify) verify();</div><div class="line"><a name="l02373"></a><span class="lineno"> 2373</span> </div><div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>  <span class="keywordflow">if</span> (!root_) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span> </div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>  result_t result = erase_one_descend(</div><div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>  key, root_, <span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>, 0);</div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span> </div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>  <span class="keywordflow">if</span> (!result.has(btree_not_found))</div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>  --stats_.size;</div><div class="line"><a name="l02381"></a><span class="lineno"> 2381</span> </div><div class="line"><a name="l02382"></a><span class="lineno"> 2382</span> #ifdef TLX_BTREE_DEBUG</div><div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>  if (debug) print(std::cout);</div><div class="line"><a name="l02384"></a><span class="lineno"> 2384</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>  <span class="keywordflow">if</span> (self_verify) verify();</div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span> </div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>  <span class="keywordflow">return</span> !result.has(btree_not_found);</div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>  }</div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span> <span class="comment"></span></div><div class="line"><a name="l02390"></a><span class="lineno"> 2390</span> <span class="comment"> //! Erases all the key/data pairs associated with the given key. This is</span></div><div class="line"><a name="l02391"></a><span class="lineno"> 2391</span> <span class="comment"> //! implemented using erase_one().</span></div><div class="line"><a name="l02392"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#ae57ff6dd1cb4dc347b892dfa87ea6613"> 2392</a></span> <span class="comment"></span> size_type <a class="code" href="classtlx_1_1BTree.html#ae57ff6dd1cb4dc347b892dfa87ea6613">erase</a>(<span class="keyword">const</span> key_type& key) {</div><div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>  size_type c = 0;</div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span> </div><div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>  <span class="keywordflow">while</span> (erase_one(key))</div><div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>  {</div><div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>  ++c;</div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>  <span class="keywordflow">if</span> (!allow_duplicates) <span class="keywordflow">break</span>;</div><div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>  }</div><div class="line"><a name="l02400"></a><span class="lineno"> 2400</span> </div><div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>  <span class="keywordflow">return</span> c;</div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>  }</div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span> <span class="comment"></span></div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span> <span class="comment"> //! Erase the key/data pair referenced by the iterator.</span></div><div class="line"><a name="l02405"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#af8b2d25c3e313e0b24656afe5cd4f6f2"> 2405</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classtlx_1_1BTree.html#af8b2d25c3e313e0b24656afe5cd4f6f2">erase</a>(iterator iter) {</div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"BTree::erase_iter("</span> << iter.curr_leaf <<</div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>  <span class="stringliteral">","</span> << iter.curr_slot << <span class="stringliteral">") on btree size "</span> << size());</div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</span> </div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>  <span class="keywordflow">if</span> (self_verify) verify();</div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span> </div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>  <span class="keywordflow">if</span> (!root_) <span class="keywordflow">return</span>;</div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span> </div><div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>  result_t result = erase_iter_descend(</div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>  iter, root_, <span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>, 0);</div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span> </div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>  <span class="keywordflow">if</span> (!result.has(btree_not_found))</div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>  --stats_.size;</div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span> </div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span> #ifdef TLX_BTREE_DEBUG</div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>  if (debug) print(std::cout);</div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>  <span class="keywordflow">if</span> (self_verify) verify();</div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>  }</div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span> </div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span> <span class="preprocessor">#ifdef BTREE_TODO</span></div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span> <span class="comment"> //! Erase all key/data pairs in the range [first,last). This function is</span></div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span> <span class="comment"></span><span class="comment"> //! currently not implemented by the B+ Tree.</span></div><div class="line"><a name="l02428"></a><span class="lineno"> 2428</span> <span class="comment"></span> <span class="keywordtype">void</span> erase(iterator <span class="comment">/* first */</span>, iterator <span class="comment">/* last */</span>) {</div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>  abort();</div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>  }</div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span> <span class="comment"></span></div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span> <span class="comment"></span></div><div class="line"><a name="l02435"></a><span class="lineno"> 2435</span> <span class="keyword">private</span>:<span class="comment"></span></div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span> <span class="comment"> //! \name Private Erase Functions</span></div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l02439"></a><span class="lineno"> 2439</span> <span class="comment"> /*!</span></div><div class="line"><a name="l02440"></a><span class="lineno"> 2440</span> <span class="comment"> * Erase one (the first) key/data pair in the B+ tree matching key.</span></div><div class="line"><a name="l02441"></a><span class="lineno"> 2441</span> <span class="comment"> *</span></div><div class="line"><a name="l02442"></a><span class="lineno"> 2442</span> <span class="comment"> * Descends down the tree in search of key. During the descent the parent,</span></div><div class="line"><a name="l02443"></a><span class="lineno"> 2443</span> <span class="comment"> * left and right siblings and their parents are computed and passed</span></div><div class="line"><a name="l02444"></a><span class="lineno"> 2444</span> <span class="comment"> * down. Once the key/data pair is found, it is removed from the leaf. If</span></div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span> <span class="comment"> * the leaf underflows 6 different cases are handled. These cases resolve</span></div><div class="line"><a name="l02446"></a><span class="lineno"> 2446</span> <span class="comment"> * the underflow by shifting key/data pairs from adjacent sibling nodes,</span></div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</span> <span class="comment"> * merging two sibling nodes or trimming the tree.</span></div><div class="line"><a name="l02448"></a><span class="lineno"> 2448</span> <span class="comment"> */</span></div><div class="line"><a name="l02449"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#aaa130f2c02b8f7701a6795c09d8988f5"> 2449</a></span>  result_t <a class="code" href="classtlx_1_1BTree.html#aaa130f2c02b8f7701a6795c09d8988f5">erase_one_descend</a>(<span class="keyword">const</span> key_type& key,</div><div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>  node* curr,</div><div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>  node* left, node* right,</div><div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>  InnerNode* left_parent, InnerNode* right_parent,</div><div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>  InnerNode* parent, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> parentslot) {</div><div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>  <span class="keywordflow">if</span> (curr->is_leafnode())</div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>  {</div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>  LeafNode* leaf = <span class="keyword">static_cast<</span>LeafNode*<span class="keyword">></span>(curr);</div><div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>  LeafNode* left_leaf = <span class="keyword">static_cast<</span>LeafNode*<span class="keyword">></span>(left);</div><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>  LeafNode* right_leaf = <span class="keyword">static_cast<</span>LeafNode*<span class="keyword">></span>(right);</div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span> </div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(leaf, key);</div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span> </div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>  <span class="keywordflow">if</span> (slot >= leaf->slotuse || !key_equal(key, leaf->key(slot)))</div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>  {</div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"Could not find key "</span> << key << <span class="stringliteral">" to erase."</span>);</div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span> </div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>  <span class="keywordflow">return</span> btree_not_found;</div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>  }</div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span> </div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(</div><div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>  <span class="stringliteral">"Found key in leaf "</span> << curr << <span class="stringliteral">" at slot "</span> << slot);</div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</span> </div><div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>  std::copy(leaf->slotdata + slot + 1, leaf->slotdata + leaf->slotuse,</div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>  leaf->slotdata + slot);</div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span> </div><div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>  leaf->slotuse--;</div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span> </div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>  result_t myres = btree_ok;</div><div class="line"><a name="l02478"></a><span class="lineno"> 2478</span> </div><div class="line"><a name="l02479"></a><span class="lineno"> 2479</span>  <span class="comment">// if the last key of the leaf was changed, the parent is notified</span></div><div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>  <span class="comment">// and updates the key of this leaf</span></div><div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>  <span class="keywordflow">if</span> (slot == leaf->slotuse)</div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>  {</div><div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>  <span class="keywordflow">if</span> (parent && parentslot < parent->slotuse)</div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>  {</div><div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[parentslot] == curr);</div><div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>  parent->slotkey[parentslot] = leaf->key(leaf->slotuse - 1);</div><div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>  }</div><div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>  {</div><div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>  <span class="keywordflow">if</span> (leaf->slotuse >= 1)</div><div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>  {</div><div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"Scheduling lastkeyupdate: key "</span> <<</div><div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>  leaf->key(leaf->slotuse - 1));</div><div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>  myres |= result_t(</div><div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>  btree_update_lastkey, leaf->key(leaf->slotuse - 1));</div><div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>  }</div><div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>  {</div><div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(leaf == root_);</div><div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>  }</div><div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>  }</div><div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>  }</div><div class="line"><a name="l02503"></a><span class="lineno"> 2503</span> </div><div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>  <span class="keywordflow">if</span> (leaf->is_underflow() && !(leaf == root_ && leaf->slotuse >= 1))</div><div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>  {</div><div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>  <span class="comment">// determine what to do about the underflow</span></div><div class="line"><a name="l02507"></a><span class="lineno"> 2507</span> </div><div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>  <span class="comment">// case : if this empty leaf is the root, then delete all nodes</span></div><div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>  <span class="comment">// and set root to nullptr.</span></div><div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>  <span class="keywordflow">if</span> (left_leaf == <span class="keyword">nullptr</span> && right_leaf == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>  {</div><div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(leaf == root_);</div><div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(leaf->slotuse == 0);</div><div class="line"><a name="l02514"></a><span class="lineno"> 2514</span> </div><div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>  free_node(root_);</div><div class="line"><a name="l02516"></a><span class="lineno"> 2516</span> </div><div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>  root_ = leaf = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>  head_leaf_ = tail_leaf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02519"></a><span class="lineno"> 2519</span> </div><div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>  <span class="comment">// will be decremented soon by insert_start()</span></div><div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(stats_.size == 1);</div><div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(stats_.leaves == 0);</div><div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(stats_.inner_nodes == 0);</div><div class="line"><a name="l02524"></a><span class="lineno"> 2524</span> </div><div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>  <span class="keywordflow">return</span> btree_ok;</div><div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>  }</div><div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>  <span class="comment">// case : if both left and right leaves would underflow in case</span></div><div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>  <span class="comment">// of a shift, then merging is necessary. choose the more local</span></div><div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>  <span class="comment">// merger with our parent</span></div><div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((left_leaf == <span class="keyword">nullptr</span> || left_leaf->is_few()) &&</div><div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>  (right_leaf == <span class="keyword">nullptr</span> || right_leaf->is_few()))</div><div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>  {</div><div class="line"><a name="l02533"></a><span class="lineno"> 2533</span>  <span class="keywordflow">if</span> (left_parent == parent)</div><div class="line"><a name="l02534"></a><span class="lineno"> 2534</span>  myres |= merge_leaves(left_leaf, leaf, left_parent);</div><div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>  myres |= merge_leaves(leaf, right_leaf, right_parent);</div><div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>  }</div><div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>  <span class="comment">// case : the right leaf has extra data, so balance right with</span></div><div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>  <span class="comment">// current</span></div><div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((left_leaf != <span class="keyword">nullptr</span> && left_leaf->is_few()) &&</div><div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>  (right_leaf != <span class="keyword">nullptr</span> && !right_leaf->is_few()))</div><div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>  {</div><div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>  <span class="keywordflow">if</span> (right_parent == parent)</div><div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>  myres |= shift_left_leaf(</div><div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>  leaf, right_leaf, right_parent, parentslot);</div><div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02547"></a><span class="lineno"> 2547</span>  myres |= merge_leaves(left_leaf, leaf, left_parent);</div><div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>  }</div><div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>  <span class="comment">// case : the left leaf has extra data, so balance left with</span></div><div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>  <span class="comment">// current</span></div><div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((left_leaf != <span class="keyword">nullptr</span> && !left_leaf->is_few()) &&</div><div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>  (right_leaf != <span class="keyword">nullptr</span> && right_leaf->is_few()))</div><div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>  {</div><div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>  <span class="keywordflow">if</span> (left_parent == parent)</div><div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>  shift_right_leaf(</div><div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>  left_leaf, leaf, left_parent, parentslot - 1);</div><div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02558"></a><span class="lineno"> 2558</span>  myres |= merge_leaves(leaf, right_leaf, right_parent);</div><div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>  }</div><div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>  <span class="comment">// case : both the leaf and right leaves have extra data and our</span></div><div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>  <span class="comment">// parent, choose the leaf with more data</span></div><div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (left_parent == right_parent)</div><div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>  {</div><div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>  <span class="keywordflow">if</span> (left_leaf->slotuse <= right_leaf->slotuse)</div><div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>  myres |= shift_left_leaf(</div><div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>  leaf, right_leaf, right_parent, parentslot);</div><div class="line"><a name="l02567"></a><span class="lineno"> 2567</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>  shift_right_leaf(</div><div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>  left_leaf, leaf, left_parent, parentslot - 1);</div><div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>  }</div><div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>  {</div><div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>  <span class="keywordflow">if</span> (left_parent == parent)</div><div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>  shift_right_leaf(</div><div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>  left_leaf, leaf, left_parent, parentslot - 1);</div><div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>  myres |= shift_left_leaf(</div><div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>  leaf, right_leaf, right_parent, parentslot);</div><div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>  }</div><div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>  }</div><div class="line"><a name="l02581"></a><span class="lineno"> 2581</span> </div><div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>  <span class="keywordflow">return</span> myres;</div><div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>  }</div><div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>  <span class="keywordflow">else</span> <span class="comment">// !curr->is_leafnode()</span></div><div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>  {</div><div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>  InnerNode* inner = <span class="keyword">static_cast<</span>InnerNode*<span class="keyword">></span>(curr);</div><div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>  InnerNode* left_inner = <span class="keyword">static_cast<</span>InnerNode*<span class="keyword">></span>(left);</div><div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>  InnerNode* right_inner = <span class="keyword">static_cast<</span>InnerNode*<span class="keyword">></span>(right);</div><div class="line"><a name="l02589"></a><span class="lineno"> 2589</span> </div><div class="line"><a name="l02590"></a><span class="lineno"> 2590</span>  node* myleft, * myright;</div><div class="line"><a name="l02591"></a><span class="lineno"> 2591</span>  InnerNode* myleft_parent, * myright_parent;</div><div class="line"><a name="l02592"></a><span class="lineno"> 2592</span> </div><div class="line"><a name="l02593"></a><span class="lineno"> 2593</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(inner, key);</div><div class="line"><a name="l02594"></a><span class="lineno"> 2594</span> </div><div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>  <span class="keywordflow">if</span> (slot == 0) {</div><div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>  myleft =</div><div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>  (left == <span class="keyword">nullptr</span>) ? <span class="keyword">nullptr</span> :</div><div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>  static_cast<InnerNode*>(left)->childid[left->slotuse - 1];</div><div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>  myleft_parent = left_parent;</div><div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>  }</div><div class="line"><a name="l02601"></a><span class="lineno"> 2601</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>  myleft = inner->childid[slot - 1];</div><div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>  myleft_parent = inner;</div><div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>  }</div><div class="line"><a name="l02605"></a><span class="lineno"> 2605</span> </div><div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>  <span class="keywordflow">if</span> (slot == inner->slotuse) {</div><div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>  myright =</div><div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>  (right == <span class="keyword">nullptr</span>) ? <span class="keyword">nullptr</span> :</div><div class="line"><a name="l02609"></a><span class="lineno"> 2609</span>  static_cast<InnerNode*>(right)->childid[0];</div><div class="line"><a name="l02610"></a><span class="lineno"> 2610</span>  myright_parent = right_parent;</div><div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>  }</div><div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>  myright = inner->childid[slot + 1];</div><div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>  myright_parent = inner;</div><div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>  }</div><div class="line"><a name="l02616"></a><span class="lineno"> 2616</span> </div><div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"erase_one_descend into "</span> << inner->childid[slot]);</div><div class="line"><a name="l02618"></a><span class="lineno"> 2618</span> </div><div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>  result_t result = erase_one_descend(</div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>  key,</div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>  inner->childid[slot],</div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>  myleft, myright,</div><div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>  myleft_parent, myright_parent,</div><div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>  inner, slot);</div><div class="line"><a name="l02625"></a><span class="lineno"> 2625</span> </div><div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>  result_t myres = btree_ok;</div><div class="line"><a name="l02627"></a><span class="lineno"> 2627</span> </div><div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>  <span class="keywordflow">if</span> (result.has(btree_not_found))</div><div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>  {</div><div class="line"><a name="l02630"></a><span class="lineno"> 2630</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>  }</div><div class="line"><a name="l02632"></a><span class="lineno"> 2632</span> </div><div class="line"><a name="l02633"></a><span class="lineno"> 2633</span>  <span class="keywordflow">if</span> (result.has(btree_update_lastkey))</div><div class="line"><a name="l02634"></a><span class="lineno"> 2634</span>  {</div><div class="line"><a name="l02635"></a><span class="lineno"> 2635</span>  <span class="keywordflow">if</span> (parent && parentslot < parent->slotuse)</div><div class="line"><a name="l02636"></a><span class="lineno"> 2636</span>  {</div><div class="line"><a name="l02637"></a><span class="lineno"> 2637</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"Fixing lastkeyupdate: key "</span> <<</div><div class="line"><a name="l02638"></a><span class="lineno"> 2638</span>  result.lastkey << <span class="stringliteral">" into parent "</span> <<</div><div class="line"><a name="l02639"></a><span class="lineno"> 2639</span>  parent << <span class="stringliteral">" at parentslot "</span> <<</div><div class="line"><a name="l02640"></a><span class="lineno"> 2640</span>  parentslot);</div><div class="line"><a name="l02641"></a><span class="lineno"> 2641</span> </div><div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[parentslot] == curr);</div><div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>  parent->slotkey[parentslot] = result.lastkey;</div><div class="line"><a name="l02644"></a><span class="lineno"> 2644</span>  }</div><div class="line"><a name="l02645"></a><span class="lineno"> 2645</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02646"></a><span class="lineno"> 2646</span>  {</div><div class="line"><a name="l02647"></a><span class="lineno"> 2647</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(</div><div class="line"><a name="l02648"></a><span class="lineno"> 2648</span>  <span class="stringliteral">"Forwarding lastkeyupdate: key "</span> << result.lastkey);</div><div class="line"><a name="l02649"></a><span class="lineno"> 2649</span>  myres |= result_t(btree_update_lastkey, result.lastkey);</div><div class="line"><a name="l02650"></a><span class="lineno"> 2650</span>  }</div><div class="line"><a name="l02651"></a><span class="lineno"> 2651</span>  }</div><div class="line"><a name="l02652"></a><span class="lineno"> 2652</span> </div><div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>  <span class="keywordflow">if</span> (result.has(btree_fixmerge))</div><div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>  {</div><div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>  <span class="comment">// either the current node or the next is empty and should be</span></div><div class="line"><a name="l02656"></a><span class="lineno"> 2656</span>  <span class="comment">// removed</span></div><div class="line"><a name="l02657"></a><span class="lineno"> 2657</span>  <span class="keywordflow">if</span> (inner->childid[slot]->slotuse != 0)</div><div class="line"><a name="l02658"></a><span class="lineno"> 2658</span>  slot++;</div><div class="line"><a name="l02659"></a><span class="lineno"> 2659</span> </div><div class="line"><a name="l02660"></a><span class="lineno"> 2660</span>  <span class="comment">// this is the child slot invalidated by the merge</span></div><div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(inner->childid[slot]->slotuse == 0);</div><div class="line"><a name="l02662"></a><span class="lineno"> 2662</span> </div><div class="line"><a name="l02663"></a><span class="lineno"> 2663</span>  free_node(inner->childid[slot]);</div><div class="line"><a name="l02664"></a><span class="lineno"> 2664</span> </div><div class="line"><a name="l02665"></a><span class="lineno"> 2665</span>  std::copy(</div><div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>  inner->slotkey + slot, inner->slotkey + inner->slotuse,</div><div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>  inner->slotkey + slot - 1);</div><div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>  std::copy(</div><div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>  inner->childid + slot + 1,</div><div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>  inner->childid + inner->slotuse + 1,</div><div class="line"><a name="l02671"></a><span class="lineno"> 2671</span>  inner->childid + slot);</div><div class="line"><a name="l02672"></a><span class="lineno"> 2672</span> </div><div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>  inner->slotuse--;</div><div class="line"><a name="l02674"></a><span class="lineno"> 2674</span> </div><div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>  <span class="keywordflow">if</span> (inner->level == 1)</div><div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>  {</div><div class="line"><a name="l02677"></a><span class="lineno"> 2677</span>  <span class="comment">// fix split key for children leaves</span></div><div class="line"><a name="l02678"></a><span class="lineno"> 2678</span>  slot--;</div><div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>  LeafNode* child =</div><div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>  <span class="keyword">static_cast<</span>LeafNode*<span class="keyword">></span>(inner->childid[slot]);</div><div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>  inner->slotkey[slot] = child->key(child->slotuse - 1);</div><div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>  }</div><div class="line"><a name="l02683"></a><span class="lineno"> 2683</span>  }</div><div class="line"><a name="l02684"></a><span class="lineno"> 2684</span> </div><div class="line"><a name="l02685"></a><span class="lineno"> 2685</span>  <span class="keywordflow">if</span> (inner->is_underflow() &&</div><div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>  !(inner == root_ && inner->slotuse >= 1))</div><div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>  {</div><div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>  <span class="comment">// case: the inner node is the root and has just one child. that</span></div><div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>  <span class="comment">// child becomes the new root</span></div><div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>  <span class="keywordflow">if</span> (left_inner == <span class="keyword">nullptr</span> && right_inner == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>  {</div><div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(inner == root_);</div><div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(inner->slotuse == 0);</div><div class="line"><a name="l02694"></a><span class="lineno"> 2694</span> </div><div class="line"><a name="l02695"></a><span class="lineno"> 2695</span>  root_ = inner->childid[0];</div><div class="line"><a name="l02696"></a><span class="lineno"> 2696</span> </div><div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>  inner->slotuse = 0;</div><div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>  free_node(inner);</div><div class="line"><a name="l02699"></a><span class="lineno"> 2699</span> </div><div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>  <span class="keywordflow">return</span> btree_ok;</div><div class="line"><a name="l02701"></a><span class="lineno"> 2701</span>  }</div><div class="line"><a name="l02702"></a><span class="lineno"> 2702</span>  <span class="comment">// case : if both left and right leaves would underflow in case</span></div><div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>  <span class="comment">// of a shift, then merging is necessary. choose the more local</span></div><div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>  <span class="comment">// merger with our parent</span></div><div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((left_inner == <span class="keyword">nullptr</span> || left_inner->is_few()) &&</div><div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>  (right_inner == <span class="keyword">nullptr</span> || right_inner->is_few()))</div><div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>  {</div><div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>  <span class="keywordflow">if</span> (left_parent == parent)</div><div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>  myres |= merge_inner(</div><div class="line"><a name="l02710"></a><span class="lineno"> 2710</span>  left_inner, inner, left_parent, parentslot - 1);</div><div class="line"><a name="l02711"></a><span class="lineno"> 2711</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>  myres |= merge_inner(</div><div class="line"><a name="l02713"></a><span class="lineno"> 2713</span>  inner, right_inner, right_parent, parentslot);</div><div class="line"><a name="l02714"></a><span class="lineno"> 2714</span>  }</div><div class="line"><a name="l02715"></a><span class="lineno"> 2715</span>  <span class="comment">// case : the right leaf has extra data, so balance right with</span></div><div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>  <span class="comment">// current</span></div><div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((left_inner != <span class="keyword">nullptr</span> && left_inner->is_few()) &&</div><div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>  (right_inner != <span class="keyword">nullptr</span> && !right_inner->is_few()))</div><div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>  {</div><div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>  <span class="keywordflow">if</span> (right_parent == parent)</div><div class="line"><a name="l02721"></a><span class="lineno"> 2721</span>  shift_left_inner(</div><div class="line"><a name="l02722"></a><span class="lineno"> 2722</span>  inner, right_inner, right_parent, parentslot);</div><div class="line"><a name="l02723"></a><span class="lineno"> 2723</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02724"></a><span class="lineno"> 2724</span>  myres |= merge_inner(</div><div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>  left_inner, inner, left_parent, parentslot - 1);</div><div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>  }</div><div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>  <span class="comment">// case : the left leaf has extra data, so balance left with</span></div><div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>  <span class="comment">// current</span></div><div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((left_inner != <span class="keyword">nullptr</span> && !left_inner->is_few()) &&</div><div class="line"><a name="l02730"></a><span class="lineno"> 2730</span>  (right_inner != <span class="keyword">nullptr</span> && right_inner->is_few()))</div><div class="line"><a name="l02731"></a><span class="lineno"> 2731</span>  {</div><div class="line"><a name="l02732"></a><span class="lineno"> 2732</span>  <span class="keywordflow">if</span> (left_parent == parent)</div><div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>  shift_right_inner(</div><div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>  left_inner, inner, left_parent, parentslot - 1);</div><div class="line"><a name="l02735"></a><span class="lineno"> 2735</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02736"></a><span class="lineno"> 2736</span>  myres |= merge_inner(</div><div class="line"><a name="l02737"></a><span class="lineno"> 2737</span>  inner, right_inner, right_parent, parentslot);</div><div class="line"><a name="l02738"></a><span class="lineno"> 2738</span>  }</div><div class="line"><a name="l02739"></a><span class="lineno"> 2739</span>  <span class="comment">// case : both the leaf and right leaves have extra data and our</span></div><div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>  <span class="comment">// parent, choose the leaf with more data</span></div><div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (left_parent == right_parent)</div><div class="line"><a name="l02742"></a><span class="lineno"> 2742</span>  {</div><div class="line"><a name="l02743"></a><span class="lineno"> 2743</span>  <span class="keywordflow">if</span> (left_inner->slotuse <= right_inner->slotuse)</div><div class="line"><a name="l02744"></a><span class="lineno"> 2744</span>  shift_left_inner(</div><div class="line"><a name="l02745"></a><span class="lineno"> 2745</span>  inner, right_inner, right_parent, parentslot);</div><div class="line"><a name="l02746"></a><span class="lineno"> 2746</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02747"></a><span class="lineno"> 2747</span>  shift_right_inner(</div><div class="line"><a name="l02748"></a><span class="lineno"> 2748</span>  left_inner, inner, left_parent, parentslot - 1);</div><div class="line"><a name="l02749"></a><span class="lineno"> 2749</span>  }</div><div class="line"><a name="l02750"></a><span class="lineno"> 2750</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02751"></a><span class="lineno"> 2751</span>  {</div><div class="line"><a name="l02752"></a><span class="lineno"> 2752</span>  <span class="keywordflow">if</span> (left_parent == parent)</div><div class="line"><a name="l02753"></a><span class="lineno"> 2753</span>  shift_right_inner(</div><div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>  left_inner, inner, left_parent, parentslot - 1);</div><div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>  shift_left_inner(</div><div class="line"><a name="l02757"></a><span class="lineno"> 2757</span>  inner, right_inner, right_parent, parentslot);</div><div class="line"><a name="l02758"></a><span class="lineno"> 2758</span>  }</div><div class="line"><a name="l02759"></a><span class="lineno"> 2759</span>  }</div><div class="line"><a name="l02760"></a><span class="lineno"> 2760</span> </div><div class="line"><a name="l02761"></a><span class="lineno"> 2761</span>  <span class="keywordflow">return</span> myres;</div><div class="line"><a name="l02762"></a><span class="lineno"> 2762</span>  }</div><div class="line"><a name="l02763"></a><span class="lineno"> 2763</span>  }</div><div class="line"><a name="l02764"></a><span class="lineno"> 2764</span> <span class="comment"></span></div><div class="line"><a name="l02765"></a><span class="lineno"> 2765</span> <span class="comment"> /*!</span></div><div class="line"><a name="l02766"></a><span class="lineno"> 2766</span> <span class="comment"> * Erase one key/data pair referenced by an iterator in the B+ tree.</span></div><div class="line"><a name="l02767"></a><span class="lineno"> 2767</span> <span class="comment"> *</span></div><div class="line"><a name="l02768"></a><span class="lineno"> 2768</span> <span class="comment"> * Descends down the tree in search of an iterator. During the descent the</span></div><div class="line"><a name="l02769"></a><span class="lineno"> 2769</span> <span class="comment"> * parent, left and right siblings and their parents are computed and passed</span></div><div class="line"><a name="l02770"></a><span class="lineno"> 2770</span> <span class="comment"> * down. The difficulty is that the iterator contains only a pointer to a</span></div><div class="line"><a name="l02771"></a><span class="lineno"> 2771</span> <span class="comment"> * LeafNode, which means that this function must do a recursive depth first</span></div><div class="line"><a name="l02772"></a><span class="lineno"> 2772</span> <span class="comment"> * search for that leaf node in the subtree containing all pairs of the same</span></div><div class="line"><a name="l02773"></a><span class="lineno"> 2773</span> <span class="comment"> * key. This subtree can be very large, even the whole tree, though in</span></div><div class="line"><a name="l02774"></a><span class="lineno"> 2774</span> <span class="comment"> * practice it would not make sense to have so many duplicate keys.</span></div><div class="line"><a name="l02775"></a><span class="lineno"> 2775</span> <span class="comment"> *</span></div><div class="line"><a name="l02776"></a><span class="lineno"> 2776</span> <span class="comment"> * Once the referenced key/data pair is found, it is removed from the leaf</span></div><div class="line"><a name="l02777"></a><span class="lineno"> 2777</span> <span class="comment"> * and the same underflow cases are handled as in erase_one_descend.</span></div><div class="line"><a name="l02778"></a><span class="lineno"> 2778</span> <span class="comment"> */</span></div><div class="line"><a name="l02779"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a59929a3ceec53dc1b7e288c245f7f4f7"> 2779</a></span>  result_t <a class="code" href="classtlx_1_1BTree.html#a59929a3ceec53dc1b7e288c245f7f4f7">erase_iter_descend</a>(<span class="keyword">const</span> iterator& iter,</div><div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>  node* curr,</div><div class="line"><a name="l02781"></a><span class="lineno"> 2781</span>  node* left, node* right,</div><div class="line"><a name="l02782"></a><span class="lineno"> 2782</span>  InnerNode* left_parent, InnerNode* right_parent,</div><div class="line"><a name="l02783"></a><span class="lineno"> 2783</span>  InnerNode* parent, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> parentslot) {</div><div class="line"><a name="l02784"></a><span class="lineno"> 2784</span>  <span class="keywordflow">if</span> (curr->is_leafnode())</div><div class="line"><a name="l02785"></a><span class="lineno"> 2785</span>  {</div><div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>  LeafNode* leaf = <span class="keyword">static_cast<</span>LeafNode*<span class="keyword">></span>(curr);</div><div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>  LeafNode* left_leaf = <span class="keyword">static_cast<</span>LeafNode*<span class="keyword">></span>(left);</div><div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>  LeafNode* right_leaf = <span class="keyword">static_cast<</span>LeafNode*<span class="keyword">></span>(right);</div><div class="line"><a name="l02789"></a><span class="lineno"> 2789</span> </div><div class="line"><a name="l02790"></a><span class="lineno"> 2790</span>  <span class="comment">// if this is not the correct leaf, get next step in recursive</span></div><div class="line"><a name="l02791"></a><span class="lineno"> 2791</span>  <span class="comment">// search</span></div><div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>  <span class="keywordflow">if</span> (leaf != iter.curr_leaf)</div><div class="line"><a name="l02793"></a><span class="lineno"> 2793</span>  {</div><div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>  <span class="keywordflow">return</span> btree_not_found;</div><div class="line"><a name="l02795"></a><span class="lineno"> 2795</span>  }</div><div class="line"><a name="l02796"></a><span class="lineno"> 2796</span> </div><div class="line"><a name="l02797"></a><span class="lineno"> 2797</span>  <span class="keywordflow">if</span> (iter.curr_slot >= leaf->slotuse)</div><div class="line"><a name="l02798"></a><span class="lineno"> 2798</span>  {</div><div class="line"><a name="l02799"></a><span class="lineno"> 2799</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"Could not find iterator ("</span> <<</div><div class="line"><a name="l02800"></a><span class="lineno"> 2800</span>  iter.curr_leaf << <span class="stringliteral">","</span> << iter.curr_slot <<</div><div class="line"><a name="l02801"></a><span class="lineno"> 2801</span>  <span class="stringliteral">") to erase. Invalid leaf node?"</span>);</div><div class="line"><a name="l02802"></a><span class="lineno"> 2802</span> </div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</span>  <span class="keywordflow">return</span> btree_not_found;</div><div class="line"><a name="l02804"></a><span class="lineno"> 2804</span>  }</div><div class="line"><a name="l02805"></a><span class="lineno"> 2805</span> </div><div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = iter.curr_slot;</div><div class="line"><a name="l02807"></a><span class="lineno"> 2807</span> </div><div class="line"><a name="l02808"></a><span class="lineno"> 2808</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"Found iterator in leaf "</span> <<</div><div class="line"><a name="l02809"></a><span class="lineno"> 2809</span>  curr << <span class="stringliteral">" at slot "</span> << slot);</div><div class="line"><a name="l02810"></a><span class="lineno"> 2810</span> </div><div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>  std::copy(leaf->slotdata + slot + 1, leaf->slotdata + leaf->slotuse,</div><div class="line"><a name="l02812"></a><span class="lineno"> 2812</span>  leaf->slotdata + slot);</div><div class="line"><a name="l02813"></a><span class="lineno"> 2813</span> </div><div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>  leaf->slotuse--;</div><div class="line"><a name="l02815"></a><span class="lineno"> 2815</span> </div><div class="line"><a name="l02816"></a><span class="lineno"> 2816</span>  result_t myres = btree_ok;</div><div class="line"><a name="l02817"></a><span class="lineno"> 2817</span> </div><div class="line"><a name="l02818"></a><span class="lineno"> 2818</span>  <span class="comment">// if the last key of the leaf was changed, the parent is notified</span></div><div class="line"><a name="l02819"></a><span class="lineno"> 2819</span>  <span class="comment">// and updates the key of this leaf</span></div><div class="line"><a name="l02820"></a><span class="lineno"> 2820</span>  <span class="keywordflow">if</span> (slot == leaf->slotuse)</div><div class="line"><a name="l02821"></a><span class="lineno"> 2821</span>  {</div><div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>  <span class="keywordflow">if</span> (parent && parentslot < parent->slotuse)</div><div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>  {</div><div class="line"><a name="l02824"></a><span class="lineno"> 2824</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[parentslot] == curr);</div><div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>  parent->slotkey[parentslot] = leaf->key(leaf->slotuse - 1);</div><div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>  }</div><div class="line"><a name="l02827"></a><span class="lineno"> 2827</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02828"></a><span class="lineno"> 2828</span>  {</div><div class="line"><a name="l02829"></a><span class="lineno"> 2829</span>  <span class="keywordflow">if</span> (leaf->slotuse >= 1)</div><div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>  {</div><div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"Scheduling lastkeyupdate: key "</span> <<</div><div class="line"><a name="l02832"></a><span class="lineno"> 2832</span>  leaf->key(leaf->slotuse - 1));</div><div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>  myres |= result_t(</div><div class="line"><a name="l02834"></a><span class="lineno"> 2834</span>  btree_update_lastkey, leaf->key(leaf->slotuse - 1));</div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>  }</div><div class="line"><a name="l02836"></a><span class="lineno"> 2836</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02837"></a><span class="lineno"> 2837</span>  {</div><div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(leaf == root_);</div><div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>  }</div><div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>  }</div><div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>  }</div><div class="line"><a name="l02842"></a><span class="lineno"> 2842</span> </div><div class="line"><a name="l02843"></a><span class="lineno"> 2843</span>  <span class="keywordflow">if</span> (leaf->is_underflow() && !(leaf == root_ && leaf->slotuse >= 1))</div><div class="line"><a name="l02844"></a><span class="lineno"> 2844</span>  {</div><div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>  <span class="comment">// determine what to do about the underflow</span></div><div class="line"><a name="l02846"></a><span class="lineno"> 2846</span> </div><div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>  <span class="comment">// case : if this empty leaf is the root, then delete all nodes</span></div><div class="line"><a name="l02848"></a><span class="lineno"> 2848</span>  <span class="comment">// and set root to nullptr.</span></div><div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>  <span class="keywordflow">if</span> (left_leaf == <span class="keyword">nullptr</span> && right_leaf == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l02850"></a><span class="lineno"> 2850</span>  {</div><div class="line"><a name="l02851"></a><span class="lineno"> 2851</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(leaf == root_);</div><div class="line"><a name="l02852"></a><span class="lineno"> 2852</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(leaf->slotuse == 0);</div><div class="line"><a name="l02853"></a><span class="lineno"> 2853</span> </div><div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>  free_node(root_);</div><div class="line"><a name="l02855"></a><span class="lineno"> 2855</span> </div><div class="line"><a name="l02856"></a><span class="lineno"> 2856</span>  root_ = leaf = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02857"></a><span class="lineno"> 2857</span>  head_leaf_ = tail_leaf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02858"></a><span class="lineno"> 2858</span> </div><div class="line"><a name="l02859"></a><span class="lineno"> 2859</span>  <span class="comment">// will be decremented soon by insert_start()</span></div><div class="line"><a name="l02860"></a><span class="lineno"> 2860</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(stats_.size == 1);</div><div class="line"><a name="l02861"></a><span class="lineno"> 2861</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(stats_.leaves == 0);</div><div class="line"><a name="l02862"></a><span class="lineno"> 2862</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(stats_.inner_nodes == 0);</div><div class="line"><a name="l02863"></a><span class="lineno"> 2863</span> </div><div class="line"><a name="l02864"></a><span class="lineno"> 2864</span>  <span class="keywordflow">return</span> btree_ok;</div><div class="line"><a name="l02865"></a><span class="lineno"> 2865</span>  }</div><div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>  <span class="comment">// case : if both left and right leaves would underflow in case</span></div><div class="line"><a name="l02867"></a><span class="lineno"> 2867</span>  <span class="comment">// of a shift, then merging is necessary. choose the more local</span></div><div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>  <span class="comment">// merger with our parent</span></div><div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((left_leaf == <span class="keyword">nullptr</span> || left_leaf->is_few()) &&</div><div class="line"><a name="l02870"></a><span class="lineno"> 2870</span>  (right_leaf == <span class="keyword">nullptr</span> || right_leaf->is_few()))</div><div class="line"><a name="l02871"></a><span class="lineno"> 2871</span>  {</div><div class="line"><a name="l02872"></a><span class="lineno"> 2872</span>  <span class="keywordflow">if</span> (left_parent == parent)</div><div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>  myres |= merge_leaves(left_leaf, leaf, left_parent);</div><div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02875"></a><span class="lineno"> 2875</span>  myres |= merge_leaves(leaf, right_leaf, right_parent);</div><div class="line"><a name="l02876"></a><span class="lineno"> 2876</span>  }</div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>  <span class="comment">// case : the right leaf has extra data, so balance right with</span></div><div class="line"><a name="l02878"></a><span class="lineno"> 2878</span>  <span class="comment">// current</span></div><div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((left_leaf != <span class="keyword">nullptr</span> && left_leaf->is_few()) &&</div><div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>  (right_leaf != <span class="keyword">nullptr</span> && !right_leaf->is_few()))</div><div class="line"><a name="l02881"></a><span class="lineno"> 2881</span>  {</div><div class="line"><a name="l02882"></a><span class="lineno"> 2882</span>  <span class="keywordflow">if</span> (right_parent == parent) {</div><div class="line"><a name="l02883"></a><span class="lineno"> 2883</span>  myres |= shift_left_leaf(</div><div class="line"><a name="l02884"></a><span class="lineno"> 2884</span>  leaf, right_leaf, right_parent, parentslot);</div><div class="line"><a name="l02885"></a><span class="lineno"> 2885</span>  }</div><div class="line"><a name="l02886"></a><span class="lineno"> 2886</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l02887"></a><span class="lineno"> 2887</span>  myres |= merge_leaves(left_leaf, leaf, left_parent);</div><div class="line"><a name="l02888"></a><span class="lineno"> 2888</span>  }</div><div class="line"><a name="l02889"></a><span class="lineno"> 2889</span>  }</div><div class="line"><a name="l02890"></a><span class="lineno"> 2890</span>  <span class="comment">// case : the left leaf has extra data, so balance left with</span></div><div class="line"><a name="l02891"></a><span class="lineno"> 2891</span>  <span class="comment">// current</span></div><div class="line"><a name="l02892"></a><span class="lineno"> 2892</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((left_leaf != <span class="keyword">nullptr</span> && !left_leaf->is_few()) &&</div><div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>  (right_leaf != <span class="keyword">nullptr</span> && right_leaf->is_few()))</div><div class="line"><a name="l02894"></a><span class="lineno"> 2894</span>  {</div><div class="line"><a name="l02895"></a><span class="lineno"> 2895</span>  <span class="keywordflow">if</span> (left_parent == parent) {</div><div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>  shift_right_leaf(</div><div class="line"><a name="l02897"></a><span class="lineno"> 2897</span>  left_leaf, leaf, left_parent, parentslot - 1);</div><div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>  }</div><div class="line"><a name="l02899"></a><span class="lineno"> 2899</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l02900"></a><span class="lineno"> 2900</span>  myres |= merge_leaves(leaf, right_leaf, right_parent);</div><div class="line"><a name="l02901"></a><span class="lineno"> 2901</span>  }</div><div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>  }</div><div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>  <span class="comment">// case : both the leaf and right leaves have extra data and our</span></div><div class="line"><a name="l02904"></a><span class="lineno"> 2904</span>  <span class="comment">// parent, choose the leaf with more data</span></div><div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (left_parent == right_parent)</div><div class="line"><a name="l02906"></a><span class="lineno"> 2906</span>  {</div><div class="line"><a name="l02907"></a><span class="lineno"> 2907</span>  <span class="keywordflow">if</span> (left_leaf->slotuse <= right_leaf->slotuse) {</div><div class="line"><a name="l02908"></a><span class="lineno"> 2908</span>  myres |= shift_left_leaf(</div><div class="line"><a name="l02909"></a><span class="lineno"> 2909</span>  leaf, right_leaf, right_parent, parentslot);</div><div class="line"><a name="l02910"></a><span class="lineno"> 2910</span>  }</div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l02912"></a><span class="lineno"> 2912</span>  shift_right_leaf(</div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span>  left_leaf, leaf, left_parent, parentslot - 1);</div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</span>  }</div><div class="line"><a name="l02915"></a><span class="lineno"> 2915</span>  }</div><div class="line"><a name="l02916"></a><span class="lineno"> 2916</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>  {</div><div class="line"><a name="l02918"></a><span class="lineno"> 2918</span>  <span class="keywordflow">if</span> (left_parent == parent) {</div><div class="line"><a name="l02919"></a><span class="lineno"> 2919</span>  shift_right_leaf(</div><div class="line"><a name="l02920"></a><span class="lineno"> 2920</span>  left_leaf, leaf, left_parent, parentslot - 1);</div><div class="line"><a name="l02921"></a><span class="lineno"> 2921</span>  }</div><div class="line"><a name="l02922"></a><span class="lineno"> 2922</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l02923"></a><span class="lineno"> 2923</span>  myres |= shift_left_leaf(</div><div class="line"><a name="l02924"></a><span class="lineno"> 2924</span>  leaf, right_leaf, right_parent, parentslot);</div><div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>  }</div><div class="line"><a name="l02926"></a><span class="lineno"> 2926</span>  }</div><div class="line"><a name="l02927"></a><span class="lineno"> 2927</span>  }</div><div class="line"><a name="l02928"></a><span class="lineno"> 2928</span> </div><div class="line"><a name="l02929"></a><span class="lineno"> 2929</span>  <span class="keywordflow">return</span> myres;</div><div class="line"><a name="l02930"></a><span class="lineno"> 2930</span>  }</div><div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>  <span class="keywordflow">else</span> <span class="comment">// !curr->is_leafnode()</span></div><div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>  {</div><div class="line"><a name="l02933"></a><span class="lineno"> 2933</span>  InnerNode* inner = <span class="keyword">static_cast<</span>InnerNode*<span class="keyword">></span>(curr);</div><div class="line"><a name="l02934"></a><span class="lineno"> 2934</span>  InnerNode* left_inner = <span class="keyword">static_cast<</span>InnerNode*<span class="keyword">></span>(left);</div><div class="line"><a name="l02935"></a><span class="lineno"> 2935</span>  InnerNode* right_inner = <span class="keyword">static_cast<</span>InnerNode*<span class="keyword">></span>(right);</div><div class="line"><a name="l02936"></a><span class="lineno"> 2936</span> </div><div class="line"><a name="l02937"></a><span class="lineno"> 2937</span>  <span class="comment">// find first slot below which the searched iterator might be</span></div><div class="line"><a name="l02938"></a><span class="lineno"> 2938</span>  <span class="comment">// located.</span></div><div class="line"><a name="l02939"></a><span class="lineno"> 2939</span> </div><div class="line"><a name="l02940"></a><span class="lineno"> 2940</span>  result_t result;</div><div class="line"><a name="l02941"></a><span class="lineno"> 2941</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = find_lower(inner, iter.key());</div><div class="line"><a name="l02942"></a><span class="lineno"> 2942</span> </div><div class="line"><a name="l02943"></a><span class="lineno"> 2943</span>  <span class="keywordflow">while</span> (slot <= inner->slotuse)</div><div class="line"><a name="l02944"></a><span class="lineno"> 2944</span>  {</div><div class="line"><a name="l02945"></a><span class="lineno"> 2945</span>  node* myleft, * myright;</div><div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>  InnerNode* myleft_parent, * myright_parent;</div><div class="line"><a name="l02947"></a><span class="lineno"> 2947</span> </div><div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>  <span class="keywordflow">if</span> (slot == 0) {</div><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>  myleft = (left == <span class="keyword">nullptr</span>) ? <span class="keyword">nullptr</span></div><div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>  : static_cast<InnerNode*>(left)->childid[</div><div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>  left->slotuse - 1];</div><div class="line"><a name="l02952"></a><span class="lineno"> 2952</span>  myleft_parent = left_parent;</div><div class="line"><a name="l02953"></a><span class="lineno"> 2953</span>  }</div><div class="line"><a name="l02954"></a><span class="lineno"> 2954</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l02955"></a><span class="lineno"> 2955</span>  myleft = inner->childid[slot - 1];</div><div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>  myleft_parent = inner;</div><div class="line"><a name="l02957"></a><span class="lineno"> 2957</span>  }</div><div class="line"><a name="l02958"></a><span class="lineno"> 2958</span> </div><div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>  <span class="keywordflow">if</span> (slot == inner->slotuse) {</div><div class="line"><a name="l02960"></a><span class="lineno"> 2960</span>  myright = (right == <span class="keyword">nullptr</span>) ? <span class="keyword">nullptr</span></div><div class="line"><a name="l02961"></a><span class="lineno"> 2961</span>  : static_cast<InnerNode*>(right)->childid[0];</div><div class="line"><a name="l02962"></a><span class="lineno"> 2962</span>  myright_parent = right_parent;</div><div class="line"><a name="l02963"></a><span class="lineno"> 2963</span>  }</div><div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>  myright = inner->childid[slot + 1];</div><div class="line"><a name="l02966"></a><span class="lineno"> 2966</span>  myright_parent = inner;</div><div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>  }</div><div class="line"><a name="l02968"></a><span class="lineno"> 2968</span> </div><div class="line"><a name="l02969"></a><span class="lineno"> 2969</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"erase_iter_descend into "</span> <<</div><div class="line"><a name="l02970"></a><span class="lineno"> 2970</span>  inner->childid[slot]);</div><div class="line"><a name="l02971"></a><span class="lineno"> 2971</span> </div><div class="line"><a name="l02972"></a><span class="lineno"> 2972</span>  result = erase_iter_descend(iter,</div><div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>  inner->childid[slot],</div><div class="line"><a name="l02974"></a><span class="lineno"> 2974</span>  myleft, myright,</div><div class="line"><a name="l02975"></a><span class="lineno"> 2975</span>  myleft_parent, myright_parent,</div><div class="line"><a name="l02976"></a><span class="lineno"> 2976</span>  inner, slot);</div><div class="line"><a name="l02977"></a><span class="lineno"> 2977</span> </div><div class="line"><a name="l02978"></a><span class="lineno"> 2978</span>  <span class="keywordflow">if</span> (!result.has(btree_not_found))</div><div class="line"><a name="l02979"></a><span class="lineno"> 2979</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l02980"></a><span class="lineno"> 2980</span> </div><div class="line"><a name="l02981"></a><span class="lineno"> 2981</span>  <span class="comment">// continue recursive search for leaf on next slot</span></div><div class="line"><a name="l02982"></a><span class="lineno"> 2982</span> </div><div class="line"><a name="l02983"></a><span class="lineno"> 2983</span>  <span class="keywordflow">if</span> (slot < inner->slotuse &&</div><div class="line"><a name="l02984"></a><span class="lineno"> 2984</span>  key_less(inner->slotkey[slot], iter.key()))</div><div class="line"><a name="l02985"></a><span class="lineno"> 2985</span>  <span class="keywordflow">return</span> btree_not_found;</div><div class="line"><a name="l02986"></a><span class="lineno"> 2986</span> </div><div class="line"><a name="l02987"></a><span class="lineno"> 2987</span>  ++slot;</div><div class="line"><a name="l02988"></a><span class="lineno"> 2988</span>  }</div><div class="line"><a name="l02989"></a><span class="lineno"> 2989</span> </div><div class="line"><a name="l02990"></a><span class="lineno"> 2990</span>  <span class="keywordflow">if</span> (slot > inner->slotuse)</div><div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>  <span class="keywordflow">return</span> btree_not_found;</div><div class="line"><a name="l02992"></a><span class="lineno"> 2992</span> </div><div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>  result_t myres = btree_ok;</div><div class="line"><a name="l02994"></a><span class="lineno"> 2994</span> </div><div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>  <span class="keywordflow">if</span> (result.has(btree_update_lastkey))</div><div class="line"><a name="l02996"></a><span class="lineno"> 2996</span>  {</div><div class="line"><a name="l02997"></a><span class="lineno"> 2997</span>  <span class="keywordflow">if</span> (parent && parentslot < parent->slotuse)</div><div class="line"><a name="l02998"></a><span class="lineno"> 2998</span>  {</div><div class="line"><a name="l02999"></a><span class="lineno"> 2999</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"Fixing lastkeyupdate: key "</span> <<</div><div class="line"><a name="l03000"></a><span class="lineno"> 3000</span>  result.lastkey << <span class="stringliteral">" into parent "</span> <<</div><div class="line"><a name="l03001"></a><span class="lineno"> 3001</span>  parent << <span class="stringliteral">" at parentslot "</span> << parentslot);</div><div class="line"><a name="l03002"></a><span class="lineno"> 3002</span> </div><div class="line"><a name="l03003"></a><span class="lineno"> 3003</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[parentslot] == curr);</div><div class="line"><a name="l03004"></a><span class="lineno"> 3004</span>  parent->slotkey[parentslot] = result.lastkey;</div><div class="line"><a name="l03005"></a><span class="lineno"> 3005</span>  }</div><div class="line"><a name="l03006"></a><span class="lineno"> 3006</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03007"></a><span class="lineno"> 3007</span>  {</div><div class="line"><a name="l03008"></a><span class="lineno"> 3008</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(</div><div class="line"><a name="l03009"></a><span class="lineno"> 3009</span>  <span class="stringliteral">"Forwarding lastkeyupdate: key "</span> << result.lastkey);</div><div class="line"><a name="l03010"></a><span class="lineno"> 3010</span>  myres |= result_t(btree_update_lastkey, result.lastkey);</div><div class="line"><a name="l03011"></a><span class="lineno"> 3011</span>  }</div><div class="line"><a name="l03012"></a><span class="lineno"> 3012</span>  }</div><div class="line"><a name="l03013"></a><span class="lineno"> 3013</span> </div><div class="line"><a name="l03014"></a><span class="lineno"> 3014</span>  <span class="keywordflow">if</span> (result.has(btree_fixmerge))</div><div class="line"><a name="l03015"></a><span class="lineno"> 3015</span>  {</div><div class="line"><a name="l03016"></a><span class="lineno"> 3016</span>  <span class="comment">// either the current node or the next is empty and should be</span></div><div class="line"><a name="l03017"></a><span class="lineno"> 3017</span>  <span class="comment">// removed</span></div><div class="line"><a name="l03018"></a><span class="lineno"> 3018</span>  <span class="keywordflow">if</span> (inner->childid[slot]->slotuse != 0)</div><div class="line"><a name="l03019"></a><span class="lineno"> 3019</span>  slot++;</div><div class="line"><a name="l03020"></a><span class="lineno"> 3020</span> </div><div class="line"><a name="l03021"></a><span class="lineno"> 3021</span>  <span class="comment">// this is the child slot invalidated by the merge</span></div><div class="line"><a name="l03022"></a><span class="lineno"> 3022</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(inner->childid[slot]->slotuse == 0);</div><div class="line"><a name="l03023"></a><span class="lineno"> 3023</span> </div><div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>  free_node(inner->childid[slot]);</div><div class="line"><a name="l03025"></a><span class="lineno"> 3025</span> </div><div class="line"><a name="l03026"></a><span class="lineno"> 3026</span>  std::copy(</div><div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>  inner->slotkey + slot, inner->slotkey + inner->slotuse,</div><div class="line"><a name="l03028"></a><span class="lineno"> 3028</span>  inner->slotkey + slot - 1);</div><div class="line"><a name="l03029"></a><span class="lineno"> 3029</span>  std::copy(</div><div class="line"><a name="l03030"></a><span class="lineno"> 3030</span>  inner->childid + slot + 1,</div><div class="line"><a name="l03031"></a><span class="lineno"> 3031</span>  inner->childid + inner->slotuse + 1,</div><div class="line"><a name="l03032"></a><span class="lineno"> 3032</span>  inner->childid + slot);</div><div class="line"><a name="l03033"></a><span class="lineno"> 3033</span> </div><div class="line"><a name="l03034"></a><span class="lineno"> 3034</span>  inner->slotuse--;</div><div class="line"><a name="l03035"></a><span class="lineno"> 3035</span> </div><div class="line"><a name="l03036"></a><span class="lineno"> 3036</span>  <span class="keywordflow">if</span> (inner->level == 1)</div><div class="line"><a name="l03037"></a><span class="lineno"> 3037</span>  {</div><div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>  <span class="comment">// fix split key for children leaves</span></div><div class="line"><a name="l03039"></a><span class="lineno"> 3039</span>  slot--;</div><div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>  LeafNode* child =</div><div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>  <span class="keyword">static_cast<</span>LeafNode*<span class="keyword">></span>(inner->childid[slot]);</div><div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>  inner->slotkey[slot] = child->key(child->slotuse - 1);</div><div class="line"><a name="l03043"></a><span class="lineno"> 3043</span>  }</div><div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>  }</div><div class="line"><a name="l03045"></a><span class="lineno"> 3045</span> </div><div class="line"><a name="l03046"></a><span class="lineno"> 3046</span>  <span class="keywordflow">if</span> (inner->is_underflow() &&</div><div class="line"><a name="l03047"></a><span class="lineno"> 3047</span>  !(inner == root_ && inner->slotuse >= 1))</div><div class="line"><a name="l03048"></a><span class="lineno"> 3048</span>  {</div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>  <span class="comment">// case: the inner node is the root and has just one</span></div><div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>  <span class="comment">// child. that child becomes the new root</span></div><div class="line"><a name="l03051"></a><span class="lineno"> 3051</span>  <span class="keywordflow">if</span> (left_inner == <span class="keyword">nullptr</span> && right_inner == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l03052"></a><span class="lineno"> 3052</span>  {</div><div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(inner == root_);</div><div class="line"><a name="l03054"></a><span class="lineno"> 3054</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(inner->slotuse == 0);</div><div class="line"><a name="l03055"></a><span class="lineno"> 3055</span> </div><div class="line"><a name="l03056"></a><span class="lineno"> 3056</span>  root_ = inner->childid[0];</div><div class="line"><a name="l03057"></a><span class="lineno"> 3057</span> </div><div class="line"><a name="l03058"></a><span class="lineno"> 3058</span>  inner->slotuse = 0;</div><div class="line"><a name="l03059"></a><span class="lineno"> 3059</span>  free_node(inner);</div><div class="line"><a name="l03060"></a><span class="lineno"> 3060</span> </div><div class="line"><a name="l03061"></a><span class="lineno"> 3061</span>  <span class="keywordflow">return</span> btree_ok;</div><div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>  }</div><div class="line"><a name="l03063"></a><span class="lineno"> 3063</span>  <span class="comment">// case : if both left and right leaves would underflow in case</span></div><div class="line"><a name="l03064"></a><span class="lineno"> 3064</span>  <span class="comment">// of a shift, then merging is necessary. choose the more local</span></div><div class="line"><a name="l03065"></a><span class="lineno"> 3065</span>  <span class="comment">// merger with our parent</span></div><div class="line"><a name="l03066"></a><span class="lineno"> 3066</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((left_inner == <span class="keyword">nullptr</span> || left_inner->is_few()) &&</div><div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>  (right_inner == <span class="keyword">nullptr</span> || right_inner->is_few()))</div><div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>  {</div><div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>  <span class="keywordflow">if</span> (left_parent == parent) {</div><div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>  myres |= merge_inner(</div><div class="line"><a name="l03071"></a><span class="lineno"> 3071</span>  left_inner, inner, left_parent, parentslot - 1);</div><div class="line"><a name="l03072"></a><span class="lineno"> 3072</span>  }</div><div class="line"><a name="l03073"></a><span class="lineno"> 3073</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>  myres |= merge_inner(</div><div class="line"><a name="l03075"></a><span class="lineno"> 3075</span>  inner, right_inner, right_parent, parentslot);</div><div class="line"><a name="l03076"></a><span class="lineno"> 3076</span>  }</div><div class="line"><a name="l03077"></a><span class="lineno"> 3077</span>  }</div><div class="line"><a name="l03078"></a><span class="lineno"> 3078</span>  <span class="comment">// case : the right leaf has extra data, so balance right with</span></div><div class="line"><a name="l03079"></a><span class="lineno"> 3079</span>  <span class="comment">// current</span></div><div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((left_inner != <span class="keyword">nullptr</span> && left_inner->is_few()) &&</div><div class="line"><a name="l03081"></a><span class="lineno"> 3081</span>  (right_inner != <span class="keyword">nullptr</span> && !right_inner->is_few()))</div><div class="line"><a name="l03082"></a><span class="lineno"> 3082</span>  {</div><div class="line"><a name="l03083"></a><span class="lineno"> 3083</span>  <span class="keywordflow">if</span> (right_parent == parent) {</div><div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>  shift_left_inner(</div><div class="line"><a name="l03085"></a><span class="lineno"> 3085</span>  inner, right_inner, right_parent, parentslot);</div><div class="line"><a name="l03086"></a><span class="lineno"> 3086</span>  }</div><div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l03088"></a><span class="lineno"> 3088</span>  myres |= merge_inner(</div><div class="line"><a name="l03089"></a><span class="lineno"> 3089</span>  left_inner, inner, left_parent, parentslot - 1);</div><div class="line"><a name="l03090"></a><span class="lineno"> 3090</span>  }</div><div class="line"><a name="l03091"></a><span class="lineno"> 3091</span>  }</div><div class="line"><a name="l03092"></a><span class="lineno"> 3092</span>  <span class="comment">// case : the left leaf has extra data, so balance left with</span></div><div class="line"><a name="l03093"></a><span class="lineno"> 3093</span>  <span class="comment">// current</span></div><div class="line"><a name="l03094"></a><span class="lineno"> 3094</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((left_inner != <span class="keyword">nullptr</span> && !left_inner->is_few()) &&</div><div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>  (right_inner != <span class="keyword">nullptr</span> && right_inner->is_few()))</div><div class="line"><a name="l03096"></a><span class="lineno"> 3096</span>  {</div><div class="line"><a name="l03097"></a><span class="lineno"> 3097</span>  <span class="keywordflow">if</span> (left_parent == parent) {</div><div class="line"><a name="l03098"></a><span class="lineno"> 3098</span>  shift_right_inner(</div><div class="line"><a name="l03099"></a><span class="lineno"> 3099</span>  left_inner, inner, left_parent, parentslot - 1);</div><div class="line"><a name="l03100"></a><span class="lineno"> 3100</span>  }</div><div class="line"><a name="l03101"></a><span class="lineno"> 3101</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l03102"></a><span class="lineno"> 3102</span>  myres |= merge_inner(</div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>  inner, right_inner, right_parent, parentslot);</div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>  }</div><div class="line"><a name="l03105"></a><span class="lineno"> 3105</span>  }</div><div class="line"><a name="l03106"></a><span class="lineno"> 3106</span>  <span class="comment">// case : both the leaf and right leaves have extra data and our</span></div><div class="line"><a name="l03107"></a><span class="lineno"> 3107</span>  <span class="comment">// parent, choose the leaf with more data</span></div><div class="line"><a name="l03108"></a><span class="lineno"> 3108</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (left_parent == right_parent)</div><div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>  {</div><div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>  <span class="keywordflow">if</span> (left_inner->slotuse <= right_inner->slotuse) {</div><div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>  shift_left_inner(</div><div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>  inner, right_inner, right_parent, parentslot);</div><div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>  }</div><div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>  shift_right_inner(</div><div class="line"><a name="l03116"></a><span class="lineno"> 3116</span>  left_inner, inner, left_parent, parentslot - 1);</div><div class="line"><a name="l03117"></a><span class="lineno"> 3117</span>  }</div><div class="line"><a name="l03118"></a><span class="lineno"> 3118</span>  }</div><div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>  {</div><div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>  <span class="keywordflow">if</span> (left_parent == parent) {</div><div class="line"><a name="l03122"></a><span class="lineno"> 3122</span>  shift_right_inner(</div><div class="line"><a name="l03123"></a><span class="lineno"> 3123</span>  left_inner, inner, left_parent, parentslot - 1);</div><div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>  }</div><div class="line"><a name="l03125"></a><span class="lineno"> 3125</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l03126"></a><span class="lineno"> 3126</span>  shift_left_inner(</div><div class="line"><a name="l03127"></a><span class="lineno"> 3127</span>  inner, right_inner, right_parent, parentslot);</div><div class="line"><a name="l03128"></a><span class="lineno"> 3128</span>  }</div><div class="line"><a name="l03129"></a><span class="lineno"> 3129</span>  }</div><div class="line"><a name="l03130"></a><span class="lineno"> 3130</span>  }</div><div class="line"><a name="l03131"></a><span class="lineno"> 3131</span> </div><div class="line"><a name="l03132"></a><span class="lineno"> 3132</span>  <span class="keywordflow">return</span> myres;</div><div class="line"><a name="l03133"></a><span class="lineno"> 3133</span>  }</div><div class="line"><a name="l03134"></a><span class="lineno"> 3134</span>  }</div><div class="line"><a name="l03135"></a><span class="lineno"> 3135</span> <span class="comment"></span></div><div class="line"><a name="l03136"></a><span class="lineno"> 3136</span> <span class="comment"> //! Merge two leaf nodes. The function moves all key/data pairs from right</span></div><div class="line"><a name="l03137"></a><span class="lineno"> 3137</span> <span class="comment"> //! to left and sets right's slotuse to zero. The right slot is then removed</span></div><div class="line"><a name="l03138"></a><span class="lineno"> 3138</span> <span class="comment"> //! by the calling parent node.</span></div><div class="line"><a name="l03139"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#ae62fda6629d06db7d6fdcd3e81916932"> 3139</a></span> <span class="comment"></span> result_t <a class="code" href="classtlx_1_1BTree.html#ae62fda6629d06db7d6fdcd3e81916932">merge_leaves</a>(LeafNode* left, LeafNode* right,</div><div class="line"><a name="l03140"></a><span class="lineno"> 3140</span>  InnerNode* parent) {</div><div class="line"><a name="l03141"></a><span class="lineno"> 3141</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"Merge leaf nodes "</span> << left << <span class="stringliteral">" and "</span> << right <<</div><div class="line"><a name="l03142"></a><span class="lineno"> 3142</span>  <span class="stringliteral">" with common parent "</span> << parent << <span class="stringliteral">"."</span>);</div><div class="line"><a name="l03143"></a><span class="lineno"> 3143</span>  (void)parent;</div><div class="line"><a name="l03144"></a><span class="lineno"> 3144</span> </div><div class="line"><a name="l03145"></a><span class="lineno"> 3145</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left->is_leafnode() && right->is_leafnode());</div><div class="line"><a name="l03146"></a><span class="lineno"> 3146</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->level == 1);</div><div class="line"><a name="l03147"></a><span class="lineno"> 3147</span> </div><div class="line"><a name="l03148"></a><span class="lineno"> 3148</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left->slotuse + right->slotuse < leaf_slotmax);</div><div class="line"><a name="l03149"></a><span class="lineno"> 3149</span> </div><div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>  std::copy(right->slotdata, right->slotdata + right->slotuse,</div><div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>  left->slotdata + left->slotuse);</div><div class="line"><a name="l03152"></a><span class="lineno"> 3152</span> </div><div class="line"><a name="l03153"></a><span class="lineno"> 3153</span>  left->slotuse += right->slotuse;</div><div class="line"><a name="l03154"></a><span class="lineno"> 3154</span> </div><div class="line"><a name="l03155"></a><span class="lineno"> 3155</span>  left->next_leaf = right->next_leaf;</div><div class="line"><a name="l03156"></a><span class="lineno"> 3156</span>  <span class="keywordflow">if</span> (left->next_leaf)</div><div class="line"><a name="l03157"></a><span class="lineno"> 3157</span>  left->next_leaf->prev_leaf = left;</div><div class="line"><a name="l03158"></a><span class="lineno"> 3158</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03159"></a><span class="lineno"> 3159</span>  tail_leaf_ = left;</div><div class="line"><a name="l03160"></a><span class="lineno"> 3160</span> </div><div class="line"><a name="l03161"></a><span class="lineno"> 3161</span>  right->slotuse = 0;</div><div class="line"><a name="l03162"></a><span class="lineno"> 3162</span> </div><div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>  <span class="keywordflow">return</span> btree_fixmerge;</div><div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>  }</div><div class="line"><a name="l03165"></a><span class="lineno"> 3165</span> <span class="comment"></span></div><div class="line"><a name="l03166"></a><span class="lineno"> 3166</span> <span class="comment"> //! Merge two inner nodes. The function moves all key/childid pairs from</span></div><div class="line"><a name="l03167"></a><span class="lineno"> 3167</span> <span class="comment"> //! right to left and sets right's slotuse to zero. The right slot is then</span></div><div class="line"><a name="l03168"></a><span class="lineno"> 3168</span> <span class="comment"> //! removed by the calling parent node.</span></div><div class="line"><a name="l03169"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a05f41c2452c5416a662e8176af0a97b7"> 3169</a></span> <span class="comment"></span> <span class="keyword">static</span> result_t <a class="code" href="classtlx_1_1BTree.html#a05f41c2452c5416a662e8176af0a97b7">merge_inner</a>(InnerNode* left, InnerNode* right,</div><div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>  InnerNode* parent, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> parentslot) {</div><div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"Merge inner nodes "</span> << left << <span class="stringliteral">" and "</span> << right <<</div><div class="line"><a name="l03172"></a><span class="lineno"> 3172</span>  <span class="stringliteral">" with common parent "</span> << parent << <span class="stringliteral">"."</span>);</div><div class="line"><a name="l03173"></a><span class="lineno"> 3173</span> </div><div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left->level == right->level);</div><div class="line"><a name="l03175"></a><span class="lineno"> 3175</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->level == left->level + 1);</div><div class="line"><a name="l03176"></a><span class="lineno"> 3176</span> </div><div class="line"><a name="l03177"></a><span class="lineno"> 3177</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[parentslot] == left);</div><div class="line"><a name="l03178"></a><span class="lineno"> 3178</span> </div><div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left->slotuse + right->slotuse < inner_slotmax);</div><div class="line"><a name="l03180"></a><span class="lineno"> 3180</span> </div><div class="line"><a name="l03181"></a><span class="lineno"> 3181</span>  <span class="keywordflow">if</span> (self_verify)</div><div class="line"><a name="l03182"></a><span class="lineno"> 3182</span>  {</div><div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>  <span class="comment">// find the left node's slot in the parent's children</span></div><div class="line"><a name="l03184"></a><span class="lineno"> 3184</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> leftslot = 0;</div><div class="line"><a name="l03185"></a><span class="lineno"> 3185</span>  <span class="keywordflow">while</span> (leftslot <= parent->slotuse &&</div><div class="line"><a name="l03186"></a><span class="lineno"> 3186</span>  parent->childid[leftslot] != left)</div><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span>  ++leftslot;</div><div class="line"><a name="l03188"></a><span class="lineno"> 3188</span> </div><div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(leftslot < parent->slotuse);</div><div class="line"><a name="l03190"></a><span class="lineno"> 3190</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[leftslot] == left);</div><div class="line"><a name="l03191"></a><span class="lineno"> 3191</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[leftslot + 1] == right);</div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</span> </div><div class="line"><a name="l03193"></a><span class="lineno"> 3193</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parentslot == leftslot);</div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span>  }</div><div class="line"><a name="l03195"></a><span class="lineno"> 3195</span> </div><div class="line"><a name="l03196"></a><span class="lineno"> 3196</span>  <span class="comment">// retrieve the decision key from parent</span></div><div class="line"><a name="l03197"></a><span class="lineno"> 3197</span>  left->slotkey[left->slotuse] = parent->slotkey[parentslot];</div><div class="line"><a name="l03198"></a><span class="lineno"> 3198</span>  left->slotuse++;</div><div class="line"><a name="l03199"></a><span class="lineno"> 3199</span> </div><div class="line"><a name="l03200"></a><span class="lineno"> 3200</span>  <span class="comment">// copy over keys and children from right</span></div><div class="line"><a name="l03201"></a><span class="lineno"> 3201</span>  std::copy(right->slotkey, right->slotkey + right->slotuse,</div><div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>  left->slotkey + left->slotuse);</div><div class="line"><a name="l03203"></a><span class="lineno"> 3203</span>  std::copy(right->childid, right->childid + right->slotuse + 1,</div><div class="line"><a name="l03204"></a><span class="lineno"> 3204</span>  left->childid + left->slotuse);</div><div class="line"><a name="l03205"></a><span class="lineno"> 3205</span> </div><div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>  left->slotuse += right->slotuse;</div><div class="line"><a name="l03207"></a><span class="lineno"> 3207</span>  right->slotuse = 0;</div><div class="line"><a name="l03208"></a><span class="lineno"> 3208</span> </div><div class="line"><a name="l03209"></a><span class="lineno"> 3209</span>  <span class="keywordflow">return</span> btree_fixmerge;</div><div class="line"><a name="l03210"></a><span class="lineno"> 3210</span>  }</div><div class="line"><a name="l03211"></a><span class="lineno"> 3211</span> <span class="comment"></span></div><div class="line"><a name="l03212"></a><span class="lineno"> 3212</span> <span class="comment"> //! Balance two leaf nodes. The function moves key/data pairs from right to</span></div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span> <span class="comment"> //! left so that both nodes are equally filled. The parent node is updated</span></div><div class="line"><a name="l03214"></a><span class="lineno"> 3214</span> <span class="comment"> //! if possible.</span></div><div class="line"><a name="l03215"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#ae301448f117e44063d3b322be3534c13"> 3215</a></span> <span class="comment"></span> <span class="keyword">static</span> result_t <a class="code" href="classtlx_1_1BTree.html#ae301448f117e44063d3b322be3534c13">shift_left_leaf</a>(</div><div class="line"><a name="l03216"></a><span class="lineno"> 3216</span>  LeafNode* left, LeafNode* right,</div><div class="line"><a name="l03217"></a><span class="lineno"> 3217</span>  InnerNode* parent, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> parentslot) {</div><div class="line"><a name="l03218"></a><span class="lineno"> 3218</span> </div><div class="line"><a name="l03219"></a><span class="lineno"> 3219</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left->is_leafnode() && right->is_leafnode());</div><div class="line"><a name="l03220"></a><span class="lineno"> 3220</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->level == 1);</div><div class="line"><a name="l03221"></a><span class="lineno"> 3221</span> </div><div class="line"><a name="l03222"></a><span class="lineno"> 3222</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left->next_leaf == right);</div><div class="line"><a name="l03223"></a><span class="lineno"> 3223</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left == right->prev_leaf);</div><div class="line"><a name="l03224"></a><span class="lineno"> 3224</span> </div><div class="line"><a name="l03225"></a><span class="lineno"> 3225</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left->slotuse < right->slotuse);</div><div class="line"><a name="l03226"></a><span class="lineno"> 3226</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[parentslot] == left);</div><div class="line"><a name="l03227"></a><span class="lineno"> 3227</span> </div><div class="line"><a name="l03228"></a><span class="lineno"> 3228</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> shiftnum = (right->slotuse - left->slotuse) >> 1;</div><div class="line"><a name="l03229"></a><span class="lineno"> 3229</span> </div><div class="line"><a name="l03230"></a><span class="lineno"> 3230</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"Shifting (leaf) "</span> << shiftnum << <span class="stringliteral">" entries to left "</span> <<</div><div class="line"><a name="l03231"></a><span class="lineno"> 3231</span>  left << <span class="stringliteral">" from right "</span> << right <<</div><div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>  <span class="stringliteral">" with common parent "</span> << parent << <span class="stringliteral">"."</span>);</div><div class="line"><a name="l03233"></a><span class="lineno"> 3233</span> </div><div class="line"><a name="l03234"></a><span class="lineno"> 3234</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left->slotuse + shiftnum < leaf_slotmax);</div><div class="line"><a name="l03235"></a><span class="lineno"> 3235</span> </div><div class="line"><a name="l03236"></a><span class="lineno"> 3236</span>  <span class="comment">// copy the first items from the right node to the last slot in the left</span></div><div class="line"><a name="l03237"></a><span class="lineno"> 3237</span>  <span class="comment">// node.</span></div><div class="line"><a name="l03238"></a><span class="lineno"> 3238</span> </div><div class="line"><a name="l03239"></a><span class="lineno"> 3239</span>  std::copy(right->slotdata, right->slotdata + shiftnum,</div><div class="line"><a name="l03240"></a><span class="lineno"> 3240</span>  left->slotdata + left->slotuse);</div><div class="line"><a name="l03241"></a><span class="lineno"> 3241</span> </div><div class="line"><a name="l03242"></a><span class="lineno"> 3242</span>  left->slotuse += shiftnum;</div><div class="line"><a name="l03243"></a><span class="lineno"> 3243</span> </div><div class="line"><a name="l03244"></a><span class="lineno"> 3244</span>  <span class="comment">// shift all slots in the right node to the left</span></div><div class="line"><a name="l03245"></a><span class="lineno"> 3245</span> </div><div class="line"><a name="l03246"></a><span class="lineno"> 3246</span>  std::copy(right->slotdata + shiftnum, right->slotdata + right->slotuse,</div><div class="line"><a name="l03247"></a><span class="lineno"> 3247</span>  right->slotdata);</div><div class="line"><a name="l03248"></a><span class="lineno"> 3248</span> </div><div class="line"><a name="l03249"></a><span class="lineno"> 3249</span>  right->slotuse -= shiftnum;</div><div class="line"><a name="l03250"></a><span class="lineno"> 3250</span> </div><div class="line"><a name="l03251"></a><span class="lineno"> 3251</span>  <span class="comment">// fixup parent</span></div><div class="line"><a name="l03252"></a><span class="lineno"> 3252</span>  <span class="keywordflow">if</span> (parentslot < parent->slotuse) {</div><div class="line"><a name="l03253"></a><span class="lineno"> 3253</span>  parent->slotkey[parentslot] = left->key(left->slotuse - 1);</div><div class="line"><a name="l03254"></a><span class="lineno"> 3254</span>  <span class="keywordflow">return</span> btree_ok;</div><div class="line"><a name="l03255"></a><span class="lineno"> 3255</span>  }</div><div class="line"><a name="l03256"></a><span class="lineno"> 3256</span>  <span class="keywordflow">else</span> { <span class="comment">// the update is further up the tree</span></div><div class="line"><a name="l03257"></a><span class="lineno"> 3257</span>  <span class="keywordflow">return</span> result_t(btree_update_lastkey, left->key(left->slotuse - 1));</div><div class="line"><a name="l03258"></a><span class="lineno"> 3258</span>  }</div><div class="line"><a name="l03259"></a><span class="lineno"> 3259</span>  }</div><div class="line"><a name="l03260"></a><span class="lineno"> 3260</span> <span class="comment"></span></div><div class="line"><a name="l03261"></a><span class="lineno"> 3261</span> <span class="comment"> //! Balance two inner nodes. The function moves key/data pairs from right to</span></div><div class="line"><a name="l03262"></a><span class="lineno"> 3262</span> <span class="comment"> //! left so that both nodes are equally filled. The parent node is updated</span></div><div class="line"><a name="l03263"></a><span class="lineno"> 3263</span> <span class="comment"> //! if possible.</span></div><div class="line"><a name="l03264"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a22c8a3da26251dfccff50c8bb174c3a4"> 3264</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtlx_1_1BTree.html#a22c8a3da26251dfccff50c8bb174c3a4">shift_left_inner</a>(InnerNode* left, InnerNode* right,</div><div class="line"><a name="l03265"></a><span class="lineno"> 3265</span>  InnerNode* parent, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> parentslot) {</div><div class="line"><a name="l03266"></a><span class="lineno"> 3266</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left->level == right->level);</div><div class="line"><a name="l03267"></a><span class="lineno"> 3267</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->level == left->level + 1);</div><div class="line"><a name="l03268"></a><span class="lineno"> 3268</span> </div><div class="line"><a name="l03269"></a><span class="lineno"> 3269</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left->slotuse < right->slotuse);</div><div class="line"><a name="l03270"></a><span class="lineno"> 3270</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[parentslot] == left);</div><div class="line"><a name="l03271"></a><span class="lineno"> 3271</span> </div><div class="line"><a name="l03272"></a><span class="lineno"> 3272</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> shiftnum = (right->slotuse - left->slotuse) >> 1;</div><div class="line"><a name="l03273"></a><span class="lineno"> 3273</span> </div><div class="line"><a name="l03274"></a><span class="lineno"> 3274</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"Shifting (inner) "</span> << shiftnum <<</div><div class="line"><a name="l03275"></a><span class="lineno"> 3275</span>  <span class="stringliteral">" entries to left "</span> << left <<</div><div class="line"><a name="l03276"></a><span class="lineno"> 3276</span>  <span class="stringliteral">" from right "</span> << right <<</div><div class="line"><a name="l03277"></a><span class="lineno"> 3277</span>  <span class="stringliteral">" with common parent "</span> << parent << <span class="stringliteral">"."</span>);</div><div class="line"><a name="l03278"></a><span class="lineno"> 3278</span> </div><div class="line"><a name="l03279"></a><span class="lineno"> 3279</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left->slotuse + shiftnum < inner_slotmax);</div><div class="line"><a name="l03280"></a><span class="lineno"> 3280</span> </div><div class="line"><a name="l03281"></a><span class="lineno"> 3281</span>  <span class="keywordflow">if</span> (self_verify)</div><div class="line"><a name="l03282"></a><span class="lineno"> 3282</span>  {</div><div class="line"><a name="l03283"></a><span class="lineno"> 3283</span>  <span class="comment">// find the left node's slot in the parent's children and compare to</span></div><div class="line"><a name="l03284"></a><span class="lineno"> 3284</span>  <span class="comment">// parentslot</span></div><div class="line"><a name="l03285"></a><span class="lineno"> 3285</span> </div><div class="line"><a name="l03286"></a><span class="lineno"> 3286</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> leftslot = 0;</div><div class="line"><a name="l03287"></a><span class="lineno"> 3287</span>  <span class="keywordflow">while</span> (leftslot <= parent->slotuse &&</div><div class="line"><a name="l03288"></a><span class="lineno"> 3288</span>  parent->childid[leftslot] != left)</div><div class="line"><a name="l03289"></a><span class="lineno"> 3289</span>  ++leftslot;</div><div class="line"><a name="l03290"></a><span class="lineno"> 3290</span> </div><div class="line"><a name="l03291"></a><span class="lineno"> 3291</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(leftslot < parent->slotuse);</div><div class="line"><a name="l03292"></a><span class="lineno"> 3292</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[leftslot] == left);</div><div class="line"><a name="l03293"></a><span class="lineno"> 3293</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[leftslot + 1] == right);</div><div class="line"><a name="l03294"></a><span class="lineno"> 3294</span> </div><div class="line"><a name="l03295"></a><span class="lineno"> 3295</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(leftslot == parentslot);</div><div class="line"><a name="l03296"></a><span class="lineno"> 3296</span>  }</div><div class="line"><a name="l03297"></a><span class="lineno"> 3297</span> </div><div class="line"><a name="l03298"></a><span class="lineno"> 3298</span>  <span class="comment">// copy the parent's decision slotkey and childid to the first new key</span></div><div class="line"><a name="l03299"></a><span class="lineno"> 3299</span>  <span class="comment">// on the left</span></div><div class="line"><a name="l03300"></a><span class="lineno"> 3300</span>  left->slotkey[left->slotuse] = parent->slotkey[parentslot];</div><div class="line"><a name="l03301"></a><span class="lineno"> 3301</span>  left->slotuse++;</div><div class="line"><a name="l03302"></a><span class="lineno"> 3302</span> </div><div class="line"><a name="l03303"></a><span class="lineno"> 3303</span>  <span class="comment">// copy the other items from the right node to the last slots in the</span></div><div class="line"><a name="l03304"></a><span class="lineno"> 3304</span>  <span class="comment">// left node.</span></div><div class="line"><a name="l03305"></a><span class="lineno"> 3305</span>  std::copy(right->slotkey, right->slotkey + shiftnum - 1,</div><div class="line"><a name="l03306"></a><span class="lineno"> 3306</span>  left->slotkey + left->slotuse);</div><div class="line"><a name="l03307"></a><span class="lineno"> 3307</span>  std::copy(right->childid, right->childid + shiftnum,</div><div class="line"><a name="l03308"></a><span class="lineno"> 3308</span>  left->childid + left->slotuse);</div><div class="line"><a name="l03309"></a><span class="lineno"> 3309</span> </div><div class="line"><a name="l03310"></a><span class="lineno"> 3310</span>  left->slotuse += shiftnum - 1;</div><div class="line"><a name="l03311"></a><span class="lineno"> 3311</span> </div><div class="line"><a name="l03312"></a><span class="lineno"> 3312</span>  <span class="comment">// fixup parent</span></div><div class="line"><a name="l03313"></a><span class="lineno"> 3313</span>  parent->slotkey[parentslot] = right->slotkey[shiftnum - 1];</div><div class="line"><a name="l03314"></a><span class="lineno"> 3314</span> </div><div class="line"><a name="l03315"></a><span class="lineno"> 3315</span>  <span class="comment">// shift all slots in the right node</span></div><div class="line"><a name="l03316"></a><span class="lineno"> 3316</span>  std::copy(</div><div class="line"><a name="l03317"></a><span class="lineno"> 3317</span>  right->slotkey + shiftnum, right->slotkey + right->slotuse,</div><div class="line"><a name="l03318"></a><span class="lineno"> 3318</span>  right->slotkey);</div><div class="line"><a name="l03319"></a><span class="lineno"> 3319</span>  std::copy(</div><div class="line"><a name="l03320"></a><span class="lineno"> 3320</span>  right->childid + shiftnum, right->childid + right->slotuse + 1,</div><div class="line"><a name="l03321"></a><span class="lineno"> 3321</span>  right->childid);</div><div class="line"><a name="l03322"></a><span class="lineno"> 3322</span> </div><div class="line"><a name="l03323"></a><span class="lineno"> 3323</span>  right->slotuse -= shiftnum;</div><div class="line"><a name="l03324"></a><span class="lineno"> 3324</span>  }</div><div class="line"><a name="l03325"></a><span class="lineno"> 3325</span> <span class="comment"></span></div><div class="line"><a name="l03326"></a><span class="lineno"> 3326</span> <span class="comment"> //! Balance two leaf nodes. The function moves key/data pairs from left to</span></div><div class="line"><a name="l03327"></a><span class="lineno"> 3327</span> <span class="comment"> //! right so that both nodes are equally filled. The parent node is updated</span></div><div class="line"><a name="l03328"></a><span class="lineno"> 3328</span> <span class="comment"> //! if possible.</span></div><div class="line"><a name="l03329"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a8169e809b9e94043b7aa6c5d9847fb19"> 3329</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtlx_1_1BTree.html#a8169e809b9e94043b7aa6c5d9847fb19">shift_right_leaf</a>(LeafNode* left, LeafNode* right,</div><div class="line"><a name="l03330"></a><span class="lineno"> 3330</span>  InnerNode* parent, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> parentslot) {</div><div class="line"><a name="l03331"></a><span class="lineno"> 3331</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left->is_leafnode() && right->is_leafnode());</div><div class="line"><a name="l03332"></a><span class="lineno"> 3332</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->level == 1);</div><div class="line"><a name="l03333"></a><span class="lineno"> 3333</span> </div><div class="line"><a name="l03334"></a><span class="lineno"> 3334</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left->next_leaf == right);</div><div class="line"><a name="l03335"></a><span class="lineno"> 3335</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left == right->prev_leaf);</div><div class="line"><a name="l03336"></a><span class="lineno"> 3336</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[parentslot] == left);</div><div class="line"><a name="l03337"></a><span class="lineno"> 3337</span> </div><div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left->slotuse > right->slotuse);</div><div class="line"><a name="l03339"></a><span class="lineno"> 3339</span> </div><div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> shiftnum = (left->slotuse - right->slotuse) >> 1;</div><div class="line"><a name="l03341"></a><span class="lineno"> 3341</span> </div><div class="line"><a name="l03342"></a><span class="lineno"> 3342</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"Shifting (leaf) "</span> << shiftnum <<</div><div class="line"><a name="l03343"></a><span class="lineno"> 3343</span>  <span class="stringliteral">" entries to right "</span> << right <<</div><div class="line"><a name="l03344"></a><span class="lineno"> 3344</span>  <span class="stringliteral">" from left "</span> << left <<</div><div class="line"><a name="l03345"></a><span class="lineno"> 3345</span>  <span class="stringliteral">" with common parent "</span> << parent << <span class="stringliteral">"."</span>);</div><div class="line"><a name="l03346"></a><span class="lineno"> 3346</span> </div><div class="line"><a name="l03347"></a><span class="lineno"> 3347</span>  <span class="keywordflow">if</span> (self_verify)</div><div class="line"><a name="l03348"></a><span class="lineno"> 3348</span>  {</div><div class="line"><a name="l03349"></a><span class="lineno"> 3349</span>  <span class="comment">// find the left node's slot in the parent's children</span></div><div class="line"><a name="l03350"></a><span class="lineno"> 3350</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> leftslot = 0;</div><div class="line"><a name="l03351"></a><span class="lineno"> 3351</span>  <span class="keywordflow">while</span> (leftslot <= parent->slotuse &&</div><div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>  parent->childid[leftslot] != left)</div><div class="line"><a name="l03353"></a><span class="lineno"> 3353</span>  ++leftslot;</div><div class="line"><a name="l03354"></a><span class="lineno"> 3354</span> </div><div class="line"><a name="l03355"></a><span class="lineno"> 3355</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(leftslot < parent->slotuse);</div><div class="line"><a name="l03356"></a><span class="lineno"> 3356</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[leftslot] == left);</div><div class="line"><a name="l03357"></a><span class="lineno"> 3357</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[leftslot + 1] == right);</div><div class="line"><a name="l03358"></a><span class="lineno"> 3358</span> </div><div class="line"><a name="l03359"></a><span class="lineno"> 3359</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(leftslot == parentslot);</div><div class="line"><a name="l03360"></a><span class="lineno"> 3360</span>  }</div><div class="line"><a name="l03361"></a><span class="lineno"> 3361</span> </div><div class="line"><a name="l03362"></a><span class="lineno"> 3362</span>  <span class="comment">// shift all slots in the right node</span></div><div class="line"><a name="l03363"></a><span class="lineno"> 3363</span> </div><div class="line"><a name="l03364"></a><span class="lineno"> 3364</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(right->slotuse + shiftnum < leaf_slotmax);</div><div class="line"><a name="l03365"></a><span class="lineno"> 3365</span> </div><div class="line"><a name="l03366"></a><span class="lineno"> 3366</span>  std::copy_backward(right->slotdata, right->slotdata + right->slotuse,</div><div class="line"><a name="l03367"></a><span class="lineno"> 3367</span>  right->slotdata + right->slotuse + shiftnum);</div><div class="line"><a name="l03368"></a><span class="lineno"> 3368</span> </div><div class="line"><a name="l03369"></a><span class="lineno"> 3369</span>  right->slotuse += shiftnum;</div><div class="line"><a name="l03370"></a><span class="lineno"> 3370</span> </div><div class="line"><a name="l03371"></a><span class="lineno"> 3371</span>  <span class="comment">// copy the last items from the left node to the first slot in the right</span></div><div class="line"><a name="l03372"></a><span class="lineno"> 3372</span>  <span class="comment">// node.</span></div><div class="line"><a name="l03373"></a><span class="lineno"> 3373</span>  std::copy(left->slotdata + left->slotuse - shiftnum,</div><div class="line"><a name="l03374"></a><span class="lineno"> 3374</span>  left->slotdata + left->slotuse,</div><div class="line"><a name="l03375"></a><span class="lineno"> 3375</span>  right->slotdata);</div><div class="line"><a name="l03376"></a><span class="lineno"> 3376</span> </div><div class="line"><a name="l03377"></a><span class="lineno"> 3377</span>  left->slotuse -= shiftnum;</div><div class="line"><a name="l03378"></a><span class="lineno"> 3378</span> </div><div class="line"><a name="l03379"></a><span class="lineno"> 3379</span>  parent->slotkey[parentslot] = left->key(left->slotuse - 1);</div><div class="line"><a name="l03380"></a><span class="lineno"> 3380</span>  }</div><div class="line"><a name="l03381"></a><span class="lineno"> 3381</span> <span class="comment"></span></div><div class="line"><a name="l03382"></a><span class="lineno"> 3382</span> <span class="comment"> //! Balance two inner nodes. The function moves key/data pairs from left to</span></div><div class="line"><a name="l03383"></a><span class="lineno"> 3383</span> <span class="comment"> //! right so that both nodes are equally filled. The parent node is updated</span></div><div class="line"><a name="l03384"></a><span class="lineno"> 3384</span> <span class="comment"> //! if possible.</span></div><div class="line"><a name="l03385"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a3e25d4b9f9efb4a5496dcf849836fe16"> 3385</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classtlx_1_1BTree.html#a3e25d4b9f9efb4a5496dcf849836fe16">shift_right_inner</a>(InnerNode* left, InnerNode* right,</div><div class="line"><a name="l03386"></a><span class="lineno"> 3386</span>  InnerNode* parent, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> parentslot) {</div><div class="line"><a name="l03387"></a><span class="lineno"> 3387</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left->level == right->level);</div><div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->level == left->level + 1);</div><div class="line"><a name="l03389"></a><span class="lineno"> 3389</span> </div><div class="line"><a name="l03390"></a><span class="lineno"> 3390</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(left->slotuse > right->slotuse);</div><div class="line"><a name="l03391"></a><span class="lineno"> 3391</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[parentslot] == left);</div><div class="line"><a name="l03392"></a><span class="lineno"> 3392</span> </div><div class="line"><a name="l03393"></a><span class="lineno"> 3393</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> shiftnum = (left->slotuse - right->slotuse) >> 1;</div><div class="line"><a name="l03394"></a><span class="lineno"> 3394</span> </div><div class="line"><a name="l03395"></a><span class="lineno"> 3395</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"Shifting (leaf) "</span> << shiftnum <<</div><div class="line"><a name="l03396"></a><span class="lineno"> 3396</span>  <span class="stringliteral">" entries to right "</span> << right <<</div><div class="line"><a name="l03397"></a><span class="lineno"> 3397</span>  <span class="stringliteral">" from left "</span> << left <<</div><div class="line"><a name="l03398"></a><span class="lineno"> 3398</span>  <span class="stringliteral">" with common parent "</span> << parent << <span class="stringliteral">"."</span>);</div><div class="line"><a name="l03399"></a><span class="lineno"> 3399</span> </div><div class="line"><a name="l03400"></a><span class="lineno"> 3400</span>  <span class="keywordflow">if</span> (self_verify)</div><div class="line"><a name="l03401"></a><span class="lineno"> 3401</span>  {</div><div class="line"><a name="l03402"></a><span class="lineno"> 3402</span>  <span class="comment">// find the left node's slot in the parent's children</span></div><div class="line"><a name="l03403"></a><span class="lineno"> 3403</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> leftslot = 0;</div><div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>  <span class="keywordflow">while</span> (leftslot <= parent->slotuse &&</div><div class="line"><a name="l03405"></a><span class="lineno"> 3405</span>  parent->childid[leftslot] != left)</div><div class="line"><a name="l03406"></a><span class="lineno"> 3406</span>  ++leftslot;</div><div class="line"><a name="l03407"></a><span class="lineno"> 3407</span> </div><div class="line"><a name="l03408"></a><span class="lineno"> 3408</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(leftslot < parent->slotuse);</div><div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[leftslot] == left);</div><div class="line"><a name="l03410"></a><span class="lineno"> 3410</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(parent->childid[leftslot + 1] == right);</div><div class="line"><a name="l03411"></a><span class="lineno"> 3411</span> </div><div class="line"><a name="l03412"></a><span class="lineno"> 3412</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(leftslot == parentslot);</div><div class="line"><a name="l03413"></a><span class="lineno"> 3413</span>  }</div><div class="line"><a name="l03414"></a><span class="lineno"> 3414</span> </div><div class="line"><a name="l03415"></a><span class="lineno"> 3415</span>  <span class="comment">// shift all slots in the right node</span></div><div class="line"><a name="l03416"></a><span class="lineno"> 3416</span> </div><div class="line"><a name="l03417"></a><span class="lineno"> 3417</span>  <a class="code" href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a>(right->slotuse + shiftnum < inner_slotmax);</div><div class="line"><a name="l03418"></a><span class="lineno"> 3418</span> </div><div class="line"><a name="l03419"></a><span class="lineno"> 3419</span>  std::copy_backward(</div><div class="line"><a name="l03420"></a><span class="lineno"> 3420</span>  right->slotkey, right->slotkey + right->slotuse,</div><div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>  right->slotkey + right->slotuse + shiftnum);</div><div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>  std::copy_backward(</div><div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>  right->childid, right->childid + right->slotuse + 1,</div><div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>  right->childid + right->slotuse + 1 + shiftnum);</div><div class="line"><a name="l03425"></a><span class="lineno"> 3425</span> </div><div class="line"><a name="l03426"></a><span class="lineno"> 3426</span>  right->slotuse += shiftnum;</div><div class="line"><a name="l03427"></a><span class="lineno"> 3427</span> </div><div class="line"><a name="l03428"></a><span class="lineno"> 3428</span>  <span class="comment">// copy the parent's decision slotkey and childid to the last new key on</span></div><div class="line"><a name="l03429"></a><span class="lineno"> 3429</span>  <span class="comment">// the right</span></div><div class="line"><a name="l03430"></a><span class="lineno"> 3430</span>  right->slotkey[shiftnum - 1] = parent->slotkey[parentslot];</div><div class="line"><a name="l03431"></a><span class="lineno"> 3431</span> </div><div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>  <span class="comment">// copy the remaining last items from the left node to the first slot in</span></div><div class="line"><a name="l03433"></a><span class="lineno"> 3433</span>  <span class="comment">// the right node.</span></div><div class="line"><a name="l03434"></a><span class="lineno"> 3434</span>  std::copy(left->slotkey + left->slotuse - shiftnum + 1,</div><div class="line"><a name="l03435"></a><span class="lineno"> 3435</span>  left->slotkey + left->slotuse,</div><div class="line"><a name="l03436"></a><span class="lineno"> 3436</span>  right->slotkey);</div><div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>  std::copy(left->childid + left->slotuse - shiftnum + 1,</div><div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>  left->childid + left->slotuse + 1,</div><div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>  right->childid);</div><div class="line"><a name="l03440"></a><span class="lineno"> 3440</span> </div><div class="line"><a name="l03441"></a><span class="lineno"> 3441</span>  <span class="comment">// copy the first to-be-removed key from the left node to the parent's</span></div><div class="line"><a name="l03442"></a><span class="lineno"> 3442</span>  <span class="comment">// decision slot</span></div><div class="line"><a name="l03443"></a><span class="lineno"> 3443</span>  parent->slotkey[parentslot] = left->slotkey[left->slotuse - shiftnum];</div><div class="line"><a name="l03444"></a><span class="lineno"> 3444</span> </div><div class="line"><a name="l03445"></a><span class="lineno"> 3445</span>  left->slotuse -= shiftnum;</div><div class="line"><a name="l03446"></a><span class="lineno"> 3446</span>  }</div><div class="line"><a name="l03447"></a><span class="lineno"> 3447</span> <span class="comment"></span></div><div class="line"><a name="l03448"></a><span class="lineno"> 3448</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l03449"></a><span class="lineno"> 3449</span> <span class="comment"></span></div><div class="line"><a name="l03450"></a><span class="lineno"> 3450</span> <span class="preprocessor">#ifdef TLX_BTREE_DEBUG</span></div><div class="line"><a name="l03451"></a><span class="lineno"> 3451</span> </div><div class="line"><a name="l03452"></a><span class="lineno"> 3452</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l03453"></a><span class="lineno"> 3453</span> <span class="comment"> //! \name Debug Printing</span></div><div class="line"><a name="l03454"></a><span class="lineno"> 3454</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l03455"></a><span class="lineno"> 3455</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l03456"></a><span class="lineno"> 3456</span> <span class="comment"> //! Print out the B+ tree structure with keys onto the given ostream. This</span></div><div class="line"><a name="l03457"></a><span class="lineno"> 3457</span> <span class="comment"> //! function requires that the header is compiled with TLX_BTREE_DEBUG and</span></div><div class="line"><a name="l03458"></a><span class="lineno"> 3458</span> <span class="comment"> //! that key_type is printable via std::ostream.</span></div><div class="line"><a name="l03459"></a><span class="lineno"> 3459</span> <span class="comment"></span> <span class="keywordtype">void</span> print(std::ostream& os)<span class="keyword"> const </span>{</div><div class="line"><a name="l03460"></a><span class="lineno"> 3460</span>  <span class="keywordflow">if</span> (root_) {</div><div class="line"><a name="l03461"></a><span class="lineno"> 3461</span>  print_node(os, root_, 0, <span class="keyword">true</span>);</div><div class="line"><a name="l03462"></a><span class="lineno"> 3462</span>  }</div><div class="line"><a name="l03463"></a><span class="lineno"> 3463</span>  }</div><div class="line"><a name="l03464"></a><span class="lineno"> 3464</span> <span class="comment"></span></div><div class="line"><a name="l03465"></a><span class="lineno"> 3465</span> <span class="comment"> //! Print out only the leaves via the double linked list.</span></div><div class="line"><a name="l03466"></a><span class="lineno"> 3466</span> <span class="comment"></span> <span class="keywordtype">void</span> print_leaves(std::ostream& os)<span class="keyword"> const </span>{</div><div class="line"><a name="l03467"></a><span class="lineno"> 3467</span>  os << <span class="stringliteral">"leaves:"</span> << std::endl;</div><div class="line"><a name="l03468"></a><span class="lineno"> 3468</span> </div><div class="line"><a name="l03469"></a><span class="lineno"> 3469</span>  <span class="keyword">const</span> LeafNode* n = head_leaf_;</div><div class="line"><a name="l03470"></a><span class="lineno"> 3470</span> </div><div class="line"><a name="l03471"></a><span class="lineno"> 3471</span>  <span class="keywordflow">while</span> (n)</div><div class="line"><a name="l03472"></a><span class="lineno"> 3472</span>  {</div><div class="line"><a name="l03473"></a><span class="lineno"> 3473</span>  os << <span class="stringliteral">" "</span> << n << std::endl;</div><div class="line"><a name="l03474"></a><span class="lineno"> 3474</span> </div><div class="line"><a name="l03475"></a><span class="lineno"> 3475</span>  n = n->next_leaf;</div><div class="line"><a name="l03476"></a><span class="lineno"> 3476</span>  }</div><div class="line"><a name="l03477"></a><span class="lineno"> 3477</span>  }</div><div class="line"><a name="l03478"></a><span class="lineno"> 3478</span> </div><div class="line"><a name="l03479"></a><span class="lineno"> 3479</span> <span class="keyword">private</span>:<span class="comment"></span></div><div class="line"><a name="l03480"></a><span class="lineno"> 3480</span> <span class="comment"> //! Recursively descend down the tree and print out nodes.</span></div><div class="line"><a name="l03481"></a><span class="lineno"> 3481</span> <span class="comment"></span> <span class="keyword">static</span> <span class="keywordtype">void</span> print_node(std::ostream& os, <span class="keyword">const</span> node* node,</div><div class="line"><a name="l03482"></a><span class="lineno"> 3482</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> depth = 0, <span class="keywordtype">bool</span> recursive = <span class="keyword">false</span>) {</div><div class="line"><a name="l03483"></a><span class="lineno"> 3483</span>  <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>;</div><div class="line"><a name="l03484"></a><span class="lineno"> 3484</span> </div><div class="line"><a name="l03485"></a><span class="lineno"> 3485</span>  os << <span class="stringliteral">"node "</span> << node << <span class="stringliteral">" level "</span> << node->level <<</div><div class="line"><a name="l03486"></a><span class="lineno"> 3486</span>  <span class="stringliteral">" slotuse "</span> << node->slotuse << std::endl;</div><div class="line"><a name="l03487"></a><span class="lineno"> 3487</span> </div><div class="line"><a name="l03488"></a><span class="lineno"> 3488</span>  <span class="keywordflow">if</span> (node->is_leafnode())</div><div class="line"><a name="l03489"></a><span class="lineno"> 3489</span>  {</div><div class="line"><a name="l03490"></a><span class="lineno"> 3490</span>  <span class="keyword">const</span> LeafNode* leafnode = <span class="keyword">static_cast<</span><span class="keyword">const </span>LeafNode*<span class="keyword">></span>(node);</div><div class="line"><a name="l03491"></a><span class="lineno"> 3491</span> </div><div class="line"><a name="l03492"></a><span class="lineno"> 3492</span>  <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>;</div><div class="line"><a name="l03493"></a><span class="lineno"> 3493</span>  os << <span class="stringliteral">" leaf prev "</span> << leafnode->prev_leaf <<</div><div class="line"><a name="l03494"></a><span class="lineno"> 3494</span>  <span class="stringliteral">" next "</span> << leafnode->next_leaf << std::endl;</div><div class="line"><a name="l03495"></a><span class="lineno"> 3495</span> </div><div class="line"><a name="l03496"></a><span class="lineno"> 3496</span>  <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>;</div><div class="line"><a name="l03497"></a><span class="lineno"> 3497</span> </div><div class="line"><a name="l03498"></a><span class="lineno"> 3498</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot < leafnode->slotuse; ++slot)</div><div class="line"><a name="l03499"></a><span class="lineno"> 3499</span>  {</div><div class="line"><a name="l03500"></a><span class="lineno"> 3500</span>  <span class="comment">// os << leafnode->key(slot) << " "</span></div><div class="line"><a name="l03501"></a><span class="lineno"> 3501</span>  <span class="comment">// << "(data: " << leafnode->slotdata[slot] << ") ";</span></div><div class="line"><a name="l03502"></a><span class="lineno"> 3502</span>  os << leafnode->key(slot) << <span class="stringliteral">" "</span>;</div><div class="line"><a name="l03503"></a><span class="lineno"> 3503</span>  }</div><div class="line"><a name="l03504"></a><span class="lineno"> 3504</span>  os << std::endl;</div><div class="line"><a name="l03505"></a><span class="lineno"> 3505</span>  }</div><div class="line"><a name="l03506"></a><span class="lineno"> 3506</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03507"></a><span class="lineno"> 3507</span>  {</div><div class="line"><a name="l03508"></a><span class="lineno"> 3508</span>  <span class="keyword">const</span> InnerNode* innernode = <span class="keyword">static_cast<</span><span class="keyword">const </span>InnerNode*<span class="keyword">></span>(node);</div><div class="line"><a name="l03509"></a><span class="lineno"> 3509</span> </div><div class="line"><a name="l03510"></a><span class="lineno"> 3510</span>  <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>;</div><div class="line"><a name="l03511"></a><span class="lineno"> 3511</span> </div><div class="line"><a name="l03512"></a><span class="lineno"> 3512</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot < innernode->slotuse; ++slot)</div><div class="line"><a name="l03513"></a><span class="lineno"> 3513</span>  {</div><div class="line"><a name="l03514"></a><span class="lineno"> 3514</span>  os << <span class="stringliteral">"("</span> << innernode->childid[slot] << <span class="stringliteral">") "</span></div><div class="line"><a name="l03515"></a><span class="lineno"> 3515</span>  << innernode->slotkey[slot] << <span class="stringliteral">" "</span>;</div><div class="line"><a name="l03516"></a><span class="lineno"> 3516</span>  }</div><div class="line"><a name="l03517"></a><span class="lineno"> 3517</span>  os << <span class="stringliteral">"("</span> << innernode->childid[innernode->slotuse] << <span class="stringliteral">")"</span></div><div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>  << std::endl;</div><div class="line"><a name="l03519"></a><span class="lineno"> 3519</span> </div><div class="line"><a name="l03520"></a><span class="lineno"> 3520</span>  <span class="keywordflow">if</span> (recursive)</div><div class="line"><a name="l03521"></a><span class="lineno"> 3521</span>  {</div><div class="line"><a name="l03522"></a><span class="lineno"> 3522</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0;</div><div class="line"><a name="l03523"></a><span class="lineno"> 3523</span>  slot < innernode->slotuse + 1; ++slot)</div><div class="line"><a name="l03524"></a><span class="lineno"> 3524</span>  {</div><div class="line"><a name="l03525"></a><span class="lineno"> 3525</span>  print_node(</div><div class="line"><a name="l03526"></a><span class="lineno"> 3526</span>  os, innernode->childid[slot], depth + 1, recursive);</div><div class="line"><a name="l03527"></a><span class="lineno"> 3527</span>  }</div><div class="line"><a name="l03528"></a><span class="lineno"> 3528</span>  }</div><div class="line"><a name="l03529"></a><span class="lineno"> 3529</span>  }</div><div class="line"><a name="l03530"></a><span class="lineno"> 3530</span>  }</div><div class="line"><a name="l03531"></a><span class="lineno"> 3531</span> <span class="comment"></span></div><div class="line"><a name="l03532"></a><span class="lineno"> 3532</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l03533"></a><span class="lineno"> 3533</span> <span class="comment"></span><span class="preprocessor">#endif</span></div><div class="line"><a name="l03534"></a><span class="lineno"> 3534</span> </div><div class="line"><a name="l03535"></a><span class="lineno"> 3535</span> <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l03536"></a><span class="lineno"> 3536</span> <span class="comment"> //! \name Verification of B+ Tree Invariants</span></div><div class="line"><a name="l03537"></a><span class="lineno"> 3537</span> <span class="comment"> //! \{</span></div><div class="line"><a name="l03538"></a><span class="lineno"> 3538</span> <span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l03539"></a><span class="lineno"> 3539</span> <span class="comment"> //! Run a thorough verification of all B+ tree invariants. The program</span></div><div class="line"><a name="l03540"></a><span class="lineno"> 3540</span> <span class="comment"> //! aborts via tlx_die_unless() if something is wrong.</span></div><div class="line"><a name="l03541"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#af26aef03a7dfaca8fabb99969312307a"> 3541</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classtlx_1_1BTree.html#af26aef03a7dfaca8fabb99969312307a">verify</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l03542"></a><span class="lineno"> 3542</span>  key_type minkey, maxkey;</div><div class="line"><a name="l03543"></a><span class="lineno"> 3543</span>  tree_stats vstats;</div><div class="line"><a name="l03544"></a><span class="lineno"> 3544</span> </div><div class="line"><a name="l03545"></a><span class="lineno"> 3545</span>  <span class="keywordflow">if</span> (root_)</div><div class="line"><a name="l03546"></a><span class="lineno"> 3546</span>  {</div><div class="line"><a name="l03547"></a><span class="lineno"> 3547</span>  verify_node(root_, &minkey, &maxkey, vstats);</div><div class="line"><a name="l03548"></a><span class="lineno"> 3548</span> </div><div class="line"><a name="l03549"></a><span class="lineno"> 3549</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(vstats.size == stats_.size);</div><div class="line"><a name="l03550"></a><span class="lineno"> 3550</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(vstats.leaves == stats_.leaves);</div><div class="line"><a name="l03551"></a><span class="lineno"> 3551</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(vstats.inner_nodes == stats_.inner_nodes);</div><div class="line"><a name="l03552"></a><span class="lineno"> 3552</span> </div><div class="line"><a name="l03553"></a><span class="lineno"> 3553</span>  verify_leaflinks();</div><div class="line"><a name="l03554"></a><span class="lineno"> 3554</span>  }</div><div class="line"><a name="l03555"></a><span class="lineno"> 3555</span>  }</div><div class="line"><a name="l03556"></a><span class="lineno"> 3556</span> </div><div class="line"><a name="l03557"></a><span class="lineno"> 3557</span> <span class="keyword">private</span>:<span class="comment"></span></div><div class="line"><a name="l03558"></a><span class="lineno"> 3558</span> <span class="comment"> //! Recursively descend down the tree and verify each node</span></div><div class="line"><a name="l03559"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#ad6ed64cad61c5ac8cb5a4dc97ac34baf"> 3559</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classtlx_1_1BTree.html#ad6ed64cad61c5ac8cb5a4dc97ac34baf">verify_node</a>(<span class="keyword">const</span> node* n, key_type* minkey, key_type* maxkey,</div><div class="line"><a name="l03560"></a><span class="lineno"> 3560</span>  tree_stats& vstats)<span class="keyword"> const </span>{</div><div class="line"><a name="l03561"></a><span class="lineno"> 3561</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"verifynode "</span> << n);</div><div class="line"><a name="l03562"></a><span class="lineno"> 3562</span> </div><div class="line"><a name="l03563"></a><span class="lineno"> 3563</span>  <span class="keywordflow">if</span> (n->is_leafnode())</div><div class="line"><a name="l03564"></a><span class="lineno"> 3564</span>  {</div><div class="line"><a name="l03565"></a><span class="lineno"> 3565</span>  <span class="keyword">const</span> LeafNode* leaf = <span class="keyword">static_cast<</span><span class="keyword">const </span>LeafNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l03566"></a><span class="lineno"> 3566</span> </div><div class="line"><a name="l03567"></a><span class="lineno"> 3567</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(leaf == root_ || !leaf->is_underflow());</div><div class="line"><a name="l03568"></a><span class="lineno"> 3568</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(leaf->slotuse > 0);</div><div class="line"><a name="l03569"></a><span class="lineno"> 3569</span> </div><div class="line"><a name="l03570"></a><span class="lineno"> 3570</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot < leaf->slotuse - 1; ++slot)</div><div class="line"><a name="l03571"></a><span class="lineno"> 3571</span>  {</div><div class="line"><a name="l03572"></a><span class="lineno"> 3572</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(</div><div class="line"><a name="l03573"></a><span class="lineno"> 3573</span>  key_lessequal(leaf->key(slot), leaf->key(slot + 1)));</div><div class="line"><a name="l03574"></a><span class="lineno"> 3574</span>  }</div><div class="line"><a name="l03575"></a><span class="lineno"> 3575</span> </div><div class="line"><a name="l03576"></a><span class="lineno"> 3576</span>  *minkey = leaf->key(0);</div><div class="line"><a name="l03577"></a><span class="lineno"> 3577</span>  *maxkey = leaf->key(leaf->slotuse - 1);</div><div class="line"><a name="l03578"></a><span class="lineno"> 3578</span> </div><div class="line"><a name="l03579"></a><span class="lineno"> 3579</span>  vstats.leaves++;</div><div class="line"><a name="l03580"></a><span class="lineno"> 3580</span>  vstats.size += leaf->slotuse;</div><div class="line"><a name="l03581"></a><span class="lineno"> 3581</span>  }</div><div class="line"><a name="l03582"></a><span class="lineno"> 3582</span>  <span class="keywordflow">else</span> <span class="comment">// !n->is_leafnode()</span></div><div class="line"><a name="l03583"></a><span class="lineno"> 3583</span>  {</div><div class="line"><a name="l03584"></a><span class="lineno"> 3584</span>  <span class="keyword">const</span> InnerNode* inner = <span class="keyword">static_cast<</span><span class="keyword">const </span>InnerNode*<span class="keyword">></span>(n);</div><div class="line"><a name="l03585"></a><span class="lineno"> 3585</span>  vstats.inner_nodes++;</div><div class="line"><a name="l03586"></a><span class="lineno"> 3586</span> </div><div class="line"><a name="l03587"></a><span class="lineno"> 3587</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(inner == root_ || !inner->is_underflow());</div><div class="line"><a name="l03588"></a><span class="lineno"> 3588</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(inner->slotuse > 0);</div><div class="line"><a name="l03589"></a><span class="lineno"> 3589</span> </div><div class="line"><a name="l03590"></a><span class="lineno"> 3590</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot < inner->slotuse - 1; ++slot)</div><div class="line"><a name="l03591"></a><span class="lineno"> 3591</span>  {</div><div class="line"><a name="l03592"></a><span class="lineno"> 3592</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(</div><div class="line"><a name="l03593"></a><span class="lineno"> 3593</span>  key_lessequal(inner->key(slot), inner->key(slot + 1)));</div><div class="line"><a name="l03594"></a><span class="lineno"> 3594</span>  }</div><div class="line"><a name="l03595"></a><span class="lineno"> 3595</span> </div><div class="line"><a name="l03596"></a><span class="lineno"> 3596</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot <= inner->slotuse; ++slot)</div><div class="line"><a name="l03597"></a><span class="lineno"> 3597</span>  {</div><div class="line"><a name="l03598"></a><span class="lineno"> 3598</span>  <span class="keyword">const</span> node* subnode = inner->childid[slot];</div><div class="line"><a name="l03599"></a><span class="lineno"> 3599</span>  key_type subminkey = key_type();</div><div class="line"><a name="l03600"></a><span class="lineno"> 3600</span>  key_type submaxkey = key_type();</div><div class="line"><a name="l03601"></a><span class="lineno"> 3601</span> </div><div class="line"><a name="l03602"></a><span class="lineno"> 3602</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(subnode->level + 1 == inner->level);</div><div class="line"><a name="l03603"></a><span class="lineno"> 3603</span>  verify_node(subnode, &subminkey, &submaxkey, vstats);</div><div class="line"><a name="l03604"></a><span class="lineno"> 3604</span> </div><div class="line"><a name="l03605"></a><span class="lineno"> 3605</span>  <a class="code" href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a>(<span class="stringliteral">"verify subnode "</span> << subnode <<</div><div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>  <span class="stringliteral">": "</span> << subminkey <<</div><div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>  <span class="stringliteral">" - "</span> << submaxkey);</div><div class="line"><a name="l03608"></a><span class="lineno"> 3608</span> </div><div class="line"><a name="l03609"></a><span class="lineno"> 3609</span>  <span class="keywordflow">if</span> (slot == 0)</div><div class="line"><a name="l03610"></a><span class="lineno"> 3610</span>  *minkey = subminkey;</div><div class="line"><a name="l03611"></a><span class="lineno"> 3611</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03612"></a><span class="lineno"> 3612</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(</div><div class="line"><a name="l03613"></a><span class="lineno"> 3613</span>  key_greaterequal(subminkey, inner->key(slot - 1)));</div><div class="line"><a name="l03614"></a><span class="lineno"> 3614</span> </div><div class="line"><a name="l03615"></a><span class="lineno"> 3615</span>  <span class="keywordflow">if</span> (slot == inner->slotuse)</div><div class="line"><a name="l03616"></a><span class="lineno"> 3616</span>  *maxkey = submaxkey;</div><div class="line"><a name="l03617"></a><span class="lineno"> 3617</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03618"></a><span class="lineno"> 3618</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(key_equal(inner->key(slot), submaxkey));</div><div class="line"><a name="l03619"></a><span class="lineno"> 3619</span> </div><div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>  <span class="keywordflow">if</span> (inner->level == 1 && slot < inner->slotuse)</div><div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>  {</div><div class="line"><a name="l03622"></a><span class="lineno"> 3622</span>  <span class="comment">// children are leaves and must be linked together in the</span></div><div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>  <span class="comment">// correct order</span></div><div class="line"><a name="l03624"></a><span class="lineno"> 3624</span>  <span class="keyword">const</span> LeafNode* leafa = <span class="keyword">static_cast<</span><span class="keyword">const </span>LeafNode*<span class="keyword">></span>(</div><div class="line"><a name="l03625"></a><span class="lineno"> 3625</span>  inner->childid[slot]);</div><div class="line"><a name="l03626"></a><span class="lineno"> 3626</span>  <span class="keyword">const</span> LeafNode* leafb = <span class="keyword">static_cast<</span><span class="keyword">const </span>LeafNode*<span class="keyword">></span>(</div><div class="line"><a name="l03627"></a><span class="lineno"> 3627</span>  inner->childid[slot + 1]);</div><div class="line"><a name="l03628"></a><span class="lineno"> 3628</span> </div><div class="line"><a name="l03629"></a><span class="lineno"> 3629</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(leafa->next_leaf == leafb);</div><div class="line"><a name="l03630"></a><span class="lineno"> 3630</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(leafa == leafb->prev_leaf);</div><div class="line"><a name="l03631"></a><span class="lineno"> 3631</span>  }</div><div class="line"><a name="l03632"></a><span class="lineno"> 3632</span>  <span class="keywordflow">if</span> (inner->level == 2 && slot < inner->slotuse)</div><div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>  {</div><div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>  <span class="comment">// verify leaf links between the adjacent inner nodes</span></div><div class="line"><a name="l03635"></a><span class="lineno"> 3635</span>  <span class="keyword">const</span> InnerNode* parenta = <span class="keyword">static_cast<</span><span class="keyword">const </span>InnerNode*<span class="keyword">></span>(</div><div class="line"><a name="l03636"></a><span class="lineno"> 3636</span>  inner->childid[slot]);</div><div class="line"><a name="l03637"></a><span class="lineno"> 3637</span>  <span class="keyword">const</span> InnerNode* parentb = <span class="keyword">static_cast<</span><span class="keyword">const </span>InnerNode*<span class="keyword">></span>(</div><div class="line"><a name="l03638"></a><span class="lineno"> 3638</span>  inner->childid[slot + 1]);</div><div class="line"><a name="l03639"></a><span class="lineno"> 3639</span> </div><div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>  <span class="keyword">const</span> LeafNode* leafa = <span class="keyword">static_cast<</span><span class="keyword">const </span>LeafNode*<span class="keyword">></span>(</div><div class="line"><a name="l03641"></a><span class="lineno"> 3641</span>  parenta->childid[parenta->slotuse]);</div><div class="line"><a name="l03642"></a><span class="lineno"> 3642</span>  <span class="keyword">const</span> LeafNode* leafb = <span class="keyword">static_cast<</span><span class="keyword">const </span>LeafNode*<span class="keyword">></span>(</div><div class="line"><a name="l03643"></a><span class="lineno"> 3643</span>  parentb->childid[0]);</div><div class="line"><a name="l03644"></a><span class="lineno"> 3644</span> </div><div class="line"><a name="l03645"></a><span class="lineno"> 3645</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(leafa->next_leaf == leafb);</div><div class="line"><a name="l03646"></a><span class="lineno"> 3646</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(leafa == leafb->prev_leaf);</div><div class="line"><a name="l03647"></a><span class="lineno"> 3647</span>  }</div><div class="line"><a name="l03648"></a><span class="lineno"> 3648</span>  }</div><div class="line"><a name="l03649"></a><span class="lineno"> 3649</span>  }</div><div class="line"><a name="l03650"></a><span class="lineno"> 3650</span>  }</div><div class="line"><a name="l03651"></a><span class="lineno"> 3651</span> <span class="comment"></span></div><div class="line"><a name="l03652"></a><span class="lineno"> 3652</span> <span class="comment"> //! Verify the double linked list of leaves.</span></div><div class="line"><a name="l03653"></a><span class="lineno"><a class="line" href="classtlx_1_1BTree.html#a288f383c102e522614ffcb27b1b979a9"> 3653</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classtlx_1_1BTree.html#a288f383c102e522614ffcb27b1b979a9">verify_leaflinks</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l03654"></a><span class="lineno"> 3654</span>  <span class="keyword">const</span> LeafNode* n = head_leaf_;</div><div class="line"><a name="l03655"></a><span class="lineno"> 3655</span> </div><div class="line"><a name="l03656"></a><span class="lineno"> 3656</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(n->level == 0);</div><div class="line"><a name="l03657"></a><span class="lineno"> 3657</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(!n || n->prev_leaf == <span class="keyword">nullptr</span>);</div><div class="line"><a name="l03658"></a><span class="lineno"> 3658</span> </div><div class="line"><a name="l03659"></a><span class="lineno"> 3659</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> testcount = 0;</div><div class="line"><a name="l03660"></a><span class="lineno"> 3660</span> </div><div class="line"><a name="l03661"></a><span class="lineno"> 3661</span>  <span class="keywordflow">while</span> (n)</div><div class="line"><a name="l03662"></a><span class="lineno"> 3662</span>  {</div><div class="line"><a name="l03663"></a><span class="lineno"> 3663</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(n->level == 0);</div><div class="line"><a name="l03664"></a><span class="lineno"> 3664</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(n->slotuse > 0);</div><div class="line"><a name="l03665"></a><span class="lineno"> 3665</span> </div><div class="line"><a name="l03666"></a><span class="lineno"> 3666</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> slot = 0; slot < n->slotuse - 1; ++slot)</div><div class="line"><a name="l03667"></a><span class="lineno"> 3667</span>  {</div><div class="line"><a name="l03668"></a><span class="lineno"> 3668</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(key_lessequal(n->key(slot), n->key(slot + 1)));</div><div class="line"><a name="l03669"></a><span class="lineno"> 3669</span>  }</div><div class="line"><a name="l03670"></a><span class="lineno"> 3670</span> </div><div class="line"><a name="l03671"></a><span class="lineno"> 3671</span>  testcount += n->slotuse;</div><div class="line"><a name="l03672"></a><span class="lineno"> 3672</span> </div><div class="line"><a name="l03673"></a><span class="lineno"> 3673</span>  <span class="keywordflow">if</span> (n->next_leaf)</div><div class="line"><a name="l03674"></a><span class="lineno"> 3674</span>  {</div><div class="line"><a name="l03675"></a><span class="lineno"> 3675</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(key_lessequal(n->key(n->slotuse - 1),</div><div class="line"><a name="l03676"></a><span class="lineno"> 3676</span>  n->next_leaf->key(0)));</div><div class="line"><a name="l03677"></a><span class="lineno"> 3677</span> </div><div class="line"><a name="l03678"></a><span class="lineno"> 3678</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(n == n->next_leaf->prev_leaf);</div><div class="line"><a name="l03679"></a><span class="lineno"> 3679</span>  }</div><div class="line"><a name="l03680"></a><span class="lineno"> 3680</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l03681"></a><span class="lineno"> 3681</span>  {</div><div class="line"><a name="l03682"></a><span class="lineno"> 3682</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(tail_leaf_ == n);</div><div class="line"><a name="l03683"></a><span class="lineno"> 3683</span>  }</div><div class="line"><a name="l03684"></a><span class="lineno"> 3684</span> </div><div class="line"><a name="l03685"></a><span class="lineno"> 3685</span>  n = n->next_leaf;</div><div class="line"><a name="l03686"></a><span class="lineno"> 3686</span>  }</div><div class="line"><a name="l03687"></a><span class="lineno"> 3687</span> </div><div class="line"><a name="l03688"></a><span class="lineno"> 3688</span>  <a class="code" href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a>(testcount == size());</div><div class="line"><a name="l03689"></a><span class="lineno"> 3689</span>  }</div><div class="line"><a name="l03690"></a><span class="lineno"> 3690</span> <span class="comment"></span></div><div class="line"><a name="l03691"></a><span class="lineno"> 3691</span> <span class="comment"> //! \}</span></div><div class="line"><a name="l03692"></a><span class="lineno"> 3692</span> <span class="comment"></span>};</div><div class="line"><a name="l03693"></a><span class="lineno"> 3693</span> <span class="comment"></span></div><div class="line"><a name="l03694"></a><span class="lineno"> 3694</span> <span class="comment">//! \}</span></div><div class="line"><a name="l03695"></a><span class="lineno"> 3695</span> <span class="comment">//! \}</span></div><div class="line"><a name="l03696"></a><span class="lineno"> 3696</span> <span class="comment"></span></div><div class="line"><a name="l03697"></a><span class="lineno"> 3697</span> } <span class="comment">// namespace tlx</span></div><div class="line"><a name="l03698"></a><span class="lineno"> 3698</span> </div><div class="line"><a name="l03699"></a><span class="lineno"> 3699</span> <span class="preprocessor">#endif // !TLX_CONTAINER_BTREE_HEADER</span></div><div class="line"><a name="l03700"></a><span class="lineno"> 3700</span> </div><div class="line"><a name="l03701"></a><span class="lineno"> 3701</span> <span class="comment">/******************************************************************************/</span></div><div class="ttc" id="classtlx_1_1BTree_html_ad69bd11391be1a1dba5c8202259664f8"><div class="ttname"><a href="classtlx_1_1BTree.html#ad69bd11391be1a1dba5c8202259664f8">tlx::BTree::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Constructs a read/data-write iterator that points to the first slot in the first leaf of the B+ tree...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01341">btree.hpp:1341</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a9c9766a96c492f3e9e5861d6b4f87387"><div class="ttname"><a href="classtlx_1_1BTree.html#a9c9766a96c492f3e9e5861d6b4f87387">tlx::BTree::find</a></div><div class="ttdeci">iterator find(const key_type &key)</div><div class="ttdoc">Tries to locate a key in the B+ tree and returns an iterator to the key/data slot if found...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01542">btree.hpp:1542</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a117b795a14531e05da974077af0ff76e"><div class="ttname"><a href="classtlx_1_1BTree.html#a117b795a14531e05da974077af0ff76e">tlx::BTree::key_equal</a></div><div class="ttdeci">bool key_equal(const key_type &a, const key_type &b) const </div><div class="ttdoc">True if a == b ? constructed from key_less(). </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01221">btree.hpp:1221</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a97bb054bc81e97ec55f0b539cdcbfcde"><div class="ttname"><a href="classtlx_1_1BTree.html#a97bb054bc81e97ec55f0b539cdcbfcde">tlx::BTree::equal_range</a></div><div class="ttdeci">std::pair< iterator, iterator > equal_range(const key_type &key)</div><div class="ttdoc">Searches the B+ tree and returns both lower_bound() and upper_bound(). </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01695">btree.hpp:1695</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1tree__stats_html_aee390aabd0d5706d9a55d51259151704"><div class="ttname"><a href="structtlx_1_1BTree_1_1tree__stats.html#aee390aabd0d5706d9a55d51259151704">tlx::BTree::tree_stats::tree_stats</a></div><div class="ttdeci">tree_stats()</div><div class="ttdoc">Zero initialized. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01054">btree.hpp:1054</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a0c1e04d5d606adc2876b61fafc73c645"><div class="ttname"><a href="classtlx_1_1BTree.html#a0c1e04d5d606adc2876b61fafc73c645">tlx::BTree::swap</a></div><div class="ttdeci">void swap(BTree &from)</div><div class="ttdoc">Fast swapping of two identical B+ tree objects. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01144">btree.hpp:1144</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1reverse__iterator_html_a3c958f85bfb6214a0fdad8da08c04aab"><div class="ttname"><a href="classtlx_1_1BTree_1_1reverse__iterator.html#a3c958f85bfb6214a0fdad8da08c04aab">tlx::BTree::reverse_iterator::reverse_iterator</a></div><div class="ttdeci">reverse_iterator(const iterator &it)</div><div class="ttdoc">Copy-constructor from a mutable iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00746">btree.hpp:746</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__reverse__iterator_html_acf947bbb9e09f863cc3572ff8550b183"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__reverse__iterator.html#acf947bbb9e09f863cc3572ff8550b183">tlx::BTree::const_reverse_iterator::difference_type</a></div><div class="ttdeci">ptrdiff_t difference_type</div><div class="ttdoc">STL-magic. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00874">btree.hpp:874</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1InnerNode_html"><div class="ttname"><a href="structtlx_1_1BTree_1_1InnerNode.html">tlx::BTree::InnerNode</a></div><div class="ttdoc">Extended structure of a inner node in-memory. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00235">btree.hpp:235</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1result__t_html_a8977bdc6bb20adb10785684083b8077f"><div class="ttname"><a href="structtlx_1_1BTree_1_1result__t.html#a8977bdc6bb20adb10785684083b8077f">tlx::BTree::result_t::flags</a></div><div class="ttdeci">result_flags_t flags</div><div class="ttdoc">Merged result flags. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l02327">btree.hpp:2327</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a3a617d72a0b84dcbdf111d1fe19ec0b5"><div class="ttname"><a href="classtlx_1_1BTree.html#a3a617d72a0b84dcbdf111d1fe19ec0b5">tlx::BTree< key_type, value_type, key_of_value, key_compare, traits, true, allocator_type >::result_flags_t</a></div><div class="ttdeci">result_flags_t</div><div class="ttdoc">Result flags of recursive deletion. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l02307">btree.hpp:2307</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__iterator_html_a323e325d694e0d5d9a148d5a49b6cfb1"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__iterator.html#a323e325d694e0d5d9a148d5a49b6cfb1">tlx::BTree::const_iterator::curr_leaf</a></div><div class="ttdeci">const BTree::LeafNode * curr_leaf</div><div class="ttdoc">The currently referenced leaf node of the tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00538">btree.hpp:538</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_af8b2d25c3e313e0b24656afe5cd4f6f2"><div class="ttname"><a href="classtlx_1_1BTree.html#af8b2d25c3e313e0b24656afe5cd4f6f2">tlx::BTree::erase</a></div><div class="ttdeci">void erase(iterator iter)</div><div class="ttdoc">Erase the key/data pair referenced by the iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l02405">btree.hpp:2405</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__iterator_html_a0cc59491125a67abc87e8bfe6a4022c1"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__iterator.html#a0cc59491125a67abc87e8bfe6a4022c1">tlx::BTree::const_iterator::key_type</a></div><div class="ttdeci">BTree::key_type key_type</div><div class="ttdoc">The key type of the btree. Returned by key(). </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00514">btree.hpp:514</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a0ab5ce862c0331d9e45a6e1774fca131"><div class="ttname"><a href="classtlx_1_1BTree.html#a0ab5ce862c0331d9e45a6e1774fca131">tlx::BTree::max_size</a></div><div class="ttdeci">size_type max_size() const </div><div class="ttdoc">Returns the largest possible size of the B+ Tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01505">btree.hpp:1505</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a37a9d364cc587fa88fc7e498cbbbd8e9"><div class="ttname"><a href="classtlx_1_1BTree.html#a37a9d364cc587fa88fc7e498cbbbd8e9">tlx::BTree::copy_recursive</a></div><div class="ttdeci">struct node * copy_recursive(const node *n)</div><div class="ttdoc">Recursively copy nodes from another B+ tree object. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01796">btree.hpp:1796</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1LeafNode_html_a90691e279995451280f4542497aa1b60"><div class="ttname"><a href="structtlx_1_1BTree_1_1LeafNode.html#a90691e279995451280f4542497aa1b60">tlx::BTree::LeafNode::prev_leaf</a></div><div class="ttdeci">LeafNode * prev_leaf</div><div class="ttdoc">Double linked list pointers to traverse the leaves. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00278">btree.hpp:278</a></div></div>
<div class="ttc" id="structtlx_1_1btree__default__traits_html_a5424ef685b876f253f83fa26ecec5761"><div class="ttname"><a href="structtlx_1_1btree__default__traits.html#a5424ef685b876f253f83fa26ecec5761">tlx::btree_default_traits::inner_slots</a></div><div class="ttdeci">static const int inner_slots</div><div class="ttdoc">Number of slots in each inner node of the tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00093">btree.hpp:93</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1result__t_html"><div class="ttname"><a href="structtlx_1_1BTree_1_1result__t.html">tlx::BTree::result_t</a></div><div class="ttdoc">B+ tree recursive deletion has much information which is needs to be passed upward. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l02325">btree.hpp:2325</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1LeafNode_html_a4128fcf2ecb19e1ebecf4552cdde8c89"><div class="ttname"><a href="structtlx_1_1BTree_1_1LeafNode.html#a4128fcf2ecb19e1ebecf4552cdde8c89">tlx::BTree::LeafNode::alloc_type</a></div><div class="ttdeci">std::allocator_traits< Allocator >::template rebind_alloc< LeafNode > alloc_type</div><div class="ttdoc">Define an related allocator for the LeafNode structs. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00275">btree.hpp:275</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__iterator_html_afcca858d327994cbceec7568655f75de"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__iterator.html#afcca858d327994cbceec7568655f75de">tlx::BTree::const_iterator::const_iterator</a></div><div class="ttdeci">const_iterator(const typename BTree::LeafNode *l, unsigned short s)</div><div class="ttdoc">Initializing-Constructor of a const iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00561">btree.hpp:561</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1InnerNode_html_a4a7d2aabf68288b465287ac1882c0545"><div class="ttname"><a href="structtlx_1_1BTree_1_1InnerNode.html#a4a7d2aabf68288b465287ac1882c0545">tlx::BTree::InnerNode::alloc_type</a></div><div class="ttdeci">std::allocator_traits< Allocator >::template rebind_alloc< InnerNode > alloc_type</div><div class="ttdoc">Define an related allocator for the InnerNode structs. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00237">btree.hpp:237</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__iterator_html_ac8c12b18f0df60ef52a9ab37752bea63"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__iterator.html#ac8c12b18f0df60ef52a9ab37752bea63">tlx::BTree::const_iterator::pointer</a></div><div class="ttdeci">const value_type * pointer</div><div class="ttdoc">Pointer to the value_type. STL required. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00523">btree.hpp:523</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a8f96f907c281e0c29c4f5129b6cf3169"><div class="ttname"><a href="classtlx_1_1BTree.html#a8f96f907c281e0c29c4f5129b6cf3169">tlx::BTree::BTree</a></div><div class="ttdeci">BTree(const key_compare &kcf, const allocator_type &alloc=allocator_type())</div><div class="ttdoc">Constructor initializing an empty B+ tree with a special key comparison object. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01110">btree.hpp:1110</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_af26aef03a7dfaca8fabb99969312307a"><div class="ttname"><a href="classtlx_1_1BTree.html#af26aef03a7dfaca8fabb99969312307a">tlx::BTree::verify</a></div><div class="ttdeci">void verify() const </div><div class="ttdoc">Run a thorough verification of all B+ tree invariants. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l03541">btree.hpp:3541</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_aa4b02d4f1a8500fb07a551069060709f"><div class="ttname"><a href="classtlx_1_1BTree.html#aa4b02d4f1a8500fb07a551069060709f">tlx::BTree::begin</a></div><div class="ttdeci">const_iterator begin() const </div><div class="ttdoc">Constructs a read-only constant iterator that points to the first slot in the first leaf of the B+ tr...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01353">btree.hpp:1353</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1reverse__iterator_html_a0cc59491125a67abc87e8bfe6a4022c1"><div class="ttname"><a href="classtlx_1_1BTree_1_1reverse__iterator.html#a0cc59491125a67abc87e8bfe6a4022c1">tlx::BTree::reverse_iterator::key_type</a></div><div class="ttdeci">BTree::key_type key_type</div><div class="ttdoc">The key type of the btree. Returned by key(). </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00686">btree.hpp:686</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_aa75eef3ff50d37f5b6c2eeea491cade1"><div class="ttname"><a href="classtlx_1_1BTree.html#aa75eef3ff50d37f5b6c2eeea491cade1">tlx::BTree::allocate_inner</a></div><div class="ttdeci">InnerNode * allocate_inner(unsigned short level)</div><div class="ttdoc">Allocate and initialize an inner node. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01261">btree.hpp:1261</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_adc204502ef1606c9daa4a613da6aacfb"><div class="ttname"><a href="classtlx_1_1BTree.html#adc204502ef1606c9daa4a613da6aacfb">tlx::BTree::find</a></div><div class="ttdeci">const_iterator find(const key_type &key) const </div><div class="ttdoc">Tries to locate a key in the B+ tree and returns an constant iterator to the key/data slot if found...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01563">btree.hpp:1563</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1tree__stats_html_a33acefd815dae0cce39ba5c792abaa0e"><div class="ttname"><a href="structtlx_1_1BTree_1_1tree__stats.html#a33acefd815dae0cce39ba5c792abaa0e">tlx::BTree::tree_stats::inner_nodes</a></div><div class="ttdeci">size_type inner_nodes</div><div class="ttdoc">Number of inner nodes in the B+ tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01045">btree.hpp:1045</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a6f73c3bb670ec75c0b6910927cf6606b"><div class="ttname"><a href="classtlx_1_1BTree.html#a6f73c3bb670ec75c0b6910927cf6606b">tlx::BTree::BTree</a></div><div class="ttdeci">BTree(const allocator_type &alloc=allocator_type())</div><div class="ttdoc">Default constructor initializing an empty B+ tree with the standard key comparison function...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01103">btree.hpp:1103</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1LeafNode_html_a25a40b6614565f755233080a384c35f1"><div class="ttname"><a href="structtlx_1_1BTree_1_1LeafNode.html#a25a40b6614565f755233080a384c35f1">tlx::BTree::LeafNode::initialize</a></div><div class="ttdeci">void initialize()</div><div class="ttdoc">Set variables to initial values. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00287">btree.hpp:287</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a350132543d80a1c1e5be844e6d2878ea"><div class="ttname"><a href="classtlx_1_1BTree.html#a350132543d80a1c1e5be844e6d2878ea">tlx::BTree::end</a></div><div class="ttdeci">const_iterator end() const </div><div class="ttdoc">Constructs a read-only constant iterator that points to the first invalid slot in the last leaf of th...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01359">btree.hpp:1359</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a99609d25589437b30cb42dab922bfaa9"><div class="ttname"><a href="classtlx_1_1BTree.html#a99609d25589437b30cb42dab922bfaa9">tlx::BTree::upper_bound</a></div><div class="ttdeci">const_iterator upper_bound(const key_type &key) const </div><div class="ttdoc">Searches the B+ tree and returns a constant iterator to the first pair greater than key...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01676">btree.hpp:1676</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1iterator_html_a1662eef91eb8e828a6ef9ba7651c9c8e"><div class="ttname"><a href="classtlx_1_1BTree_1_1iterator.html#a1662eef91eb8e828a6ef9ba7651c9c8e">tlx::BTree::iterator::iterator_category</a></div><div class="ttdeci">std::bidirectional_iterator_tag iterator_category</div><div class="ttdoc">STL-magic iterator category. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00351">btree.hpp:351</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a8746da7b8170695c17d760f1a43bd4fe"><div class="ttname"><a href="classtlx_1_1BTree.html#a8746da7b8170695c17d760f1a43bd4fe">tlx::BTree::allocator_</a></div><div class="ttdeci">allocator_type allocator_</div><div class="ttdoc">Memory allocator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01093">btree.hpp:1093</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1iterator_html_a0cc59491125a67abc87e8bfe6a4022c1"><div class="ttname"><a href="classtlx_1_1BTree_1_1iterator.html#a0cc59491125a67abc87e8bfe6a4022c1">tlx::BTree::iterator::key_type</a></div><div class="ttdeci">BTree::key_type key_type</div><div class="ttdoc">The key type of the btree. Returned by key(). </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00339">btree.hpp:339</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a3a79f5c030eea924dbd8fcc9417b9263"><div class="ttname"><a href="classtlx_1_1BTree.html#a3a79f5c030eea924dbd8fcc9417b9263">tlx::BTree::erase_one</a></div><div class="ttdeci">bool erase_one(const key_type &key)</div><div class="ttdoc">Erases one (the first) of the key/data pairs associated with the given key. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l02368">btree.hpp:2368</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a12d054d5f2dfa6c0d777e2ceb7e4f89d"><div class="ttname"><a href="classtlx_1_1BTree.html#a12d054d5f2dfa6c0d777e2ceb7e4f89d">tlx::BTree::free_node</a></div><div class="ttdeci">void free_node(node *n)</div><div class="ttdoc">Correctly free either inner or leaf node, destructs all contained key and value objects. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01270">btree.hpp:1270</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_acfbc5374e81f060b1cdffeb9c494ae86"><div class="ttname"><a href="classtlx_1_1BTree.html#acfbc5374e81f060b1cdffeb9c494ae86">tlx::BTree::get_allocator</a></div><div class="ttdeci">allocator_type get_allocator() const </div><div class="ttdoc">Return the base node allocator provided during construction. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01232">btree.hpp:1232</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1tree__stats_html"><div class="ttname"><a href="structtlx_1_1BTree_1_1tree__stats.html">tlx::BTree::tree_stats</a></div><div class="ttdoc">A small struct containing basic statistics about the B+ tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01037">btree.hpp:1037</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__reverse__iterator_html_a8ba2b56dfdb5b9beba97bb9ba59ae71b"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a8ba2b56dfdb5b9beba97bb9ba59ae71b">tlx::BTree::const_reverse_iterator::key</a></div><div class="ttdeci">const key_type & key() const </div><div class="ttdoc">Key of the current slot. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00939">btree.hpp:939</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1node_html_a85fe587cefa3de25d9549aaf09356ba6"><div class="ttname"><a href="structtlx_1_1BTree_1_1node.html#a85fe587cefa3de25d9549aaf09356ba6">tlx::BTree::node::initialize</a></div><div class="ttdeci">void initialize(const unsigned short l)</div><div class="ttdoc">Delayed initialisation of constructed node. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00222">btree.hpp:222</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a6cbb054ada3a2e9ebe4f822f0799b10b"><div class="ttname"><a href="classtlx_1_1BTree.html#a6cbb054ada3a2e9ebe4f822f0799b10b">tlx::BTree::BTree</a></div><div class="ttdeci">BTree(InputIterator first, InputIterator last, const allocator_type &alloc=allocator_type())</div><div class="ttdoc">Constructor initializing a B+ tree with the range [first,last). </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01120">btree.hpp:1120</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a503ab01f6c0142145d3434f6924714e7"><div class="ttname"><a href="classtlx_1_1BTree.html#a503ab01f6c0142145d3434f6924714e7">tlx::BTree::size</a></div><div class="ttdeci">size_type size() const </div><div class="ttdoc">Return the number of key/data pairs in the B+ tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01494">btree.hpp:1494</a></div></div>
<div class="ttc" id="group__tlx__container_html_ga1eaba1000915c20a97170cf3c0c3d6b4"><div class="ttname"><a href="group__tlx__container.html#ga1eaba1000915c20a97170cf3c0c3d6b4">tlx::operator!=</a></div><div class="ttdeci">static bool operator!=(const StringView &a, const std::string &b) noexcept</div><div class="ttdoc">inequality operator to compare a StringView with a std::string </div><div class="ttdef"><b>Definition:</b> <a href="string__view_8hpp_source.html#l00494">string_view.hpp:494</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__reverse__iterator_html_ab511c7c1214ceb7d40235e9eda473909"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__reverse__iterator.html#ab511c7c1214ceb7d40235e9eda473909">tlx::BTree::const_reverse_iterator::const_reverse_iterator</a></div><div class="ttdeci">const_reverse_iterator(const iterator &it)</div><div class="ttdoc">Copy-constructor from a mutable iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00912">btree.hpp:912</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_ab42ea149fdde84e56ff0a7ed11e13aa8"><div class="ttname"><a href="classtlx_1_1BTree.html#ab42ea149fdde84e56ff0a7ed11e13aa8">tlx::BTree::value_comp</a></div><div class="ttdeci">value_compare value_comp() const </div><div class="ttdoc">Constant access to a constructed value_type comparison object. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01189">btree.hpp:1189</a></div></div>
<div class="ttc" id="group__tlx__container_html_ga7fb66a1c9efa4105671d43b388850b8e"><div class="ttname"><a href="group__tlx__container.html#ga7fb66a1c9efa4105671d43b388850b8e">tlx::operator></a></div><div class="ttdeci">static bool operator>(const StringView &x, const std::string &y) noexcept</div><div class="ttdef"><b>Definition:</b> <a href="string__view_8hpp_source.html#l00521">string_view.hpp:521</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__reverse__iterator_html_ac8c12b18f0df60ef52a9ab37752bea63"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__reverse__iterator.html#ac8c12b18f0df60ef52a9ab37752bea63">tlx::BTree::const_reverse_iterator::pointer</a></div><div class="ttdeci">const value_type * pointer</div><div class="ttdoc">Pointer to the value_type. STL required. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00868">btree.hpp:868</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__iterator_html_ac98e8fc34f4b8b545e534f41df43ea3a"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__iterator.html#ac98e8fc34f4b8b545e534f41df43ea3a">tlx::BTree::const_iterator::const_iterator</a></div><div class="ttdeci">const_iterator(const iterator &it)</div><div class="ttdoc">Copy-constructor from a mutable iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00566">btree.hpp:566</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a0d3d86d13f26293e1ddcff5569ad1ccb"><div class="ttname"><a href="classtlx_1_1BTree.html#a0d3d86d13f26293e1ddcff5569ad1ccb">tlx::BTree::exists</a></div><div class="ttdeci">bool exists(const key_type &key) const </div><div class="ttdoc">Non-STL function checking whether a key is in the B+ tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01522">btree.hpp:1522</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a49b489a408a211a90e766329c0732d7b"><div class="ttname"><a href="classtlx_1_1BTree.html#a49b489a408a211a90e766329c0732d7b">tlx::BTree::size_type</a></div><div class="ttdeci">size_t size_type</div><div class="ttdoc">Size type used to count keys. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00171">btree.hpp:171</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1iterator_html"><div class="ttname"><a href="classtlx_1_1BTree_1_1iterator.html">tlx::BTree::iterator</a></div><div class="ttdoc">STL-like iterator object for B+ tree items. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00333">btree.hpp:333</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a22c8a3da26251dfccff50c8bb174c3a4"><div class="ttname"><a href="classtlx_1_1BTree.html#a22c8a3da26251dfccff50c8bb174c3a4">tlx::BTree::shift_left_inner</a></div><div class="ttdeci">static void shift_left_inner(InnerNode *left, InnerNode *right, InnerNode *parent, unsigned int parentslot)</div><div class="ttdoc">Balance two inner nodes. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l03264">btree.hpp:3264</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_ac6e61de369e994009e36f344f99c15ad"><div class="ttname"><a href="classtlx_1_1BTree.html#ac6e61de369e994009e36f344f99c15ad">tlx::BTree::empty</a></div><div class="ttdeci">bool empty() const </div><div class="ttdoc">Returns true if there is at least one key/data pair in the B+ tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01499">btree.hpp:1499</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a38ec6d0825c22c2d0ad31f3209ed2d02"><div class="ttname"><a href="classtlx_1_1BTree.html#a38ec6d0825c22c2d0ad31f3209ed2d02">tlx::BTree::key_type</a></div><div class="ttdeci">Key key_type</div><div class="ttdoc">First template parameter: The key type of the B+ tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00132">btree.hpp:132</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1reverse__iterator_html_a8ba2b56dfdb5b9beba97bb9ba59ae71b"><div class="ttname"><a href="classtlx_1_1BTree_1_1reverse__iterator.html#a8ba2b56dfdb5b9beba97bb9ba59ae71b">tlx::BTree::reverse_iterator::key</a></div><div class="ttdeci">const key_type & key() const </div><div class="ttdoc">Key of the current slot. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00763">btree.hpp:763</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__reverse__iterator_html_a323e325d694e0d5d9a148d5a49b6cfb1"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a323e325d694e0d5d9a148d5a49b6cfb1">tlx::BTree::const_reverse_iterator::curr_leaf</a></div><div class="ttdeci">const BTree::LeafNode * curr_leaf</div><div class="ttdoc">The currently referenced leaf node of the tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00883">btree.hpp:883</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_ab3c414470d5cea2986cfab7a90146cb6"><div class="ttname"><a href="classtlx_1_1BTree.html#ab3c414470d5cea2986cfab7a90146cb6">tlx::BTree::rend</a></div><div class="ttdeci">const_reverse_iterator rend() const </div><div class="ttdoc">Constructs a read-only reverse iterator that points to the first slot in the first leaf of the B+ tre...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01383">btree.hpp:1383</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1node_html_a15137871fddf6b98c4f13fda9d53c33c"><div class="ttname"><a href="structtlx_1_1BTree_1_1node.html#a15137871fddf6b98c4f13fda9d53c33c">tlx::BTree::node::level</a></div><div class="ttdeci">unsigned short level</div><div class="ttdoc">Level in the b-tree, if level == 0 -> leaf node. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00215">btree.hpp:215</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__iterator_html_a8ba2b56dfdb5b9beba97bb9ba59ae71b"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__iterator.html#a8ba2b56dfdb5b9beba97bb9ba59ae71b">tlx::BTree::const_iterator::key</a></div><div class="ttdeci">const key_type & key() const </div><div class="ttdoc">Key of the current slot. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00591">btree.hpp:591</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a8683ae6c55649dd2c6d909cf618de0a0"><div class="ttname"><a href="classtlx_1_1BTree.html#a8683ae6c55649dd2c6d909cf618de0a0">tlx::BTree::find_lower</a></div><div class="ttdeci">unsigned short find_lower(const node_type *n, const key_type &key) const </div><div class="ttdoc">Searches for the first key in the node n greater or equal to key. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01398">btree.hpp:1398</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__reverse__iterator_html_ae606c9d192f5f681a19b60b19d8f18d2"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__reverse__iterator.html#ae606c9d192f5f681a19b60b19d8f18d2">tlx::BTree::const_reverse_iterator::curr_slot</a></div><div class="ttdeci">unsigned short curr_slot</div><div class="ttdoc">One slot past the current key/data slot referenced. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00886">btree.hpp:886</a></div></div>
<div class="ttc" id="namespacetlx_html"><div class="ttname"><a href="namespacetlx.html">tlx</a></div><div class="ttdef"><b>Definition:</b> <a href="exclusive__scan_8hpp_source.html#l00017">exclusive_scan.hpp:17</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a6ff4e347839868db0770859a3dd55a27"><div class="ttname"><a href="classtlx_1_1BTree.html#a6ff4e347839868db0770859a3dd55a27">tlx::BTree::key_compare</a></div><div class="ttdeci">Compare key_compare</div><div class="ttdoc">Fourth template parameter: key_type comparison function object. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00142">btree.hpp:142</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__reverse__iterator_html"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__reverse__iterator.html">tlx::BTree::const_reverse_iterator</a></div><div class="ttdoc">STL-like read-only reverse iterator object for B+ tree items. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00853">btree.hpp:853</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1node_html_a55ebc33d4c95919ff2c45023beb5ef64"><div class="ttname"><a href="structtlx_1_1BTree_1_1node.html#a55ebc33d4c95919ff2c45023beb5ef64">tlx::BTree::node::slotuse</a></div><div class="ttdeci">unsigned short slotuse</div><div class="ttdoc">Number of key slotuse use, so the number of valid children or data pointers. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00219">btree.hpp:219</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1iterator_html_abe8933d436779a43cb5c1896ff5f2918"><div class="ttname"><a href="classtlx_1_1BTree_1_1iterator.html#abe8933d436779a43cb5c1896ff5f2918">tlx::BTree::iterator::reference</a></div><div class="ttdeci">value_type & reference</div><div class="ttdoc">Reference to the value_type. STL required. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00345">btree.hpp:345</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1InnerNode_html_ae028d16479603404a2f2b71bfc0abe82"><div class="ttname"><a href="structtlx_1_1BTree_1_1InnerNode.html#ae028d16479603404a2f2b71bfc0abe82">tlx::BTree::InnerNode::is_full</a></div><div class="ttdeci">bool is_full() const </div><div class="ttdoc">True if the node&#39;s slots are full. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00256">btree.hpp:256</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1InnerNode_html_a161bc176fff45968605cbbf2bb5f4ef9"><div class="ttname"><a href="structtlx_1_1BTree_1_1InnerNode.html#a161bc176fff45968605cbbf2bb5f4ef9">tlx::BTree::InnerNode::is_underflow</a></div><div class="ttdeci">bool is_underflow() const </div><div class="ttdoc">True if node has too few entries. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00266">btree.hpp:266</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__iterator_html_a0389393ef46862bf253a20ee13ad2ceb"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__iterator.html#a0389393ef46862bf253a20ee13ad2ceb">tlx::BTree::const_iterator::const_iterator</a></div><div class="ttdeci">const_iterator(const reverse_iterator &it)</div><div class="ttdoc">Copy-constructor from a mutable reverse iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00571">btree.hpp:571</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a21e576e049c90e014ffeb583c24d2f38"><div class="ttname"><a href="classtlx_1_1BTree.html#a21e576e049c90e014ffeb583c24d2f38">tlx::BTree::key_of_value</a></div><div class="ttdeci">KeyOfValue key_of_value</div><div class="ttdoc">Third template: key extractor class to pull key_type from value_type. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00139">btree.hpp:139</a></div></div>
<div class="ttc" id="group__tlx__container__btree_html_ga069fbcbc52ca1f7cbe681ff86d1e0e73"><div class="ttname"><a href="group__tlx__container__btree.html#ga069fbcbc52ca1f7cbe681ff86d1e0e73">TLX_BTREE_MAX</a></div><div class="ttdeci">#define TLX_BTREE_MAX(a, b)</div><div class="ttdoc">The maximum of a and b. Used in some compile-time formulas. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00060">btree.hpp:60</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a33c1ee0eb39360edec2a985301b9d631"><div class="ttname"><a href="classtlx_1_1BTree.html#a33c1ee0eb39360edec2a985301b9d631">tlx::BTree::equal_range</a></div><div class="ttdeci">std::pair< const_iterator, const_iterator > equal_range(const key_type &key) const </div><div class="ttdoc">Searches the B+ tree and returns both lower_bound() and upper_bound(). </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01702">btree.hpp:1702</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a8eeb2fd6ed899b070ade045b4957c2a2"><div class="ttname"><a href="classtlx_1_1BTree.html#a8eeb2fd6ed899b070ade045b4957c2a2">tlx::BTree::key_greater</a></div><div class="ttdeci">bool key_greater(const key_type &a, const key_type &b) const </div><div class="ttdoc">True if a > b ? constructed from key_less() </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01210">btree.hpp:1210</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__iterator_html_aac736176f33ad72afc6ab405b1bf9ecc"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__iterator.html#aac736176f33ad72afc6ab405b1bf9ecc">tlx::BTree::const_iterator::reference</a></div><div class="ttdeci">const value_type & reference</div><div class="ttdoc">Reference to the value_type. STL required. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00520">btree.hpp:520</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a1234e2d209b518ae0396fb36b4be82d4"><div class="ttname"><a href="classtlx_1_1BTree.html#a1234e2d209b518ae0396fb36b4be82d4">tlx::BTree::split_leaf_node</a></div><div class="ttdeci">void split_leaf_node(LeafNode *leaf, key_type *out_newkey, node **out_newleaf)</div><div class="ttdoc">Split up a leaf node into two equally-filled sibling leaves. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l02074">btree.hpp:2074</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_ad9c4fcb14953cafb848894fccab09ebe"><div class="ttname"><a href="classtlx_1_1BTree.html#ad9c4fcb14953cafb848894fccab09ebe">tlx::BTree::BTree</a></div><div class="ttdeci">BTree(InputIterator first, InputIterator last, const key_compare &kcf, const allocator_type &alloc=allocator_type())</div><div class="ttdoc">Constructor initializing a B+ tree with the range [first,last) and a special key comparison object...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01131">btree.hpp:1131</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a3d0a35a00bc2ff5608fe613ea8fa47e6"><div class="ttname"><a href="classtlx_1_1BTree.html#a3d0a35a00bc2ff5608fe613ea8fa47e6">tlx::BTree::bulk_load</a></div><div class="ttdeci">void bulk_load(Iterator ibegin, Iterator iend)</div><div class="ttdoc">Bulk load a sorted range. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l02155">btree.hpp:2155</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1reverse__iterator_html_acf947bbb9e09f863cc3572ff8550b183"><div class="ttname"><a href="classtlx_1_1BTree_1_1reverse__iterator.html#acf947bbb9e09f863cc3572ff8550b183">tlx::BTree::reverse_iterator::difference_type</a></div><div class="ttdeci">ptrdiff_t difference_type</div><div class="ttdoc">STL-magic. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00701">btree.hpp:701</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_ac8bb3912a3ce86b15842e79d0b421204"><div class="ttname"><a href="classtlx_1_1BTree.html#ac8bb3912a3ce86b15842e79d0b421204">tlx::BTree::clear</a></div><div class="ttdeci">void clear()</div><div class="ttdoc">Frees all key/data pairs and all nodes of the tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01294">btree.hpp:1294</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_aff35d256caa55f37343da8200179e608"><div class="ttname"><a href="classtlx_1_1BTree.html#aff35d256caa55f37343da8200179e608">tlx::BTree::allocator_type</a></div><div class="ttdeci">Allocator allocator_type</div><div class="ttdoc">Seventh template parameter: STL allocator for tree nodes. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00153">btree.hpp:153</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1reverse__iterator_html_a1662eef91eb8e828a6ef9ba7651c9c8e"><div class="ttname"><a href="classtlx_1_1BTree_1_1reverse__iterator.html#a1662eef91eb8e828a6ef9ba7651c9c8e">tlx::BTree::reverse_iterator::iterator_category</a></div><div class="ttdeci">std::bidirectional_iterator_tag iterator_category</div><div class="ttdoc">STL-magic iterator category. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00698">btree.hpp:698</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1iterator_html_ad25b518036b886d8f35a3c059301d007"><div class="ttname"><a href="classtlx_1_1BTree_1_1iterator.html#ad25b518036b886d8f35a3c059301d007">tlx::BTree::iterator::pointer</a></div><div class="ttdeci">value_type * pointer</div><div class="ttdoc">Pointer to the value_type. STL required. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00348">btree.hpp:348</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a791d570451c392e04774581a7d04707a"><div class="ttname"><a href="classtlx_1_1BTree.html#a791d570451c392e04774581a7d04707a">tlx::BTree::inner_node_allocator</a></div><div class="ttdeci">InnerNode::alloc_type inner_node_allocator()</div><div class="ttdoc">Return an allocator for InnerNode objects. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01248">btree.hpp:1248</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a3734f27e109c9117ded78c25d6d40624"><div class="ttname"><a href="classtlx_1_1BTree.html#a3734f27e109c9117ded78c25d6d40624">tlx::BTree::insert_descend</a></div><div class="ttdeci">std::pair< iterator, bool > insert_descend(node *n, const key_type &key, const value_type &value, key_type *splitkey, node **splitnode)</div><div class="ttdoc">Insert an item into the B+ tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01928">btree.hpp:1928</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a31fbffbdf311ce68ec99f0aebab5c0ea"><div class="ttname"><a href="classtlx_1_1BTree.html#a31fbffbdf311ce68ec99f0aebab5c0ea">tlx::BTree::lower_bound</a></div><div class="ttdeci">const_iterator lower_bound(const key_type &key) const </div><div class="ttdoc">Searches the B+ tree and returns a constant iterator to the first pair equal to or greater than key...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01636">btree.hpp:1636</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a68c599ddcbfddc65170de524ac165e44"><div class="ttname"><a href="classtlx_1_1BTree.html#a68c599ddcbfddc65170de524ac165e44">tlx::BTree::rend</a></div><div class="ttdeci">reverse_iterator rend()</div><div class="ttdoc">Constructs a read/data-write reverse iterator that points to the first slot in the first leaf of the ...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01371">btree.hpp:1371</a></div></div>
<div class="ttc" id="group__tlx__container_html_gac9244ca0e2eb361199a8ea7528495f04"><div class="ttname"><a href="group__tlx__container.html#gac9244ca0e2eb361199a8ea7528495f04">tlx::operator>=</a></div><div class="ttdeci">static bool operator>=(const StringView &x, const std::string &y) noexcept</div><div class="ttdef"><b>Definition:</b> <a href="string__view_8hpp_source.html#l00541">string_view.hpp:541</a></div></div>
<div class="ttc" id="group__tlx__string_html_ga4fb56b145f00428be03f74257c61f1cc"><div class="ttname"><a href="group__tlx__string.html#ga4fb56b145f00428be03f74257c61f1cc">tlx::split</a></div><div class="ttdeci">std::vector< std::string > split(char sep, const std::string &str, std::string::size_type limit)</div><div class="ttdoc">Split the given string at each separator character into distinct substrings. </div><div class="ttdef"><b>Definition:</b> <a href="split_8cpp_source.html#l00020">split.cpp:20</a></div></div>
<div class="ttc" id="group__tlx__container_html_ga9f8b1d83565260f6029a0d980e928a89"><div class="ttname"><a href="group__tlx__container.html#ga9f8b1d83565260f6029a0d980e928a89">tlx::operator<=</a></div><div class="ttdeci">static bool operator<=(const StringView &x, const std::string &y) noexcept</div><div class="ttdef"><b>Definition:</b> <a href="string__view_8hpp_source.html#l00531">string_view.hpp:531</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1InnerNode_html_a85fe587cefa3de25d9549aaf09356ba6"><div class="ttname"><a href="structtlx_1_1BTree_1_1InnerNode.html#a85fe587cefa3de25d9549aaf09356ba6">tlx::BTree::InnerNode::initialize</a></div><div class="ttdeci">void initialize(const unsigned short l)</div><div class="ttdoc">Set variables to initial values. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00246">btree.hpp:246</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_ab3ac8f3e8366bd3a32709a1fb44e8524"><div class="ttname"><a href="classtlx_1_1BTree.html#ab3ac8f3e8366bd3a32709a1fb44e8524">tlx::BTree::allocate_leaf</a></div><div class="ttdeci">LeafNode * allocate_leaf()</div><div class="ttdoc">Allocate and initialize a leaf node. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01253">btree.hpp:1253</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_acea44ed500a54b2bb93e16b86e81afa8"><div class="ttname"><a href="classtlx_1_1BTree.html#acea44ed500a54b2bb93e16b86e81afa8">tlx::BTree::rbegin</a></div><div class="ttdeci">reverse_iterator rbegin()</div><div class="ttdoc">Constructs a read/data-write reverse iterator that points to the first invalid slot in the last leaf ...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01365">btree.hpp:1365</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1iterator_html_ae6dd5cb1a04fdb444583ffc0b8a29a5b"><div class="ttname"><a href="classtlx_1_1BTree_1_1iterator.html#ae6dd5cb1a04fdb444583ffc0b8a29a5b">tlx::BTree::iterator::value_type</a></div><div class="ttdeci">BTree::value_type value_type</div><div class="ttdoc">The value type of the btree. Returned by operator*(). </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00342">btree.hpp:342</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_addd4e2b6ff9c7bef508bc908caabb2d4"><div class="ttname"><a href="classtlx_1_1BTree.html#addd4e2b6ff9c7bef508bc908caabb2d4">tlx::BTree::count</a></div><div class="ttdeci">size_type count(const key_type &key) const </div><div class="ttdoc">Tries to locate a key in the B+ tree and returns the number of identical key entries found...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01584">btree.hpp:1584</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1tree__stats_html_a15e93268f0db30aba3e965bd0be33b02"><div class="ttname"><a href="structtlx_1_1BTree_1_1tree__stats.html#a15e93268f0db30aba3e965bd0be33b02">tlx::BTree::tree_stats::avgfill_leaves</a></div><div class="ttdeci">double avgfill_leaves() const </div><div class="ttdoc">Return the average fill of leaves. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01065">btree.hpp:1065</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__iterator_html_a38ffbf220e298d1ee8c79307009cfa00"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__iterator.html#a38ffbf220e298d1ee8c79307009cfa00">tlx::BTree::const_iterator::TLX_BTREE_FRIENDS</a></div><div class="ttdeci">TLX_BTREE_FRIENDS</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00550">btree.hpp:550</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a8169e809b9e94043b7aa6c5d9847fb19"><div class="ttname"><a href="classtlx_1_1BTree.html#a8169e809b9e94043b7aa6c5d9847fb19">tlx::BTree::shift_right_leaf</a></div><div class="ttdeci">static void shift_right_leaf(LeafNode *left, LeafNode *right, InnerNode *parent, unsigned int parentslot)</div><div class="ttdoc">Balance two leaf nodes. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l03329">btree.hpp:3329</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_aaa130f2c02b8f7701a6795c09d8988f5"><div class="ttname"><a href="classtlx_1_1BTree.html#aaa130f2c02b8f7701a6795c09d8988f5">tlx::BTree::erase_one_descend</a></div><div class="ttdeci">result_t erase_one_descend(const key_type &key, node *curr, node *left, node *right, InnerNode *left_parent, InnerNode *right_parent, InnerNode *parent, unsigned int parentslot)</div><div class="ttdoc">Erase one (the first) key/data pair in the B+ tree matching key. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l02449">btree.hpp:2449</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_ab0d2e59411be6b53e63c29149a17fbcc"><div class="ttname"><a href="classtlx_1_1BTree.html#ab0d2e59411be6b53e63c29149a17fbcc">tlx::BTree::traits</a></div><div class="ttdeci">Traits traits</div><div class="ttdoc">Fifth template parameter: Traits object used to define more parameters of the B+ tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00146">btree.hpp:146</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1reverse__iterator_html_ae6dd5cb1a04fdb444583ffc0b8a29a5b"><div class="ttname"><a href="classtlx_1_1BTree_1_1reverse__iterator.html#ae6dd5cb1a04fdb444583ffc0b8a29a5b">tlx::BTree::reverse_iterator::value_type</a></div><div class="ttdeci">BTree::value_type value_type</div><div class="ttdoc">The value type of the btree. Returned by operator*(). </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00689">btree.hpp:689</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_ae301448f117e44063d3b322be3534c13"><div class="ttname"><a href="classtlx_1_1BTree.html#ae301448f117e44063d3b322be3534c13">tlx::BTree::shift_left_leaf</a></div><div class="ttdeci">static result_t shift_left_leaf(LeafNode *left, LeafNode *right, InnerNode *parent, unsigned int parentslot)</div><div class="ttdoc">Balance two leaf nodes. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l03215">btree.hpp:3215</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1LeafNode_html_a161bc176fff45968605cbbf2bb5f4ef9"><div class="ttname"><a href="structtlx_1_1BTree_1_1LeafNode.html#a161bc176fff45968605cbbf2bb5f4ef9">tlx::BTree::LeafNode::is_underflow</a></div><div class="ttdeci">bool is_underflow() const </div><div class="ttdoc">True if node has too few entries. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00308">btree.hpp:308</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1InnerNode_html_a6b3d146cb22feb18ab880a19892aa01a"><div class="ttname"><a href="structtlx_1_1BTree_1_1InnerNode.html#a6b3d146cb22feb18ab880a19892aa01a">tlx::BTree::InnerNode::is_few</a></div><div class="ttdeci">bool is_few() const </div><div class="ttdoc">True if few used entries, less than half full. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00261">btree.hpp:261</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1iterator_html_a8ba2b56dfdb5b9beba97bb9ba59ae71b"><div class="ttname"><a href="classtlx_1_1BTree_1_1iterator.html#a8ba2b56dfdb5b9beba97bb9ba59ae71b">tlx::BTree::iterator::key</a></div><div class="ttdeci">const key_type & key() const </div><div class="ttdoc">Key of the current slot. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00419">btree.hpp:419</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_aebc82407c13a86e9551f7984d2e3d356"><div class="ttname"><a href="classtlx_1_1BTree.html#aebc82407c13a86e9551f7984d2e3d356">tlx::BTree::root_</a></div><div class="ttdeci">node * root_</div><div class="ttdoc">Pointer to the B+ tree&#39;s root node, either leaf or inner node. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01077">btree.hpp:1077</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__reverse__iterator_html_a38ffbf220e298d1ee8c79307009cfa00"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a38ffbf220e298d1ee8c79307009cfa00">tlx::BTree::const_reverse_iterator::TLX_BTREE_FRIENDS</a></div><div class="ttdeci">TLX_BTREE_FRIENDS</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00895">btree.hpp:895</a></div></div>
<div class="ttc" id="namespacetlx_html_ade1320658af9846df1831480a96e7a38"><div class="ttname"><a href="namespacetlx.html#ade1320658af9846df1831480a96e7a38">tlx::swap</a></div><div class="ttdeci">void swap(CountingPtr< A, D > &a1, CountingPtr< A, D > &a2) noexcept</div><div class="ttdoc">swap enclosed object with another counting pointer (no reference counts need change) ...</div><div class="ttdef"><b>Definition:</b> <a href="counting__ptr_8hpp_source.html#l00320">counting_ptr.hpp:320</a></div></div>
<div class="ttc" id="group__tlx__container__btree_html_gabe5546ec024823fdb200cf2e6e9b624c"><div class="ttname"><a href="group__tlx__container__btree.html#gabe5546ec024823fdb200cf2e6e9b624c">TLX_BTREE_PRINT</a></div><div class="ttdeci">#define TLX_BTREE_PRINT(x)</div><div class="ttdoc">Print out debug information to std::cout if TLX_BTREE_DEBUG is defined. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00052">btree.hpp:52</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1tree__stats_html_a3df9010ac682baa68b20e01e5df2be3d"><div class="ttname"><a href="structtlx_1_1BTree_1_1tree__stats.html#a3df9010ac682baa68b20e01e5df2be3d">tlx::BTree::tree_stats::leaves</a></div><div class="ttdeci">size_type leaves</div><div class="ttdoc">Number of leaves in the B+ tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01042">btree.hpp:1042</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1tree__stats_html_a942a7c4c9368b0fa17df9feb4e0dbd74"><div class="ttname"><a href="structtlx_1_1BTree_1_1tree__stats.html#a942a7c4c9368b0fa17df9feb4e0dbd74">tlx::BTree::tree_stats::nodes</a></div><div class="ttdeci">size_type nodes() const </div><div class="ttdoc">Return the total number of nodes. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01060">btree.hpp:1060</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a353e5a73d56e289c9b48a5bc43e72211"><div class="ttname"><a href="classtlx_1_1BTree.html#a353e5a73d56e289c9b48a5bc43e72211">tlx::BTree::leaf_node_allocator</a></div><div class="ttdeci">LeafNode::alloc_type leaf_node_allocator()</div><div class="ttdoc">Return an allocator for LeafNode objects. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01243">btree.hpp:1243</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1reverse__iterator_html_acfda6b3523d47fd797a150186ab42ef0"><div class="ttname"><a href="classtlx_1_1BTree_1_1reverse__iterator.html#acfda6b3523d47fd797a150186ab42ef0">tlx::BTree::reverse_iterator::curr_leaf</a></div><div class="ttdeci">BTree::LeafNode * curr_leaf</div><div class="ttdoc">The currently referenced leaf node of the tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00710">btree.hpp:710</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__iterator_html_acf947bbb9e09f863cc3572ff8550b183"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__iterator.html#acf947bbb9e09f863cc3572ff8550b183">tlx::BTree::const_iterator::difference_type</a></div><div class="ttdeci">ptrdiff_t difference_type</div><div class="ttdoc">STL-magic. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00529">btree.hpp:529</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a5d945dbdb41ca2fe76d87b2ba122e13e"><div class="ttname"><a href="classtlx_1_1BTree.html#a5d945dbdb41ca2fe76d87b2ba122e13e">tlx::BTree::key_less_</a></div><div class="ttdeci">key_compare key_less_</div><div class="ttdoc">Key comparison object. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01090">btree.hpp:1090</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a3e25d4b9f9efb4a5496dcf849836fe16"><div class="ttname"><a href="classtlx_1_1BTree.html#a3e25d4b9f9efb4a5496dcf849836fe16">tlx::BTree::shift_right_inner</a></div><div class="ttdeci">static void shift_right_inner(InnerNode *left, InnerNode *right, InnerNode *parent, unsigned int parentslot)</div><div class="ttdoc">Balance two inner nodes. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l03385">btree.hpp:3385</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1result__t_html_a51e8cab78f4a914e9cb4247c84927e8f"><div class="ttname"><a href="structtlx_1_1BTree_1_1result__t.html#a51e8cab78f4a914e9cb4247c84927e8f">tlx::BTree::result_t::result_t</a></div><div class="ttdeci">result_t(result_flags_t f=btree_ok)</div><div class="ttdoc">Constructor of a result with a specific flag, this can also be used as for implicit conversion...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l02334">btree.hpp:2334</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a86ce69542070f80643dee49e06bebf64"><div class="ttname"><a href="classtlx_1_1BTree.html#a86ce69542070f80643dee49e06bebf64">tlx::BTree::key_greaterequal</a></div><div class="ttdeci">bool key_greaterequal(const key_type &a, const key_type &b) const </div><div class="ttdoc">True if a >= b ? constructed from key_less() </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01215">btree.hpp:1215</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_ad0a6e56ee5e948ed239abafb7ac4f749"><div class="ttname"><a href="classtlx_1_1BTree.html#ad0a6e56ee5e948ed239abafb7ac4f749">tlx::BTree::find_upper</a></div><div class="ttdeci">unsigned short find_upper(const node_type *n, const key_type &key) const </div><div class="ttdoc">Searches for the first key in the node n greater than key. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01445">btree.hpp:1445</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_acad38d52497a975bfb6f2f6acd76631f"><div class="ttname"><a href="classtlx_1_1BTree.html#acad38d52497a975bfb6f2f6acd76631f">tlx::BTree::end</a></div><div class="ttdeci">iterator end()</div><div class="ttdoc">Constructs a read/data-write iterator that points to the first invalid slot in the last leaf of the B...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01347">btree.hpp:1347</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1iterator_html_af55cd2eba9d655b56966add998d51b37"><div class="ttname"><a href="classtlx_1_1BTree_1_1iterator.html#af55cd2eba9d655b56966add998d51b37">tlx::BTree::iterator::iterator</a></div><div class="ttdeci">iterator(typename BTree::LeafNode *l, unsigned short s)</div><div class="ttdoc">Initializing-Constructor of a mutable iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00399">btree.hpp:399</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1iterator_html_a67d652c2433cf9217ed2a1485092fdd1"><div class="ttname"><a href="classtlx_1_1BTree_1_1iterator.html#a67d652c2433cf9217ed2a1485092fdd1">tlx::BTree::iterator::iterator</a></div><div class="ttdeci">iterator()</div><div class="ttdoc">Default-Constructor of a mutable iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00394">btree.hpp:394</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1LeafNode_html_a6b3d146cb22feb18ab880a19892aa01a"><div class="ttname"><a href="structtlx_1_1BTree_1_1LeafNode.html#a6b3d146cb22feb18ab880a19892aa01a">tlx::BTree::LeafNode::is_few</a></div><div class="ttdeci">bool is_few() const </div><div class="ttdoc">True if few used entries, less than half full. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00303">btree.hpp:303</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1LeafNode_html_a9110db83a99825d372dfb35fda3ab7e3"><div class="ttname"><a href="structtlx_1_1BTree_1_1LeafNode.html#a9110db83a99825d372dfb35fda3ab7e3">tlx::BTree::LeafNode::next_leaf</a></div><div class="ttdeci">LeafNode * next_leaf</div><div class="ttdoc">Double linked list pointers to traverse the leaves. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00281">btree.hpp:281</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1reverse__iterator_html_ad25b518036b886d8f35a3c059301d007"><div class="ttname"><a href="classtlx_1_1BTree_1_1reverse__iterator.html#ad25b518036b886d8f35a3c059301d007">tlx::BTree::reverse_iterator::pointer</a></div><div class="ttdeci">value_type * pointer</div><div class="ttdoc">Pointer to the value_type. STL required. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00695">btree.hpp:695</a></div></div>
<div class="ttc" id="structtlx_1_1btree__default__traits_html_a4fefb7d61067934069f6a783e110ab47"><div class="ttname"><a href="structtlx_1_1btree__default__traits.html#a4fefb7d61067934069f6a783e110ab47">tlx::btree_default_traits::binsearch_threshold</a></div><div class="ttdeci">static const size_t binsearch_threshold</div><div class="ttdoc">As of stx-btree-0.9, the code does linear search in find_lower() and find_upper() instead of binary_s...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00100">btree.hpp:100</a></div></div>
<div class="ttc" id="structtlx_1_1btree__default__traits_html_a6295d47efda04de55c38cb8ea1cdb807"><div class="ttname"><a href="structtlx_1_1btree__default__traits.html#a6295d47efda04de55c38cb8ea1cdb807">tlx::btree_default_traits::debug</a></div><div class="ttdeci">static const bool debug</div><div class="ttdoc">If true, the tree will print out debug information and a tree dump during insert() or erase() operati...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00084">btree.hpp:84</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1InnerNode_html_ab52e5ead4896194d02bf207103be33a8"><div class="ttname"><a href="structtlx_1_1BTree_1_1InnerNode.html#ab52e5ead4896194d02bf207103be33a8">tlx::BTree::InnerNode::key</a></div><div class="ttdeci">const key_type & key(size_t s) const </div><div class="ttdoc">Return key in slot s. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00251">btree.hpp:251</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a25950f60bc42a7b7bbd2fa6e9cecc7f4"><div class="ttname"><a href="classtlx_1_1BTree.html#a25950f60bc42a7b7bbd2fa6e9cecc7f4">tlx::BTree::key_lessequal</a></div><div class="ttdeci">bool key_lessequal(const key_type &a, const key_type &b) const </div><div class="ttdoc">True if a <= b ? constructed from key_less() </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01205">btree.hpp:1205</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1LeafNode_html"><div class="ttname"><a href="structtlx_1_1BTree_1_1LeafNode.html">tlx::BTree::LeafNode</a></div><div class="ttdoc">Extended structure of a leaf node in memory. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00273">btree.hpp:273</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a049ea88e87d1254a65596324d47155ed"><div class="ttname"><a href="classtlx_1_1BTree.html#a049ea88e87d1254a65596324d47155ed">tlx::BTree::clear_recursive</a></div><div class="ttdeci">void clear_recursive(node *n)</div><div class="ttdoc">Recursively free up nodes. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01311">btree.hpp:1311</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a8d6ac34d80de837a5e6125c932f1c288"><div class="ttname"><a href="classtlx_1_1BTree.html#a8d6ac34d80de837a5e6125c932f1c288">tlx::BTree::head_leaf_</a></div><div class="ttdeci">LeafNode * head_leaf_</div><div class="ttdoc">Pointer to first leaf in the double linked leaf chain. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01080">btree.hpp:1080</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html"><div class="ttname"><a href="classtlx_1_1BTree.html">tlx::BTree</a></div><div class="ttdoc">Basic class implementing a B+ tree data structure in memory. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00124">btree.hpp:124</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1value__compare_html"><div class="ttname"><a href="classtlx_1_1BTree_1_1value__compare.html">tlx::BTree::value_compare</a></div><div class="ttdoc">Function class to compare value_type objects. Required by the STL. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01160">btree.hpp:1160</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a482b50e623a123f653e2a91f113a507b"><div class="ttname"><a href="classtlx_1_1BTree.html#a482b50e623a123f653e2a91f113a507b">tlx::BTree::upper_bound</a></div><div class="ttdeci">iterator upper_bound(const key_type &key)</div><div class="ttdoc">Searches the B+ tree and returns an iterator to the first pair greater than key, or end() if all keys...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01656">btree.hpp:1656</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1LeafNode_html_ab52e5ead4896194d02bf207103be33a8"><div class="ttname"><a href="structtlx_1_1BTree_1_1LeafNode.html#ab52e5ead4896194d02bf207103be33a8">tlx::BTree::LeafNode::key</a></div><div class="ttdeci">const key_type & key(size_t s) const </div><div class="ttdoc">Return key in slot s. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00293">btree.hpp:293</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1result__t_html_adbc903b428081896ec43d6eb50a30d50"><div class="ttname"><a href="structtlx_1_1BTree_1_1result__t.html#adbc903b428081896ec43d6eb50a30d50">tlx::BTree::result_t::result_t</a></div><div class="ttdeci">result_t(result_flags_t f, const key_type &k)</div><div class="ttdoc">Constructor with a lastkey value. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l02339">btree.hpp:2339</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__iterator_html"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__iterator.html">tlx::BTree::const_iterator</a></div><div class="ttdoc">STL-like read-only iterator object for B+ tree items. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00508">btree.hpp:508</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__iterator_html_abdefca51d553d29c565b08e091f8cd19"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__iterator.html#abdefca51d553d29c565b08e091f8cd19">tlx::BTree::const_iterator::const_iterator</a></div><div class="ttdeci">const_iterator()</div><div class="ttdoc">Default-Constructor of a const iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00556">btree.hpp:556</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1reverse__iterator_html_ae606c9d192f5f681a19b60b19d8f18d2"><div class="ttname"><a href="classtlx_1_1BTree_1_1reverse__iterator.html#ae606c9d192f5f681a19b60b19d8f18d2">tlx::BTree::reverse_iterator::curr_slot</a></div><div class="ttdeci">unsigned short curr_slot</div><div class="ttdoc">One slot past the current key/data slot referenced. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00713">btree.hpp:713</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a3b5e61b63a8f02f388e295a287aab316"><div class="ttname"><a href="classtlx_1_1BTree.html#a3b5e61b63a8f02f388e295a287aab316">tlx::BTree::get_stats</a></div><div class="ttdeci">const struct tree_stats & get_stats() const </div><div class="ttdoc">Return a const reference to the current statistics. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01510">btree.hpp:1510</a></div></div>
<div class="ttc" id="group__tlx__container_html_gaaf628430227788d04613cf5ffba32e0c"><div class="ttname"><a href="group__tlx__container.html#gaaf628430227788d04613cf5ffba32e0c">tlx::operator==</a></div><div class="ttdeci">static bool operator==(const StringView &a, const std::string &b) noexcept</div><div class="ttdoc">equality operator to compare a StringView with a std::string </div><div class="ttdef"><b>Definition:</b> <a href="string__view_8hpp_source.html#l00480">string_view.hpp:480</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__iterator_html_ae606c9d192f5f681a19b60b19d8f18d2"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__iterator.html#ae606c9d192f5f681a19b60b19d8f18d2">tlx::BTree::const_iterator::curr_slot</a></div><div class="ttdeci">unsigned short curr_slot</div><div class="ttdoc">Current key/data slot referenced. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00541">btree.hpp:541</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_ac048f549259de32da2acd742cce52d5c"><div class="ttname"><a href="classtlx_1_1BTree.html#ac048f549259de32da2acd742cce52d5c">tlx::BTree::insert</a></div><div class="ttdeci">void insert(InputIterator first, InputIterator last)</div><div class="ttdoc">Attempt to insert the range [first,last) of value_type pairs into the B+ tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01860">btree.hpp:1860</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a288f383c102e522614ffcb27b1b979a9"><div class="ttname"><a href="classtlx_1_1BTree.html#a288f383c102e522614ffcb27b1b979a9">tlx::BTree::verify_leaflinks</a></div><div class="ttdeci">void verify_leaflinks() const </div><div class="ttdoc">Verify the double linked list of leaves. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l03653">btree.hpp:3653</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1reverse__iterator_html_a934db568e9cc178d05533b6a5a255b5f"><div class="ttname"><a href="classtlx_1_1BTree_1_1reverse__iterator.html#a934db568e9cc178d05533b6a5a255b5f">tlx::BTree::reverse_iterator::reverse_iterator</a></div><div class="ttdeci">reverse_iterator(typename BTree::LeafNode *l, unsigned short s)</div><div class="ttdoc">Initializing-Constructor of a mutable reverse iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00741">btree.hpp:741</a></div></div>
<div class="ttc" id="die_2core_8hpp_html"><div class="ttname"><a href="die_2core_8hpp.html">core.hpp</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__reverse__iterator_html_ae6dd5cb1a04fdb444583ffc0b8a29a5b"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__reverse__iterator.html#ae6dd5cb1a04fdb444583ffc0b8a29a5b">tlx::BTree::const_reverse_iterator::value_type</a></div><div class="ttdeci">BTree::value_type value_type</div><div class="ttdoc">The value type of the btree. Returned by operator*(). </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00862">btree.hpp:862</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a6747e195cffb9e4dbceef6a4848b3563"><div class="ttname"><a href="classtlx_1_1BTree.html#a6747e195cffb9e4dbceef6a4848b3563">tlx::BTree::tail_leaf_</a></div><div class="ttdeci">LeafNode * tail_leaf_</div><div class="ttdoc">Pointer to last leaf in the double linked leaf chain. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01083">btree.hpp:1083</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1reverse__iterator_html_abe8933d436779a43cb5c1896ff5f2918"><div class="ttname"><a href="classtlx_1_1BTree_1_1reverse__iterator.html#abe8933d436779a43cb5c1896ff5f2918">tlx::BTree::reverse_iterator::reference</a></div><div class="ttdeci">value_type & reference</div><div class="ttdoc">Reference to the value_type. STL required. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00692">btree.hpp:692</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_aa218c2c89397f8d0484ef9438d540456"><div class="ttname"><a href="classtlx_1_1BTree.html#aa218c2c89397f8d0484ef9438d540456">tlx::BTree::insert</a></div><div class="ttdeci">std::pair< iterator, bool > insert(const value_type &x)</div><div class="ttdoc">Attempt to insert a key/data pair into the B+ tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01846">btree.hpp:1846</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1tree__stats_html_a769e947b7bd053d20cc72d6187e1d0fb"><div class="ttname"><a href="structtlx_1_1BTree_1_1tree__stats.html#a769e947b7bd053d20cc72d6187e1d0fb">tlx::BTree::tree_stats::size</a></div><div class="ttdeci">size_type size</div><div class="ttdoc">Number of items in the B+ tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01039">btree.hpp:1039</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a59929a3ceec53dc1b7e288c245f7f4f7"><div class="ttname"><a href="classtlx_1_1BTree.html#a59929a3ceec53dc1b7e288c245f7f4f7">tlx::BTree::erase_iter_descend</a></div><div class="ttdeci">result_t erase_iter_descend(const iterator &iter, node *curr, node *left, node *right, InnerNode *left_parent, InnerNode *right_parent, InnerNode *parent, unsigned int parentslot)</div><div class="ttdoc">Erase one key/data pair referenced by an iterator in the B+ tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l02779">btree.hpp:2779</a></div></div>
<div class="ttc" id="group__tlx__container__btree_html_gaf7a068d4e246b8f8e74bfc33f205596b"><div class="ttname"><a href="group__tlx__container__btree.html#gaf7a068d4e246b8f8e74bfc33f205596b">TLX_BTREE_ASSERT</a></div><div class="ttdeci">#define TLX_BTREE_ASSERT(x)</div><div class="ttdoc">Assertion only if TLX_BTREE_DEBUG is defined. This is not used in verify(). </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00055">btree.hpp:55</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a62c2add0ee33d7acce9f02077cd1da99"><div class="ttname"><a href="classtlx_1_1BTree.html#a62c2add0ee33d7acce9f02077cd1da99">tlx::BTree::key_comp</a></div><div class="ttdeci">key_compare key_comp() const </div><div class="ttdoc">Constant access to the key comparison object sorting the B+ tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01183">btree.hpp:1183</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1reverse__iterator_html_ab01a64ad14e5dad8394b204fba8c41ad"><div class="ttname"><a href="classtlx_1_1BTree_1_1reverse__iterator.html#ab01a64ad14e5dad8394b204fba8c41ad">tlx::BTree::reverse_iterator::reverse_iterator</a></div><div class="ttdeci">reverse_iterator()</div><div class="ttdoc">Default-Constructor of a reverse iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00736">btree.hpp:736</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__reverse__iterator_html_abc7de3f9fe46e963548008dbc3b90ba4"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__reverse__iterator.html#abc7de3f9fe46e963548008dbc3b90ba4">tlx::BTree::const_reverse_iterator::const_reverse_iterator</a></div><div class="ttdeci">const_reverse_iterator()</div><div class="ttdoc">Default-Constructor of a const reverse iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00901">btree.hpp:901</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1result__t_html_a8b50d073eba40cd3cd2678b97b7e0002"><div class="ttname"><a href="structtlx_1_1BTree_1_1result__t.html#a8b50d073eba40cd3cd2678b97b7e0002">tlx::BTree::result_t::lastkey</a></div><div class="ttdeci">key_type lastkey</div><div class="ttdoc">The key to be updated at the parent&#39;s slot. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l02330">btree.hpp:2330</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a3ff25301e2f68b6862c2ea4a36dab058"><div class="ttname"><a href="classtlx_1_1BTree.html#a3ff25301e2f68b6862c2ea4a36dab058">tlx::BTree::insert</a></div><div class="ttdeci">iterator insert(iterator, const value_type &x)</div><div class="ttdoc">Attempt to insert a key/data pair into the B+ tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01852">btree.hpp:1852</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_af50bbeb39af1051f057b65da1c71a671"><div class="ttname"><a href="classtlx_1_1BTree.html#af50bbeb39af1051f057b65da1c71a671">tlx::BTree::~BTree</a></div><div class="ttdeci">~BTree()</div><div class="ttdoc">Frees up all used B+ tree memory pages. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01139">btree.hpp:1139</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_ae57ff6dd1cb4dc347b892dfa87ea6613"><div class="ttname"><a href="classtlx_1_1BTree.html#ae57ff6dd1cb4dc347b892dfa87ea6613">tlx::BTree::erase</a></div><div class="ttdeci">size_type erase(const key_type &key)</div><div class="ttdoc">Erases all the key/data pairs associated with the given key. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l02392">btree.hpp:2392</a></div></div>
<div class="ttc" id="structtlx_1_1btree__default__traits_html"><div class="ttname"><a href="structtlx_1_1btree__default__traits.html">tlx::btree_default_traits</a></div><div class="ttdoc">Generates default traits for a B+ tree used as a set or map. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00074">btree.hpp:74</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a373c61cca9b31735f4548b5b59b70184"><div class="ttname"><a href="classtlx_1_1BTree.html#a373c61cca9b31735f4548b5b59b70184">tlx::BTree::lower_bound</a></div><div class="ttdeci">iterator lower_bound(const key_type &key)</div><div class="ttdoc">Searches the B+ tree and returns an iterator to the first pair equal to or greater than key...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01616">btree.hpp:1616</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1node_html"><div class="ttname"><a href="structtlx_1_1BTree_1_1node.html">tlx::BTree::node</a></div><div class="ttdoc">The header structure of each node in-memory. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00213">btree.hpp:213</a></div></div>
<div class="ttc" id="structtlx_1_1btree__default__traits_html_adc2c16c96b684ee7d881e7dab29717a3"><div class="ttname"><a href="structtlx_1_1btree__default__traits.html#adc2c16c96b684ee7d881e7dab29717a3">tlx::btree_default_traits::leaf_slots</a></div><div class="ttdeci">static const int leaf_slots</div><div class="ttdoc">Number of slots in each leaf of the tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00088">btree.hpp:88</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_afd6849b9290c28ea815a0c03b1d9321a"><div class="ttname"><a href="classtlx_1_1BTree.html#afd6849b9290c28ea815a0c03b1d9321a">tlx::BTree::split_inner_node</a></div><div class="ttdeci">void split_inner_node(InnerNode *inner, key_type *out_newkey, node **out_newinner, unsigned int addslot)</div><div class="ttdoc">Split up an inner node into two equally-filled sibling nodes. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l02110">btree.hpp:2110</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1iterator_html_acf947bbb9e09f863cc3572ff8550b183"><div class="ttname"><a href="classtlx_1_1BTree_1_1iterator.html#acf947bbb9e09f863cc3572ff8550b183">tlx::BTree::iterator::difference_type</a></div><div class="ttdeci">ptrdiff_t difference_type</div><div class="ttdoc">STL-magic. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00354">btree.hpp:354</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_ae62fda6629d06db7d6fdcd3e81916932"><div class="ttname"><a href="classtlx_1_1BTree.html#ae62fda6629d06db7d6fdcd3e81916932">tlx::BTree::merge_leaves</a></div><div class="ttdeci">result_t merge_leaves(LeafNode *left, LeafNode *right, InnerNode *parent)</div><div class="ttdoc">Merge two leaf nodes. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l03139">btree.hpp:3139</a></div></div>
<div class="ttc" id="structtlx_1_1btree__default__traits_html_a81a632bc519f850f4af56567ba404f4e"><div class="ttname"><a href="structtlx_1_1btree__default__traits.html#a81a632bc519f850f4af56567ba404f4e">tlx::btree_default_traits::self_verify</a></div><div class="ttdeci">static const bool self_verify</div><div class="ttdoc">If true, the tree will self verify its invariants after each insert() or erase(). ...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00078">btree.hpp:78</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1iterator_html_a38ffbf220e298d1ee8c79307009cfa00"><div class="ttname"><a href="classtlx_1_1BTree_1_1iterator.html#a38ffbf220e298d1ee8c79307009cfa00">tlx::BTree::iterator::TLX_BTREE_FRIENDS</a></div><div class="ttdeci">TLX_BTREE_FRIENDS</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00388">btree.hpp:388</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1value__compare_html_a1d76a7c31700f21c3a7ad1b06ef42ab8"><div class="ttname"><a href="classtlx_1_1BTree_1_1value__compare.html#a1d76a7c31700f21c3a7ad1b06ef42ab8">tlx::BTree::value_compare::value_compare</a></div><div class="ttdeci">value_compare(key_compare kc)</div><div class="ttdoc">Constructor called from BTree::value_comp() </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01167">btree.hpp:1167</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a33b885434598e4d5ac5f06605e53b678"><div class="ttname"><a href="classtlx_1_1BTree.html#a33b885434598e4d5ac5f06605e53b678">tlx::BTree::Self</a></div><div class="ttdeci">BTree< key_type, value_type, key_of_value, key_compare, traits, allow_duplicates, allocator_type > Self</div><div class="ttdoc">Typedef of our own type. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00168">btree.hpp:168</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a38ffbf220e298d1ee8c79307009cfa00"><div class="ttname"><a href="classtlx_1_1BTree.html#a38ffbf220e298d1ee8c79307009cfa00">tlx::BTree::TLX_BTREE_FRIENDS</a></div><div class="ttdeci">TLX_BTREE_FRIENDS</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00160">btree.hpp:160</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__reverse__iterator_html_aac736176f33ad72afc6ab405b1bf9ecc"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__reverse__iterator.html#aac736176f33ad72afc6ab405b1bf9ecc">tlx::BTree::const_reverse_iterator::reference</a></div><div class="ttdeci">const value_type & reference</div><div class="ttdoc">Reference to the value_type. STL required. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00865">btree.hpp:865</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__iterator_html_a1662eef91eb8e828a6ef9ba7651c9c8e"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__iterator.html#a1662eef91eb8e828a6ef9ba7651c9c8e">tlx::BTree::const_iterator::iterator_category</a></div><div class="ttdeci">std::bidirectional_iterator_tag iterator_category</div><div class="ttdoc">STL-magic iterator category. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00526">btree.hpp:526</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1LeafNode_html_ae028d16479603404a2f2b71bfc0abe82"><div class="ttname"><a href="structtlx_1_1BTree_1_1LeafNode.html#ae028d16479603404a2f2b71bfc0abe82">tlx::BTree::LeafNode::is_full</a></div><div class="ttdeci">bool is_full() const </div><div class="ttdoc">True if the node&#39;s slots are full. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00298">btree.hpp:298</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a04886aa70c34d66738e78bf70c675e66"><div class="ttname"><a href="classtlx_1_1BTree.html#a04886aa70c34d66738e78bf70c675e66">tlx::BTree::rbegin</a></div><div class="ttdeci">const_reverse_iterator rbegin() const </div><div class="ttdoc">Constructs a read-only reverse iterator that points to the first invalid slot in the last leaf of the...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01377">btree.hpp:1377</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a04f69f8f2936ff309627511179c1709b"><div class="ttname"><a href="classtlx_1_1BTree.html#a04f69f8f2936ff309627511179c1709b">tlx::BTree::value_type</a></div><div class="ttdeci">Value value_type</div><div class="ttdoc">Second template parameter: Composition pair of key and data types, or just the key for set containers...</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00136">btree.hpp:136</a></div></div>
<div class="ttc" id="group__tlx__container_html_gae6cc1a14d8ad295c107ee2cd496de718"><div class="ttname"><a href="group__tlx__container.html#gae6cc1a14d8ad295c107ee2cd496de718">tlx::operator<</a></div><div class="ttdeci">static bool operator<(const StringView &a, const std::string &b) noexcept</div><div class="ttdoc">less operator to compare a StringView with a std::string lexicographically </div><div class="ttdef"><b>Definition:</b> <a href="string__view_8hpp_source.html#l00507">string_view.hpp:507</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a4d396f4c2d232e90fabff194a345a283"><div class="ttname"><a href="classtlx_1_1BTree.html#a4d396f4c2d232e90fabff194a345a283">tlx::BTree::key_less</a></div><div class="ttdeci">bool key_less(const key_type &a, const key_type &b) const </div><div class="ttdoc">True if a < b ? "constructed" from key_less_() </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01200">btree.hpp:1200</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_af580a76629eafd1d907fa5e1e18556a2"><div class="ttname"><a href="classtlx_1_1BTree.html#af580a76629eafd1d907fa5e1e18556a2">tlx::BTree::insert_start</a></div><div class="ttdeci">std::pair< iterator, bool > insert_start(const key_type &key, const value_type &value)</div><div class="ttdoc">Start the insertion descent at the current root and handle root splits. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01878">btree.hpp:1878</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__iterator_html_ae6dd5cb1a04fdb444583ffc0b8a29a5b"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__iterator.html#ae6dd5cb1a04fdb444583ffc0b8a29a5b">tlx::BTree::const_iterator::value_type</a></div><div class="ttdeci">BTree::value_type value_type</div><div class="ttdoc">The value type of the btree. Returned by operator*(). </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00517">btree.hpp:517</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a05f41c2452c5416a662e8176af0a97b7"><div class="ttname"><a href="classtlx_1_1BTree.html#a05f41c2452c5416a662e8176af0a97b7">tlx::BTree::merge_inner</a></div><div class="ttdeci">static result_t merge_inner(InnerNode *left, InnerNode *right, InnerNode *parent, unsigned int parentslot)</div><div class="ttdoc">Merge two inner nodes. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l03169">btree.hpp:3169</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__reverse__iterator_html_a70c277634333dad40a76ed7e6afc2ba7"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a70c277634333dad40a76ed7e6afc2ba7">tlx::BTree::const_reverse_iterator::const_reverse_iterator</a></div><div class="ttdeci">const_reverse_iterator(const const_iterator &it)</div><div class="ttdoc">Copy-constructor from a const iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00917">btree.hpp:917</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1reverse__iterator_html_a38ffbf220e298d1ee8c79307009cfa00"><div class="ttname"><a href="classtlx_1_1BTree_1_1reverse__iterator.html#a38ffbf220e298d1ee8c79307009cfa00">tlx::BTree::reverse_iterator::TLX_BTREE_FRIENDS</a></div><div class="ttdeci">TLX_BTREE_FRIENDS</div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00730">btree.hpp:730</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1iterator_html_acfda6b3523d47fd797a150186ab42ef0"><div class="ttname"><a href="classtlx_1_1BTree_1_1iterator.html#acfda6b3523d47fd797a150186ab42ef0">tlx::BTree::iterator::curr_leaf</a></div><div class="ttdeci">BTree::LeafNode * curr_leaf</div><div class="ttdoc">The currently referenced leaf node of the tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00363">btree.hpp:363</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1LeafNode_html_a05e3d86c2442ace4b66c19e28e2a9585"><div class="ttname"><a href="structtlx_1_1BTree_1_1LeafNode.html#a05e3d86c2442ace4b66c19e28e2a9585">tlx::BTree::LeafNode::slotdata</a></div><div class="ttdeci">value_type slotdata[leaf_slotmax]</div><div class="ttdoc">Array of (key, data) pairs. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00284">btree.hpp:284</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1iterator_html_a07a8e1622ecf59baab04b1cfeaa869a5"><div class="ttname"><a href="classtlx_1_1BTree_1_1iterator.html#a07a8e1622ecf59baab04b1cfeaa869a5">tlx::BTree::iterator::iterator</a></div><div class="ttdeci">iterator(const reverse_iterator &it)</div><div class="ttdoc">Copy-constructor from a reverse iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00404">btree.hpp:404</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1iterator_html_ae606c9d192f5f681a19b60b19d8f18d2"><div class="ttname"><a href="classtlx_1_1BTree_1_1iterator.html#ae606c9d192f5f681a19b60b19d8f18d2">tlx::BTree::iterator::curr_slot</a></div><div class="ttdeci">unsigned short curr_slot</div><div class="ttdoc">Current key/data slot referenced. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00366">btree.hpp:366</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1LeafNode_html_ad21aa3c1e3f3defa507cbc89cdd7bd37"><div class="ttname"><a href="structtlx_1_1BTree_1_1LeafNode.html#ad21aa3c1e3f3defa507cbc89cdd7bd37">tlx::BTree::LeafNode::set_slot</a></div><div class="ttdeci">void set_slot(unsigned short slot, const value_type &value)</div><div class="ttdoc">Set the (key,data) pair in slot. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00314">btree.hpp:314</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_a62b4c13faa3ff390aeb52760c88210d6"><div class="ttname"><a href="classtlx_1_1BTree.html#a62b4c13faa3ff390aeb52760c88210d6">tlx::BTree::BTree</a></div><div class="ttdeci">BTree(const BTree &other)</div><div class="ttdoc">Copy constructor. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01779">btree.hpp:1779</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__reverse__iterator_html_a5b1fb481931f4bff8175a8fd49a29772"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a5b1fb481931f4bff8175a8fd49a29772">tlx::BTree::const_reverse_iterator::const_reverse_iterator</a></div><div class="ttdeci">const_reverse_iterator(const typename BTree::LeafNode *l, unsigned short s)</div><div class="ttdoc">Initializing-Constructor of a const reverse iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00906">btree.hpp:906</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1result__t_html_ae1c20bab9719dbdf19bb660a0a4a700d"><div class="ttname"><a href="structtlx_1_1BTree_1_1result__t.html#ae1c20bab9719dbdf19bb660a0a4a700d">tlx::BTree::result_t::has</a></div><div class="ttdeci">bool has(result_flags_t f) const </div><div class="ttdoc">Test if this result object has a given flag set. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l02344">btree.hpp:2344</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1value__compare_html_ae7dd7fc42fbc38520d612a82099fdd96"><div class="ttname"><a href="classtlx_1_1BTree_1_1value__compare.html#ae7dd7fc42fbc38520d612a82099fdd96">tlx::BTree::value_compare::key_comp</a></div><div class="ttdeci">key_compare key_comp</div><div class="ttdoc">Key comparison function from the template parameter. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01164">btree.hpp:1164</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_ad6ed64cad61c5ac8cb5a4dc97ac34baf"><div class="ttname"><a href="classtlx_1_1BTree.html#ad6ed64cad61c5ac8cb5a4dc97ac34baf">tlx::BTree::verify_node</a></div><div class="ttdeci">void verify_node(const node *n, key_type *minkey, key_type *maxkey, tree_stats &vstats) const </div><div class="ttdoc">Recursively descend down the tree and verify each node. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l03559">btree.hpp:3559</a></div></div>
<div class="ttc" id="die_2core_8hpp_html_ae75b813cfb11a89830e7e7e98dec7ac0"><div class="ttname"><a href="die_2core_8hpp.html#ae75b813cfb11a89830e7e7e98dec7ac0">tlx_die_unless</a></div><div class="ttdeci">#define tlx_die_unless(X)</div><div class="ttdoc">Check condition X and die miserably if false. </div><div class="ttdef"><b>Definition:</b> <a href="die_2core_8hpp_source.html#l00065">core.hpp:65</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__reverse__iterator_html_a0cc59491125a67abc87e8bfe6a4022c1"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a0cc59491125a67abc87e8bfe6a4022c1">tlx::BTree::const_reverse_iterator::key_type</a></div><div class="ttdeci">BTree::key_type key_type</div><div class="ttdoc">The key type of the btree. Returned by key(). </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00859">btree.hpp:859</a></div></div>
<div class="ttc" id="structtlx_1_1BTree_1_1node_html_af0bb2987233e128054452dc84553b3a9"><div class="ttname"><a href="structtlx_1_1BTree_1_1node.html#af0bb2987233e128054452dc84553b3a9">tlx::BTree::node::is_leafnode</a></div><div class="ttdeci">bool is_leafnode() const </div><div class="ttdoc">True if this is a leaf node. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00228">btree.hpp:228</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_html_aed457b19fc617a12201f09de1d885368"><div class="ttname"><a href="classtlx_1_1BTree.html#aed457b19fc617a12201f09de1d885368">tlx::BTree::stats_</a></div><div class="ttdeci">tree_stats stats_</div><div class="ttdoc">Other small statistics about the B+ tree. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l01086">btree.hpp:1086</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1reverse__iterator_html"><div class="ttname"><a href="classtlx_1_1BTree_1_1reverse__iterator.html">tlx::BTree::reverse_iterator</a></div><div class="ttdoc">STL-like mutable reverse iterator object for B+ tree items. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00680">btree.hpp:680</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__reverse__iterator_html_a1662eef91eb8e828a6ef9ba7651c9c8e"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a1662eef91eb8e828a6ef9ba7651c9c8e">tlx::BTree::const_reverse_iterator::iterator_category</a></div><div class="ttdeci">std::bidirectional_iterator_tag iterator_category</div><div class="ttdoc">STL-magic iterator category. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00871">btree.hpp:871</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__iterator_html_ac10a9353cd631d69889ad6aaaf83c0a8"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__iterator.html#ac10a9353cd631d69889ad6aaaf83c0a8">tlx::BTree::const_iterator::const_iterator</a></div><div class="ttdeci">const_iterator(const const_reverse_iterator &it)</div><div class="ttdoc">Copy-constructor from a const reverse iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00576">btree.hpp:576</a></div></div>
<div class="ttc" id="classtlx_1_1BTree_1_1const__reverse__iterator_html_a550e11a4821e11e3f45f99b5b9780152"><div class="ttname"><a href="classtlx_1_1BTree_1_1const__reverse__iterator.html#a550e11a4821e11e3f45f99b5b9780152">tlx::BTree::const_reverse_iterator::const_reverse_iterator</a></div><div class="ttdeci">const_reverse_iterator(const reverse_iterator &it)</div><div class="ttdoc">Copy-constructor from a mutable reverse iterator. </div><div class="ttdef"><b>Definition:</b> <a href="btree_8hpp_source.html#l00922">btree.hpp:922</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_8b4d4685f7eaf29e53aad23645930303.html">tlx</a></li><li class="navelem"><a class="el" href="dir_dab8345dcd2ad8c9400f2b10c593e3dd.html">container</a></li><li class="navelem"><a class="el" href="btree_8hpp.html">btree.hpp</a></li>
<li class="footer">Generated on Sat Oct 2 2021 20:29:00 for tlx by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
</ul>
</div>
</body>
</html>