Dynalib Utils
DynaBTree.h
Go to the documentation of this file.
1 #ifndef DYNABTREE_H
2 #define DYNABTREE_H
3 
4 #include <exception>
5 #include <type_traits>
6 #include <cstring>
7 #include "TypeDefs.h"
8 #include "ICopyable.h"
9 #include "DynaArray.h"
10 #include "DynaList.h"
11 #include "DynaBuffer.h"
12 #include "ICacheConst.h"
13 
14 using namespace std;
15 
16 #define MAKE_BTREETYPE_DEF(K,V,T) \
17  typedef DynaTreeInnerElem<K> T##TreeInnerElem; \
18  typedef DynaTreeLeafElem<K,V> T##TreeLeafElem; \
19  typedef DynaTreeInnerElem<K>::Data T##TreeInnerData; \
20  typedef DynaTreeLeafElem<K,V>::Data T##TreeLeafData; \
21  typedef DynaBTree<K,V> T##BTree; \
22  typedef DynaBTreeLeafNode<K,V> T##BTreeLeafNode; \
23  typedef DynaBTreeInnerNode<K> T##BTreeInnerNode
24 
25 template <typename K> class DynaBTreeNode;
26 template <typename K, typename V> class DynaBTreeLeafNode;
27 
28 template <typename T> T* ptr(T& obj) { return &obj; } // turn reference into pointer!
29 template <typename T> T* ptr(T* obj) { return obj; } // obj is already pointer, return it!
30 
31 //----------------------------------------------------------------------------------------------------------------------------------------------
32 
34 
35 template <typename K, typename V> struct DynaTreeLeafElem {
36  #pragma pack(push, 1)
37  struct Data {
38  K key = "";
39  V value = 0;
40  } search;
41  #pragma pack(pop)
43  virtual int compareTo(DynaTreeLeafElem<K,V>* other, MatchType match);
44  virtual void setKeyInSearch(K key);
45  virtual void setValueInSearch(V value);
46  virtual void setKeyInData(K key);
47  virtual void setValueInData(V value);
48  virtual void getKeyFromData(K& key);
49  virtual void getValueFromData(V& value);
50  int size() { return sizeof(this->search); }
51  int keySize() { return sizeof(this->search.key); }
52 };
53 
54 template <typename K> struct DynaTreeInnerElem {
55  #pragma pack(push, 1)
56  struct Data {
57  K key = "";
58  index_t rightNodeIndex = 0;
59  } search;
60  #pragma pack(pop)
62  virtual int compareTo(DynaTreeInnerElem<K>* other, MatchType match);
63  virtual void setKeyInSearch(K key);
64  virtual void setKeyInData(K key);
65  virtual void getKeyFromData(K& key);
66  int size() { return sizeof(this->search); }
67  int keySize() { return sizeof(this->search.key); }
68 };
69 
70 //----------------------------------------------------------------------------------------------------------------------------------------------
71 
78 template <typename K, typename V> class DynaBTree {
79  DynaBTreeNode<K>* _root;
80  int _leafOrder;
81  int _innerOrder;
82 
83  DynaBTreeLeafNode<K,V>* _findLeafNodeForKey(K& elem);
84 
85 public:
86  DynaBTree(int leafOrder, int innerOrder);
87  virtual ~DynaBTree();
88 
89  static bool wasFound(int returnValue);
90  static int insertAt(int returnValue);
91 
92  void insert(K& key, V& value);
93  int search(K& key, V* value, MatchType match = MatchType::FULL_KEY);
94  void deleteEntry(K& key, V* value);
95 };
96 
97 //----------------------------------------------------------------------------------------------------------------------------------------------
98 
99 enum class TreeNodeType {NONE, LEAF, INNER};
100 
106 template <typename K> class DynaBTreeNode : public ICopyable<DynaBTreeNode<K>> {
107 protected:
118 
119 public:
120  DynaBTreeNode(TreeNodeType nodeType, int maxKeys, int leafOrder, int innerOrder);
121  virtual ~DynaBTreeNode();
122  DynaBTreeNode(const DynaBTreeNode<K>& other);
123  DynaBTreeNode<K>* copy() override;
124 
125  DynaBuffer* getBuffer();
126  DynaBTreeNode<K>* getParent();
127  void setParent(DynaBTreeNode<K>* parent);
128  TreeNodeType getNodeType();
129  int getKeyCount();
130 
131  bool wasFound(int returnValue);
132  int insertAt(int returnValue);
133 
134  virtual bool getKeyFromData(uint index, K& key);
135  virtual void setKeyToData(uint index, K& key);
136 
137  virtual bool isOverflow();
138  virtual DynaBTreeNode<K>* handleOverflow();
139 
140  virtual bool isUnderflow();
141  virtual bool canGiveKey();
142 
143  DynaBTreeNode<K>* getLeftSibling();
144  void setLeftSibling(DynaBTreeNode<K>* sibling);
145  DynaBTreeNode<K>* getRightSibling();
146  void setRightSibling(DynaBTreeNode<K>* sibling);
147  DynaBTreeNode<K>* handleUnderflow();
148 
149  virtual int search(K& key, MatchType match = MatchType::FULL_KEY);
150 
151  virtual DynaBTreeNode<K>* split();
152  virtual DynaBTreeNode<K>* pullUpKey(K& key, DynaBTreeNode<K>* leftChild, DynaBTreeNode<K>* rightNode);
153 
154  virtual void transferChildren(DynaBTreeNode<K>* fromNode, DynaBTreeNode<K>* toNode, uint toIndex);
155  virtual DynaBTreeNode<K>* joinChildren(DynaBTreeNode<K>* leftChild, DynaBTreeNode<K>* rightChild);
156  virtual void joinWithSibling(K& sinkKey, DynaBTreeNode<K>* rightSibling);
157  virtual void transferFromSibling(K& sinkKey, K& upKey, DynaBTreeNode<K>* sibling, uint fromIndex);
158 };
159 
160 //----------------------------------------------------------------------------------------------------------------------------------------------
161 
168 template <typename K, typename V> class DynaBTreeLeafNode : public DynaBTreeNode<K> {
169  DynaTreeLeafElem<K,V>* _elemPtr;
170 
171  void _insertAt(uint index, DynaTreeLeafElem<K,V>& elem);
172  void _deleteAt(uint index);
173 
174 public:
175  DynaBTreeLeafNode(int leafOrder, int innerOrder);
176  virtual ~DynaBTreeLeafNode();
178  DynaBTreeNode<K>* copy() override;
179 
180  void setElemDataPos(uint index, DynaTreeLeafElem<K,V>& elem);
181  bool getKeyFromData(uint index, K& key) override;
182  void setKeyToData(uint index, K& key) override;
183 
184  V* getValue(uint index);
185  DynaTreeLeafElem<K,V>* getElemIntoSearch(uint index, DynaTreeLeafElem<K,V>& elem);
186  void setElemFromSearch(uint index, DynaTreeLeafElem<K,V>& elem);
187  void insertElem(DynaTreeLeafElem<K,V>& elem);
188  bool deleteElem(DynaTreeLeafElem<K,V>& elem);
189 
190  int search(K& key, MatchType match = MatchType::FULL_KEY) override;
191  int search(DynaTreeLeafElem<K,V>& elem, MatchType match = MatchType::FULL_KEY);
192 
193  DynaBTreeNode<K>* split() override;
194  DynaBTreeNode<K>* pullUpKey(K& key, DynaBTreeNode<K>* leftChild, DynaBTreeNode<K>* rightNode) override;
195 
196  void transferChildren(DynaBTreeNode<K>* fromNode, DynaBTreeNode<K>* toNode, uint toIndex) override;
197  DynaBTreeNode<K>* joinChildren(DynaBTreeNode<K>* leftChild, DynaBTreeNode<K>* rightChild) override;
198  void joinWithSibling(K& sinkKey, DynaBTreeNode<K>* rightSibling) override;
199  void transferFromSibling(K& sinkKey, K& upKey, DynaBTreeNode<K>* sibling, uint fromIndex) override;
200 };
201 
202 //----------------------------------------------------------------------------------------------------------------------------------------------
203 
209 template <typename K> class DynaBTreeInnerNode : public DynaBTreeNode<K> {
210  DynaTreeInnerElem<K>* _elemPtr;
211 
212  void _insertAt(uint index, K& elem, DynaBTreeNode<K>* leftChild, DynaBTreeNode<K>* rightChild);
213  void _deleteAt(uint index);
214 
215 public:
216  explicit DynaBTreeInnerNode(int order);
217  virtual ~DynaBTreeInnerNode();
219  DynaBTreeNode<K>* copy() override;
220 
221  void setElemDataPos(uint index, DynaTreeInnerElem<K>& elem);
222  bool getKeyFromData(uint index, K& key) override;
223  void setKeyToData(uint index, K& key) override;
224 
225  DynaBTreeNode<K>* getChild(uint index);
226  void setChild(uint index, DynaBTreeNode<K>* child);
227 
228  int search(K& key, MatchType match = MatchType::FULL_KEY) override;
229 
230  DynaBTreeNode<K>* split() override;
231  DynaBTreeNode<K>* pullUpKey(K& key, DynaBTreeNode<K>* leftChild, DynaBTreeNode<K>* rightNode) override;
232 
233  void transferChildren(DynaBTreeNode<K>* fromNode, DynaBTreeNode<K>* toNode, uint toIndex) override;
234  DynaBTreeNode<K>* joinChildren(DynaBTreeNode<K>* leftChild, DynaBTreeNode<K>* rightChild) override;
235  void joinWithSibling(K& sinkKey, DynaBTreeNode<K>* rightSibling) override;
236  void transferFromSibling(K& sinkKey, K& upKey, DynaBTreeNode<K>* sibling, uint fromIndex) override;
237 };
238 
239 
240 #endif
int keySize()
Definition: DynaBTree.h:67
T * ptr(T &obj)
Definition: DynaBTree.h:28
Base Class for B-Tree nodes.
Definition: DynaBTree.h:25
B-Tree Leaf Node.
Definition: DynaBTree.h:26
MatchType
Definition: DynaBTree.h:33
Data * data
Definition: DynaBTree.h:42
GeneratorWrapper< T > value(T &&value)
Definition: catch.hpp:4005
Definition: DynaBTree.h:37
DynaBTreeNode< K > * _rightSibling
Definition: DynaBTree.h:117
B-Tree Inner Node.
Definition: DynaBTree.h:209
Definition: DynaBTree.h:54
Definition: DynaBTree.h:35
int64_t index_t
Definition: ICacheConst.h:19
Definition: DynaBTree.h:56
index_t _leftSiblingIndex
Definition: DynaBTree.h:113
DynaBTreeNode< K > * _leftSibling
Definition: DynaBTree.h:116
TreeNodeType
Definition: DynaBTree.h:99
DynaBTreeNode< K > * _parent
Definition: DynaBTree.h:115
int keySize()
Definition: DynaBTree.h:51
index_t _parentIndex
Definition: DynaBTree.h:112
int size()
Definition: DynaBTree.h:66
int size()
Definition: DynaBTree.h:50
B-Tree main class.
Definition: DynaBTree.h:78
DynaBuffer * _buffer
Definition: DynaBTree.h:111
TreeNodeType _nodeType
Definition: DynaBTree.h:108
int _leafOrder
Definition: DynaBTree.h:109
Data * data
Definition: DynaBTree.h:61
index_t _rightSiblingIndex
Definition: DynaBTree.h:114
Definition: ICopyable.h:8
Definition: DynaBuffer.h:20
int _innerOrder
Definition: DynaBTree.h:110