1 #ifndef DYNABTREEIMPL_H 2 #define DYNABTREEIMPL_H 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 32 auto len = strlen(search.key);
33 result = strncmp(search.key, other->
data->key, len);
36 result = strncmp(search.key, other->
data->key, keySize());
38 auto v1 = search.value;
39 auto v2 = other->
data->value;
40 result = v1 < v2 ? -1 : v1 > v2 ? 1 : 0;
47 std::strncpy(search.key, key, keySize());
53 std::strncpy(data->key, key, keySize());
59 std::strncpy(key, data->key, keySize());
68 auto result = std::strncmp(search.key, other->
data->key, len);
73 std::strncpy(search.key, key, keySize());
77 std::strncpy(data->key, key, keySize());
81 std::strncpy(key, data->key, keySize());
90 int result = node->
search(key);
96 template <
typename K,
typename V>
DynaBTree<K,V>::DynaBTree(
int leafOrder,
int innerOrder) : _leafOrder(leafOrder), _innerOrder(innerOrder) {
105 return returnValue >= 0;
109 return returnValue >= 0 ? returnValue : -(returnValue + 1);
113 auto* leaf = _findLeafNodeForKey(key);
117 leaf->insertElem(elem);
119 if (leaf->isOverflow()) {
120 auto* n = leaf->handleOverflow();
127 auto* leaf = _findLeafNodeForKey(key);
130 if (value !=
nullptr) {
133 return leaf->search(tempElem, match);
137 auto* leaf = _findLeafNodeForKey(key);
140 if (value !=
nullptr) {
143 if (leaf->deleteElem(tempElem) && leaf->isUnderflow()) {
144 auto* n = leaf->handleUnderflow();
154 _nodeType(nodeType), _leafOrder(leafOrder), _innerOrder(innerOrder) {
215 auto* newRNode =
split();
222 newRNode->setLeftSibling(
this);
229 return getParent()->pullUpKey(upKey,
this, newRNode);
266 if (leftSibling !=
nullptr && leftSibling->canGiveKey()) {
267 getParent()->transferChildren(
this, leftSibling, leftSibling->getKeyCount() - 1);
272 if (rightSibling !=
nullptr && rightSibling->canGiveKey()) {
273 getParent()->transferChildren(
this, rightSibling, 0);
278 if (leftSibling !=
nullptr) {
279 return getParent()->joinChildren(leftSibling,
this);
282 return getParent()->joinChildren(
this, rightSibling);
369 auto index =
search(elem);
373 _insertAt(index, elem);
379 auto index =
search(elem);
395 while ( low <= high ) {
396 uint middle = ( low + high ) >> 1;
398 int result = searchElem.
compareTo(&tempElem, match);
402 else if ( result > 0 ) {
417 while ( low <= high ) {
418 uint middle = ( low + high ) >> 1;
420 int result = elem.
compareTo(&tempElem, match);
424 else if ( result > 0 ) {
440 int midIndex = count / 2;
459 auto* siblingLeaf = rightSibling;
461 int sibCount = siblingLeaf->getKeyCount();
462 siblingLeaf->getBuffer()->moveElems(0, sibCount - 1, this->
getBuffer(), thisCount);
469 siblingNode->getElemIntoSearch(fromIndex, searchElem);
471 siblingNode->_deleteAt(fromIndex);
473 if (fromIndex == 0) {
541 while ( low <= high ) {
542 uint middle = ( low + high ) >> 1;
544 int result = searchElem.
compareTo(&tempElem, match);
548 else if ( result > 0 ) {
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