Dynalib Utils
DynaBTreeImpl.h
Go to the documentation of this file.
1 #ifndef DYNABTREEIMPL_H
2 #define DYNABTREEIMPL_H
3 
4 #include "DynaBTree.h"
5 #include <stdio.h>
6 #include <string.h>
7 
8 #define MAKE_BTREETYPE_INSTANCE(K,V,T) \
9  template struct DynaTreeInnerElem<K>; \
10  template struct DynaTreeLeafElem<K,V>; \
11  template class DynaBTree<K,V>; \
12  template class DynaBTreeNode<K>; \
13  template class DynaBTreeLeafNode<K,V>; \
14  template class DynaBTreeInnerNode<K>; \
15  typedef DynaTreeInnerElem<K> T##TreeInnerElem; \
16  typedef DynaTreeLeafElem<K,V> T##TreeLeafElem; \
17  typedef DynaTreeInnerElem<K>::Data T##TreeInnerData; \
18  typedef DynaTreeLeafElem<K,V>::Data T##TreeLeafData; \
19  typedef DynaBTree<K,V> T##BTree; \
20  typedef DynaBTreeNode<K> T##BTreeNode; \
21  typedef DynaBTreeLeafNode<K,V> T##BTreeLeafNode; \
22  typedef DynaBTreeInnerNode<K> T##BTreeInnerNode
23 
24 //----------------------------------------------------------------------------------------------------------------------------------------------
25 
26 // template <typename K, typename V> DynaTreeLeafElem<K,V>::DynaTreeLeafElem::Data("", 0) {
27 // }
28 
29 template <typename K, typename V> int DynaTreeLeafElem<K,V>::compareTo(DynaTreeLeafElem<K,V>* other, MatchType match) {
30  int result;
31  if (match == MatchType::PARTIAL_KEY) {
32  auto len = strlen(search.key);
33  result = strncmp(search.key, other->data->key, len);
34  }
35  else {
36  result = strncmp(search.key, other->data->key, keySize());
37  if (match == MatchType::WITH_VALUE && result == 0) {
38  auto v1 = search.value;
39  auto v2 = other->data->value;
40  result = v1 < v2 ? -1 : v1 > v2 ? 1 : 0;
41  }
42  }
43  return result;
44 }
45 
46 template <typename K, typename V> void DynaTreeLeafElem<K,V>::setKeyInSearch(K key) {
47  std::strncpy(search.key, key, keySize());
48 }
49 template <typename K, typename V> void DynaTreeLeafElem<K,V>::setValueInSearch(V value) {
50  search.value = value;
51 }
52 template <typename K, typename V> void DynaTreeLeafElem<K,V>::setKeyInData(K key) {
53  std::strncpy(data->key, key, keySize());
54 }
55 template <typename K, typename V> void DynaTreeLeafElem<K,V>::setValueInData(V value) {
56  data->value = value;
57 }
58 template <typename K, typename V> void DynaTreeLeafElem<K,V>::getKeyFromData(K& key) {
59  std::strncpy(key, data->key, keySize());
60 }
61 template <typename K, typename V> void DynaTreeLeafElem<K,V>::getValueFromData(V& value) {
62  value = data->value;
63 }
64 
65 
66 template <typename K> int DynaTreeInnerElem<K>::compareTo(DynaTreeInnerElem<K>* other, MatchType match) {
67  auto len = match == MatchType::PARTIAL_KEY ? strlen(search.key) : keySize();
68  auto result = std::strncmp(search.key, other->data->key, len);
69  return result;
70 }
71 
72 template <typename K> void DynaTreeInnerElem<K>::setKeyInSearch(K key) {
73  std::strncpy(search.key, key, keySize());
74 }
75 
76 template <typename K> void DynaTreeInnerElem<K>::setKeyInData(K key) {
77  std::strncpy(data->key, key, keySize());
78 }
79 
80 template <typename K> void DynaTreeInnerElem<K>::getKeyFromData(K& key) {
81  std::strncpy(key, data->key, keySize());
82 }
83 
84 //----------------------------------------------------------------------------------------------------------------------------------------------
85 
86 template <typename K, typename V> DynaBTreeLeafNode<K,V>* DynaBTree<K,V>::_findLeafNodeForKey(K& key) {
87  auto* node = _root;
88 
89  while (node->getNodeType() == TreeNodeType::INNER) {
90  int result = node->search(key);
91  node = ((DynaBTreeInnerNode<K>*)node)->getChild(DynaBTree::insertAt(result));
92  }
93  return (DynaBTreeLeafNode<K,V>*)node;
94 }
95 
96 template <typename K, typename V> DynaBTree<K,V>::DynaBTree(int leafOrder, int innerOrder) : _leafOrder(leafOrder), _innerOrder(innerOrder) {
97  _root = new DynaBTreeLeafNode<K,V>(leafOrder, innerOrder);
98 }
99 
100 template <typename K, typename V> DynaBTree<K,V>::~DynaBTree() {
101  delete _root;
102 }
103 
104 template <typename K, typename V> bool DynaBTree<K,V>::wasFound( int returnValue ) {
105  return returnValue >= 0;
106 }
107 
108 template <typename K, typename V> int DynaBTree<K,V>::insertAt( int returnValue ) {
109  return returnValue >= 0 ? returnValue : -(returnValue + 1);
110 }
111 
112 template <typename K, typename V> void DynaBTree<K,V>::insert(K& key, V& value) {
113  auto* leaf = _findLeafNodeForKey(key);
115  elem.setKeyInSearch(key);
116  elem.setValueInSearch(value);
117  leaf->insertElem(elem);
118 
119  if (leaf->isOverflow()) {
120  auto* n = leaf->handleOverflow();
121  if (n != nullptr)
122  _root = n;
123  }
124 }
125 
126 template <typename K, typename V> int DynaBTree<K,V>::search(K& key, V* value, MatchType match) {
127  auto* leaf = _findLeafNodeForKey(key);
128  DynaTreeLeafElem<K,V> tempElem;
129  tempElem.setKeyInSearch(key);
130  if (value != nullptr) {
131  tempElem.setValueInSearch(*value);
132  }
133  return leaf->search(tempElem, match);
134 }
135 
136 template <typename K, typename V> void DynaBTree<K,V>::deleteEntry(K& key, V* value) {
137  auto* leaf = _findLeafNodeForKey(key);
138  DynaTreeLeafElem<K,V> tempElem;
139  tempElem.setKeyInSearch(key);
140  if (value != nullptr) {
141  tempElem.setValueInSearch(*value);
142  }
143  if (leaf->deleteElem(tempElem) && leaf->isUnderflow()) {
144  auto* n = leaf->handleUnderflow();
145  if (n != nullptr)
146  _root = n;
147  }
148 }
149 
150 //----------------------------------------------------------------------------------------------------------------------------------------------
151 
152 
153 template <typename K> DynaBTreeNode<K>::DynaBTreeNode(TreeNodeType nodeType, int maxKeys, int leafOrder, int innerOrder) :
154  _nodeType(nodeType), _leafOrder(leafOrder), _innerOrder(innerOrder) {
155  _buffer = new DynaBuffer(maxKeys);
156  _parent = nullptr;
157  _leftSibling = nullptr;
158  _rightSibling = nullptr;
159 }
160 
161 template <typename K> DynaBTreeNode<K>::~DynaBTreeNode() {
162  delete _buffer;
163 }
164 
165 template <typename K> DynaBTreeNode<K>::DynaBTreeNode(const DynaBTreeNode<K>& other) {
166  _nodeType = other._nodeType;
167  _leafOrder = other._leafOrder;
168  _innerOrder = other._innerOrder;
169  _buffer = other._buffer != nullptr ? other._buffer->copy() : nullptr;
170  _parent = other._parent;
171  _leftSibling = other._leftSibling;
173 }
174 
175 template <typename K> DynaBTreeNode<K>* DynaBTreeNode<K>::copy() {
176  throw MethodNotImplemented();
177 }
178 
179 template <typename K> DynaBuffer* DynaBTreeNode<K>::getBuffer() {
180  return _buffer;
181 }
182 
184  return _parent;
185 }
186 
187 template <typename K> void DynaBTreeNode<K>::setParent(DynaBTreeNode<K>* parent) {
188  _parent = parent;
189 }
190 
192  return _nodeType;
193 }
194 
195 template <typename K> int DynaBTreeNode<K>::getKeyCount() {
196  return _buffer->getElemCount();
197 }
198 
199 template <typename K> bool DynaBTreeNode<K>::getKeyFromData(uint index, K& key) {
200  throw MethodNotImplemented();
201 }
202 
203 template <typename K> void DynaBTreeNode<K>::setKeyToData(uint index, K& key) {
204  throw MethodNotImplemented();
205 }
206 
207 template <typename K> bool DynaBTreeNode<K>::isOverflow() {
208  return _buffer->isFull();
209 }
210 
212  int midIndex = getKeyCount() / 2;
213  K upKey;
214  getKeyFromData(midIndex, upKey);
215  auto* newRNode = split();
216  if (getParent() == nullptr) {
218  }
219  newRNode->setParent(getParent());
220 
221  // maintain links of sibling nodes
222  newRNode->setLeftSibling(this);
223  newRNode->setRightSibling(_rightSibling);
224  if (getRightSibling() != nullptr)
225  getRightSibling()->setLeftSibling(newRNode);
226  setRightSibling(newRNode);
227 
228  // push up a key to parent internal node
229  return getParent()->pullUpKey(upKey, this, newRNode);
230 }
231 
232 template <typename K> bool DynaBTreeNode<K>::isUnderflow() {
233  return getKeyCount() < (_buffer->getElemCapacity() / 2);
234 }
235 
236 template <typename K> bool DynaBTreeNode<K>::canGiveKey() {
237  return getKeyCount() > (_buffer->getElemCapacity() / 2);
238 }
239 
241  if (_leftSibling != nullptr && _leftSibling->getParent() == getParent())
242  return _leftSibling;
243  return nullptr;
244 }
245 
246 template <typename K> void DynaBTreeNode<K>::setLeftSibling(DynaBTreeNode<K>* sibling) {
247  _leftSibling = sibling;
248 }
249 
251  if (_rightSibling != nullptr && _rightSibling->getParent() == getParent())
252  return _rightSibling;
253  return nullptr;
254 }
255 
256 template <typename K> void DynaBTreeNode<K>::setRightSibling(DynaBTreeNode<K>* sibling) {
257  _rightSibling = sibling;
258 }
259 
261  if (getParent() == nullptr)
262  return nullptr;
263 
264  // try to take a key from sibling
265  auto* leftSibling = getLeftSibling();
266  if (leftSibling != nullptr && leftSibling->canGiveKey()) {
267  getParent()->transferChildren(this, leftSibling, leftSibling->getKeyCount() - 1);
268  return nullptr;
269  }
270 
271  auto* rightSibling = getRightSibling();
272  if (rightSibling != nullptr && rightSibling->canGiveKey()) {
273  getParent()->transferChildren(this, rightSibling, 0);
274  return nullptr;
275  }
276 
277  // Can not take a key from any sibling, so do join with sibling
278  if (leftSibling != nullptr) {
279  return getParent()->joinChildren(leftSibling, this);
280  }
281  else {
282  return getParent()->joinChildren(this, rightSibling);
283  }
284 }
285 
286 template <typename K> int DynaBTreeNode<K>::search(K& key, MatchType match) {
287  throw MethodNotImplemented();
288 }
289 
290 template <typename K> DynaBTreeNode<K>* DynaBTreeNode<K>::split() {
291  throw MethodNotImplemented();
292 }
293 
294 template <typename K> DynaBTreeNode<K>* DynaBTreeNode<K>::pullUpKey(K& key, DynaBTreeNode<K>* leftChild, DynaBTreeNode<K>* rightNode) {
295  throw MethodNotImplemented();
296 }
297 
298 template <typename K> void DynaBTreeNode<K>::transferChildren(DynaBTreeNode<K>* fromNode, DynaBTreeNode<K>* toNode, uint toIndex) {
299  throw MethodNotImplemented();
300 }
301 
302 template <typename K> DynaBTreeNode<K>* DynaBTreeNode<K>::joinChildren(DynaBTreeNode<K>* leftChild, DynaBTreeNode<K>* rightChild) {
303  throw MethodNotImplemented();
304 }
305 
306 template <typename K> void DynaBTreeNode<K>::joinWithSibling(K& sinkElem, DynaBTreeNode<K>* rightSibling) {
307  throw MethodNotImplemented();
308 }
309 
310 template <typename K> void DynaBTreeNode<K>::transferFromSibling(K& sinkElem, K& upKey, DynaBTreeNode<K>* sibling, uint toIndex) {
311  throw MethodNotImplemented();
312 }
313 
314 
315 //----------------------------------------------------------------------------------------------------------------------------------------------
316 
317 template <typename K, typename V> void DynaBTreeLeafNode<K,V>::_insertAt(uint index, DynaTreeLeafElem<K,V>& elem) {
318  this->getBuffer()->insertElem(index, *((uint8_t*)&elem.search));
319 }
320 
321 template <typename K, typename V> void DynaBTreeLeafNode<K,V>::_deleteAt(uint index) {
322  this->getBuffer()->deleteElem(index);
323 }
324 
325 template <typename K, typename V> DynaBTreeLeafNode<K,V>::DynaBTreeLeafNode(int leafOrder, int innerOrder) :
326  DynaBTreeNode<K>(TreeNodeType::LEAF, leafOrder + 1, leafOrder, innerOrder) {
327 }
328 
329 template <typename K, typename V> DynaBTreeLeafNode<K,V>::~DynaBTreeLeafNode() {
330 }
331 
332 template <typename K, typename V> DynaBTreeLeafNode<K,V>::DynaBTreeLeafNode(const DynaBTreeLeafNode<K,V>& other) : DynaBTreeNode<K>(other) {
333 }
334 
335 template <typename K, typename V> DynaBTreeNode<K>* DynaBTreeLeafNode<K,V>::copy() {
336  return new DynaBTreeLeafNode<K,V>(*this);
337 }
338 
339 template <typename K, typename V> void DynaBTreeLeafNode<K,V>::setElemDataPos(uint index, DynaTreeLeafElem<K,V>& elem) {
340  elem.data = (typename DynaTreeLeafElem<K,V>::Data*)(this->_buffer->getInternalTypedArrayAtPos(this->_buffer->getElemPos(index)));
341 }
342 
343 template <typename K, typename V> bool DynaBTreeLeafNode<K,V>::getKeyFromData(uint index, K& key) {
344  DynaTreeLeafElem<K,V> tempElem;
345  setElemDataPos(index, tempElem);
346  tempElem.getKeyFromData(key);
347  return true;
348 }
349 
350 template <typename K, typename V> void DynaBTreeLeafNode<K,V>::setKeyToData(uint index, K& key) {
351  DynaTreeLeafElem<K,V> tempElem;
352  setElemDataPos(index, tempElem);
353  tempElem.setKeyInData(key);
354 }
355 
356 
357 template <typename K, typename V> DynaTreeLeafElem<K,V>* DynaBTreeLeafNode<K,V>::getElemIntoSearch(uint index, DynaTreeLeafElem<K,V>& elem) {
358  if (this->_buffer->getElem(index, *((uint8_t*)&elem.search))) {
359  return &elem;
360  }
361  return nullptr;
362 }
363 
364 template <typename K, typename V> void DynaBTreeLeafNode<K,V>::setElemFromSearch(uint index, DynaTreeLeafElem<K,V>& elem) {
365  this->_buffer->setElem(index, *((uint8_t*)&elem.search));
366 }
367 
368 template <typename K, typename V> void DynaBTreeLeafNode<K,V>::insertElem(DynaTreeLeafElem<K,V>& elem) {
369  auto index = search(elem);
370  if (!DynaBTree<K,V>::wasFound(index)) {
371  index = DynaBTree<K,V>::insertAt(index);
372  if (index < this->getKeyCount()) {
373  _insertAt(index, elem);
374  }
375  }
376 }
377 
378 template <typename K, typename V> bool DynaBTreeLeafNode<K,V>::deleteElem(DynaTreeLeafElem<K,V>& elem) {
379  auto index = search(elem);
380  if (DynaBTree<K,V>::wasFound(index)) {
381  this->_buffer->deleteElems(index, index);
382  return true;
383  }
384  return false;
385 }
386 
387 
388 template <typename K, typename V> int DynaBTreeLeafNode<K,V>::search(K& key, MatchType match) {
389  int low = 0;
390  int high = this->getBuffer()->getElemCount() - 1;
391  DynaTreeLeafElem<K,V> searchElem;
392  searchElem.setKeyInSearch(key);
393  DynaTreeLeafElem<K,V> tempElem;
394 
395  while ( low <= high ) {
396  uint middle = ( low + high ) >> 1;
397  setElemDataPos(middle, tempElem);
398  int result = searchElem.compareTo(&tempElem, match);
399  if ( result < 0 ) {
400  high = middle - 1;
401  }
402  else if ( result > 0 ) {
403  low = middle + 1;
404  }
405  else {
406  return middle;
407  }
408  }
409  return -( low + 1 );
410 }
411 
412 template <typename K, typename V> int DynaBTreeLeafNode<K,V>::search(DynaTreeLeafElem<K,V>& elem, MatchType match) {
413  int low = 0;
414  int high = this->getBuffer()->getElemCount() - 1;
415  DynaTreeLeafElem<K,V> tempElem;
416 
417  while ( low <= high ) {
418  uint middle = ( low + high ) >> 1;
419  setElemDataPos(middle, tempElem);
420  int result = elem.compareTo(&tempElem, match);
421  if ( result < 0 ) {
422  high = middle - 1;
423  }
424  else if ( result > 0 ) {
425  low = middle + 1;
426  }
427  else {
428  return middle;
429  }
430  }
431  return -( low + 1 );
432 }
433 
434 // template <typename K, typename V> int DynaBTreeLeafNode<K,V>::search(K& elem) {
435 // return 0;
436 // }
437 
438 template <typename K, typename V> DynaBTreeNode<K>* DynaBTreeLeafNode<K,V>::split() {
439  int count = this->getKeyCount();
440  int midIndex = count / 2;
441  auto* newRNode = new DynaBTreeLeafNode<K,V>(this->_leafOrder, this->_innerOrder);
442  this->_buffer->moveElems(midIndex, count - 1, newRNode->getBuffer(), 0);
443  return newRNode;
444 }
445 
446 template <typename K, typename V> DynaBTreeNode<K>* DynaBTreeLeafNode<K,V>::pullUpKey(K& elem, DynaBTreeNode<K>* leftChild, DynaBTreeNode<K>* rightNode) {
447  throw MethodNotSupported();
448 }
449 
450 template <typename K, typename V> void DynaBTreeLeafNode<K,V>::transferChildren(DynaBTreeNode<K>* fromNode, DynaBTreeNode<K>* toNode, uint toIndex) {
451  throw MethodNotSupported();
452 }
453 
454 template <typename K, typename V> DynaBTreeNode<K>* DynaBTreeLeafNode<K,V>::joinChildren(DynaBTreeNode<K>* leftChild, DynaBTreeNode<K>* rightChild) {
455  throw MethodNotSupported();
456 }
457 
458 template <typename K, typename V> void DynaBTreeLeafNode<K,V>::joinWithSibling(K& sinkKey, DynaBTreeNode<K>* rightSibling) {
459  auto* siblingLeaf = rightSibling;
460  int thisCount = this->getKeyCount();
461  int sibCount = siblingLeaf->getKeyCount();
462  siblingLeaf->getBuffer()->moveElems(0, sibCount - 1, this->getBuffer(), thisCount);
463 }
464 
465 template <typename K, typename V> void DynaBTreeLeafNode<K,V>::transferFromSibling(K& sinkKey, K& upKey, DynaBTreeNode<K>* sibling, uint fromIndex) {
466  auto* siblingNode = (DynaBTreeLeafNode<K,V>*)sibling;
467 
468  DynaTreeLeafElem<K,V> searchElem;
469  siblingNode->getElemIntoSearch(fromIndex, searchElem);
470  insertElem(searchElem);
471  siblingNode->_deleteAt(fromIndex);
472 
473  if (fromIndex == 0) {
474  sibling->getKeyFromData(0, upKey);
475  }
476  else {
477  this->getKeyFromData(0, upKey);
478  }
479 }
480 
481 //----------------------------------------------------------------------------------------------------------------------------------------------
482 
483 template <typename K> void DynaBTreeInnerNode<K>::_insertAt(uint index, K& elem, DynaBTreeNode<K>* leftChild, DynaBTreeNode<K>* rightChild) {
484 
485 }
486 
487 template <typename K> void DynaBTreeInnerNode<K>::_deleteAt(uint index) {
488 
489 }
490 
491 template <typename K> DynaBTreeInnerNode<K>::DynaBTreeInnerNode(int order) :
492  DynaBTreeNode<K>(TreeNodeType::INNER, order + 1, 0, order) {
493 }
494 
496 }
497 
498 template <typename K> DynaBTreeInnerNode<K>::DynaBTreeInnerNode(const DynaBTreeInnerNode<K>& other) : DynaBTreeNode<K>(other) {
499 }
500 
502  return new DynaBTreeInnerNode<K>(*this);
503 }
504 
505 template <typename K> void DynaBTreeInnerNode<K>::setElemDataPos(uint index, DynaTreeInnerElem<K>& elem) {
506  elem.data = (typename DynaTreeInnerElem<K>::Data*)(this->_buffer->getInternalTypedArrayAtPos(this->_buffer->getElemPos(index)));
507 }
508 
509 template <typename K> bool DynaBTreeInnerNode<K>::getKeyFromData(uint index, K& key) {
510  DynaTreeInnerElem<K> tempElem;
511  setElemDataPos(index, tempElem);
512  tempElem.getKeyFromData(key);
513  return true;
514 }
515 
516 template <typename K> void DynaBTreeInnerNode<K>::setKeyToData(uint index, K& key) {
517  DynaTreeInnerElem<K> tempElem;
518  setElemDataPos(index, tempElem);
519  tempElem.setKeyInData(key);
520 }
521 
522 template <typename K> DynaBTreeNode<K>* DynaBTreeInnerNode<K>::getChild(uint index) {
523  // return (DynaBTreeNode<K>*)(*_children)[index];
524  return nullptr;
525 }
526 
527 template <typename K> void DynaBTreeInnerNode<K>::setChild(uint index, DynaBTreeNode<K>* child) {
528  // (*_children)[index] = child;
529  // if (child != nullptr) {
530  // child->setParent(this);
531  // }
532 }
533 
534 template <typename K> int DynaBTreeInnerNode<K>::search(K& key, MatchType match) {
535  int low = 0;
536  int high = this->_buffer->getElemCount() - 1;
537  DynaTreeInnerElem<K> searchElem;
538  searchElem.setKeyInSearch(key);
539  DynaTreeInnerElem<K> tempElem;
540 
541  while ( low <= high ) {
542  uint middle = ( low + high ) >> 1;
543  setElemDataPos(middle, tempElem);
544  int result = searchElem.compareTo(&tempElem, match);
545  if ( result < 0 ) {
546  high = middle - 1;
547  }
548  else if ( result > 0 ) {
549  low = middle + 1;
550  }
551  else {
552  return middle;
553  }
554  }
555  return -( low + 1 );
556 }
557 
559  return nullptr;
560 }
561 
562 template <typename K> DynaBTreeNode<K>* DynaBTreeInnerNode<K>::pullUpKey(K& elem, DynaBTreeNode<K>* leftChild, DynaBTreeNode<K>* rightNode) {
563  return nullptr;
564 }
565 
566 template <typename K> void DynaBTreeInnerNode<K>::transferChildren(DynaBTreeNode<K>* fromNode, DynaBTreeNode<K>* toNode, uint toIndex) {
567 
568 }
569 
571  return nullptr;
572 }
573 
574 template <typename K> void DynaBTreeInnerNode<K>::joinWithSibling(K& sinkElem, DynaBTreeNode<K>* rightSibling) {
575 
576 }
577 
578 template <typename K> void DynaBTreeInnerNode<K>::transferFromSibling(K& sinkKey, K& upKey, DynaBTreeNode<K>* sibling, uint toIndex) {
579 }
580 
581 
582 #endif
bool isFull()
Definition: DynaBuffer.cpp:334
virtual bool isUnderflow()
Definition: DynaBTreeImpl.h:232
DynaBTreeNode< K > * getChild(uint index)
Definition: DynaBTreeImpl.h:522
virtual DynaBTreeNode< K > * handleOverflow()
Definition: DynaBTreeImpl.h:211
Base Class for B-Tree nodes.
Definition: DynaBTree.h:25
DynaBTreeNode< K > * split() override
Definition: DynaBTreeImpl.h:438
void setKeyToData(uint index, K &key) override
Definition: DynaBTreeImpl.h:516
virtual void setValueInSearch(V value)
Definition: DynaBTreeImpl.h:49
Definition: Exception.h:23
B-Tree Leaf Node.
Definition: DynaBTree.h:26
MatchType
Definition: DynaBTree.h:33
DynaBTreeNode< K > * pullUpKey(K &key, DynaBTreeNode< K > *leftChild, DynaBTreeNode< K > *rightNode) override
Definition: DynaBTreeImpl.h:446
virtual int compareTo(DynaTreeInnerElem< K > *other, MatchType match)
Definition: DynaBTreeImpl.h:66
virtual DynaBTreeNode< K > * split()
Definition: DynaBTreeImpl.h:290
bool insertElem(int index, uint8_t &elemBuf)
Definition: DynaBuffer.cpp:189
virtual ~DynaBTreeInnerNode()
Definition: DynaBTreeImpl.h:495
static bool wasFound(int returnValue)
Definition: DynaBTreeImpl.h:104
Data * data
Definition: DynaBTree.h:42
bool getElem(int index, uint8_t &elemBuf)
Definition: DynaBuffer.cpp:154
virtual void joinWithSibling(K &sinkKey, DynaBTreeNode< K > *rightSibling)
Definition: DynaBTreeImpl.h:306
int search(K &key, MatchType match=MatchType::FULL_KEY) override
Definition: DynaBTreeImpl.h:534
bool getKeyFromData(uint index, K &key) override
Definition: DynaBTreeImpl.h:509
GeneratorWrapper< T > value(T &&value)
Definition: catch.hpp:4005
void setKeyToData(uint index, K &key) override
Definition: DynaBTreeImpl.h:350
virtual DynaBTreeNode< K > * joinChildren(DynaBTreeNode< K > *leftChild, DynaBTreeNode< K > *rightChild)
Definition: DynaBTreeImpl.h:302
void transferFromSibling(K &sinkKey, K &upKey, DynaBTreeNode< K > *sibling, uint fromIndex) override
Definition: DynaBTreeImpl.h:465
DynaBTreeInnerNode(int order)
Definition: DynaBTreeImpl.h:491
Definition: DynaBTree.h:37
DynaBTreeNode< K > * joinChildren(DynaBTreeNode< K > *leftChild, DynaBTreeNode< K > *rightChild) override
Definition: DynaBTreeImpl.h:570
DynaBuffer * getBuffer()
Definition: DynaBTreeImpl.h:179
bool moveElems(int frIndex, int toIndex, int destIndex)
Definition: DynaBuffer.cpp:272
uint8_t * getInternalTypedArrayAtPos(ulong pos)
Definition: DynaBuffer.h:41
DynaBTreeNode(TreeNodeType nodeType, int maxKeys, int leafOrder, int innerOrder)
Definition: DynaBTreeImpl.h:153
DynaBTreeNode< K > * _rightSibling
Definition: DynaBTree.h:117
DynaBTreeNode< K > * getLeftSibling()
Definition: DynaBTreeImpl.h:240
TreeNodeType getNodeType()
Definition: DynaBTreeImpl.h:191
virtual void setValueInData(V value)
Definition: DynaBTreeImpl.h:55
B-Tree Inner Node.
Definition: DynaBTree.h:209
virtual int search(K &key, MatchType match=MatchType::FULL_KEY)
Definition: DynaBTreeImpl.h:286
virtual void setKeyInData(K key)
Definition: DynaBTreeImpl.h:52
void setChild(uint index, DynaBTreeNode< K > *child)
Definition: DynaBTreeImpl.h:527
Definition: DynaBTree.h:54
Definition: DynaBTree.h:35
void joinWithSibling(K &sinkKey, DynaBTreeNode< K > *rightSibling) override
Definition: DynaBTreeImpl.h:458
void deleteEntry(K &key, V *value)
Definition: DynaBTreeImpl.h:136
DynaBTreeNode< K > * handleUnderflow()
Definition: DynaBTreeImpl.h:260
DynaBuffer * copy() override
Definition: DynaBuffer.cpp:46
Definition: DynaBTree.h:56
virtual bool getKeyFromData(uint index, K &key)
Definition: DynaBTreeImpl.h:199
DynaBTreeNode< K > * _leftSibling
Definition: DynaBTree.h:116
TreeNodeType
Definition: DynaBTree.h:99
DynaBTreeNode< K > * getParent()
Definition: DynaBTreeImpl.h:183
bool getKeyFromData(uint index, K &key) override
Definition: DynaBTreeImpl.h:343
void setElemFromSearch(uint index, DynaTreeLeafElem< K, V > &elem)
Definition: DynaBTreeImpl.h:364
DynaTreeLeafElem< K, V > * getElemIntoSearch(uint index, DynaTreeLeafElem< K, V > &elem)
Definition: DynaBTreeImpl.h:357
virtual void getKeyFromData(K &key)
Definition: DynaBTreeImpl.h:58
DynaBTreeNode< K > * _parent
Definition: DynaBTree.h:115
virtual void setKeyInSearch(K key)
Definition: DynaBTreeImpl.h:72
virtual void getValueFromData(V &value)
Definition: DynaBTreeImpl.h:61
static int insertAt(int returnValue)
Definition: DynaBTreeImpl.h:108
DynaBTreeNode< K > * joinChildren(DynaBTreeNode< K > *leftChild, DynaBTreeNode< K > *rightChild) override
Definition: DynaBTreeImpl.h:454
void insert(K &key, V &value)
Definition: DynaBTreeImpl.h:112
DynaBTreeNode< K > * copy() override
Definition: DynaBTreeImpl.h:175
void setParent(DynaBTreeNode< K > *parent)
Definition: DynaBTreeImpl.h:187
DynaBTreeNode< K > * pullUpKey(K &key, DynaBTreeNode< K > *leftChild, DynaBTreeNode< K > *rightNode) override
Definition: DynaBTreeImpl.h:562
void setElemDataPos(uint index, DynaTreeLeafElem< K, V > &elem)
Definition: DynaBTreeImpl.h:339
virtual void transferFromSibling(K &sinkKey, K &upKey, DynaBTreeNode< K > *sibling, uint fromIndex)
Definition: DynaBTreeImpl.h:310
void transferFromSibling(K &sinkKey, K &upKey, DynaBTreeNode< K > *sibling, uint fromIndex) override
Definition: DynaBTreeImpl.h:578
DynaBTreeNode< K > * copy() override
Definition: DynaBTreeImpl.h:501
bool deleteElem(int index)
Definition: DynaBuffer.cpp:241
uint getElemCount()
Definition: DynaBuffer.cpp:126
void insertElem(DynaTreeLeafElem< K, V > &elem)
Definition: DynaBTreeImpl.h:368
virtual void setKeyToData(uint index, K &key)
Definition: DynaBTreeImpl.h:203
DynaBTreeNode< K > * split() override
Definition: DynaBTreeImpl.h:558
bool deleteElems(int frIndex, int toIndex)
Definition: DynaBuffer.cpp:245
DynaBTreeLeafNode(int leafOrder, int innerOrder)
Definition: DynaBTreeImpl.h:325
DynaBTreeNode< K > * getRightSibling()
Definition: DynaBTreeImpl.h:250
virtual void setKeyInData(K key)
Definition: DynaBTreeImpl.h:76
Definition: Exception.h:29
virtual void transferChildren(DynaBTreeNode< K > *fromNode, DynaBTreeNode< K > *toNode, uint toIndex)
Definition: DynaBTreeImpl.h:298
B-Tree main class.
Definition: DynaBTree.h:78
struct DynaTreeLeafElem::Data search
virtual ~DynaBTreeLeafNode()
Definition: DynaBTreeImpl.h:329
virtual int compareTo(DynaTreeLeafElem< K, V > *other, MatchType match)
Definition: DynaBTreeImpl.h:29
virtual bool canGiveKey()
Definition: DynaBTreeImpl.h:236
DynaBuffer * _buffer
Definition: DynaBTree.h:111
int getKeyCount()
Definition: DynaBTreeImpl.h:195
void setRightSibling(DynaBTreeNode< K > *sibling)
Definition: DynaBTreeImpl.h:256
int search(K &key, V *value, MatchType match=MatchType::FULL_KEY)
Definition: DynaBTreeImpl.h:126
TreeNodeType _nodeType
Definition: DynaBTree.h:108
void transferChildren(DynaBTreeNode< K > *fromNode, DynaBTreeNode< K > *toNode, uint toIndex) override
Definition: DynaBTreeImpl.h:566
DynaBTree(int leafOrder, int innerOrder)
Definition: DynaBTreeImpl.h:96
virtual ~DynaBTree()
Definition: DynaBTreeImpl.h:100
virtual void getKeyFromData(K &key)
Definition: DynaBTreeImpl.h:80
virtual DynaBTreeNode< K > * pullUpKey(K &key, DynaBTreeNode< K > *leftChild, DynaBTreeNode< K > *rightNode)
Definition: DynaBTreeImpl.h:294
DynaBTreeNode< K > * copy() override
Definition: DynaBTreeImpl.h:335
void setElemDataPos(uint index, DynaTreeInnerElem< K > &elem)
Definition: DynaBTreeImpl.h:505
uint getElemCapacity()
Definition: DynaBuffer.cpp:122
int _leafOrder
Definition: DynaBTree.h:109
virtual ~DynaBTreeNode()
Definition: DynaBTreeImpl.h:161
bool setElem(int index, uint8_t &elemBuf)
Definition: DynaBuffer.cpp:166
int search(K &key, MatchType match=MatchType::FULL_KEY) override
Definition: DynaBTreeImpl.h:388
void setLeftSibling(DynaBTreeNode< K > *sibling)
Definition: DynaBTreeImpl.h:246
void joinWithSibling(K &sinkKey, DynaBTreeNode< K > *rightSibling) override
Definition: DynaBTreeImpl.h:574
Data * data
Definition: DynaBTree.h:61
virtual void setKeyInSearch(K key)
Definition: DynaBTreeImpl.h:46
Definition: DynaBuffer.h:20
void transferChildren(DynaBTreeNode< K > *fromNode, DynaBTreeNode< K > *toNode, uint toIndex) override
Definition: DynaBTreeImpl.h:450
int _innerOrder
Definition: DynaBTree.h:110
virtual bool isOverflow()
Definition: DynaBTreeImpl.h:207
bool deleteElem(DynaTreeLeafElem< K, V > &elem)
Definition: DynaBTreeImpl.h:378