37 # ifndef TPL_SPLAY_TREE_H 38 # define TPL_SPLAY_TREE_H 40 # include <tpl_binNode.H> 41 # include <tpl_binNodeUtils.H> 43 using namespace Aleph;
46 template <
template <
class>
class NodeType,
typename Key,
class Compare>
51 using Node = NodeType<Key>;
65 Compare & key_comp() noexcept {
return cmp; }
68 Compare & get_compare() noexcept {
return key_comp(); }
72 void splay(
const Key & key) noexcept
82 if (
LLINK(t) == Node::NullPtr)
88 if (
LLINK(t) == Node::NullPtr)
96 else if (cmp(
KEY(t), key))
98 if (
RLINK(t) == Node::NullPtr)
104 if (
RLINK(t) == Node::NullPtr)
118 LLINK(t) = headNode.getR();
119 RLINK(t) = headNode.getL();
125 GenTdSplayTree(Compare __cmp = Compare()) noexcept
126 : head(&headnode), root(headnode.getR()), cmp(__cmp)
131 void swap(GenTdSplayTree & tree)
133 std::swap(root, tree.root);
134 std::swap(cmp, tree.cmp);
138 virtual ~GenTdSplayTree() { }
142 Node * __insert(Node * p) noexcept
144 if (cmp(
KEY(p),
KEY(root)))
148 LLINK(root) = Node::NullPtr;
154 RLINK(root) = Node::NullPtr;
167 Node * insert(Node * p) noexcept
169 assert(p != Node::NullPtr);
170 assert(
LLINK(p) == Node::NullPtr and
RLINK(p) == Node::NullPtr);
173 if (root == Node::NullPtr)
176 const Key & key =
KEY(p);
180 if (are_equals<Key, Compare>(
KEY(root), key, cmp))
186 Node * insert_dup(Node * p) noexcept
188 assert(p != Node::NullPtr);
189 assert(
LLINK(p) == Node::NullPtr and
RLINK(p) == Node::NullPtr);
192 if (root == Node::NullPtr)
207 Node * search(
const Key & key) noexcept
209 if (root == Node::NullPtr)
214 return are_equals<Key, Compare>(
KEY(root), key) ? root :
nullptr;
217 Node * search_or_insert(Node * p) noexcept
219 if (root == Node::NullPtr)
222 const Key & key =
KEY(p);
224 if (are_equals<Key, Compare>(key,
KEY(root), cmp))
239 Node *
remove(
const Key & key) noexcept
241 if (root == Node::NullPtr)
246 if (no_equals<Key, Compare>(
KEY(root), key, cmp))
249 Node * ret_val = root;
251 if (
LLINK(root) == Node::NullPtr)
255 Node * p =
RLINK(root);
267 Node *& getRoot() noexcept
272 bool verify()
const {
return true; }
289 template <
typename Key,
class Compare = Aleph::less<Key>>
290 struct Splay_Tree :
public GenTdSplayTree<BinNode, Key, Compare>
292 using Base = GenTdSplayTree<BinNode, Key, Compare>;
297 template <
typename Key,
class Compare = Aleph::less<Key>>
298 struct Splay_Tree_Vtl :
public GenTdSplayTree<BinNodeVtl, Key, Compare>
300 using Base = GenTdSplayTree<BinNodeVtl, Key, Compare>;
Definition: tpl_binNodeUtils.H:2445
Node * rotate_to_right(Node *p) noexcept
Definition: tpl_binNodeUtils.H:1891
Node::Key_Type & KEY(Node *p) noexcept
Definition: tpl_binNode.H:318
Node *& LLINK(Node *p) noexcept
Definition: tpl_binNode.H:298
Node * rotate_to_left(Node *p) noexcept
Definition: tpl_binNodeUtils.H:1932
Node *& RLINK(Node *p) noexcept
Definition: tpl_binNode.H:307
Definition: tpl_splay_tree.H:282