31 # include <gsl/gsl_rng.h> 32 # include <ahFunction.H> 33 # include <tpl_binNodeUtils.H> 34 # include <treapNode.H> 35 # include <tpl_binTreeOps.H> 37 using namespace Aleph;
65 template <
template <
typename>
class NodeType,
typename Key,
class Compare>
70 using Node = NodeType<Key>;
80 void init(
unsigned int seed)
82 PRIO(head_ptr) = Min_Priority;
83 r = gsl_rng_alloc (gsl_rng_mt19937);
86 throw std::bad_alloc();
88 gsl_rng_set(r, seed % gsl_rng_max(r));
94 void set_seed(
unsigned long seed) noexcept { gsl_rng_set(r, seed); }
99 std::swap(tree_root, tree.tree_root);
100 std::swap(cmp, tree.cmp);
101 std::swap(r, tree.r);
112 Gen_Treap(
unsigned long seed, Compare & __cmp = Compare())
113 : head_ptr(&head), tree_root(
RLINK(head_ptr)), r(nullptr), cmp(__cmp)
133 Node *&
getRoot() noexcept {
return tree_root; }
141 Node *
search(
const Key & key)
const noexcept
144 return ret_val == Node::NullPtr ? nullptr : ret_val;
149 Node * insert(Node * root, Node * p) noexcept
151 if (root == Node::NullPtr)
154 Node * insertion_result =
nullptr;
155 if (cmp(
KEY(p),
KEY(root)))
157 insertion_result = insert(
LLINK(root), p);
158 if (insertion_result == Node::NullPtr)
159 return Node::NullPtr;
161 LLINK(root) = insertion_result;
162 if (
PRIO(insertion_result) <
PRIO(root))
167 else if (cmp(
KEY(root),
KEY(p)))
169 insertion_result = insert(
RLINK(root), p);
170 if (insertion_result == Node::NullPtr)
171 return Node::NullPtr;
173 RLINK(root) = insertion_result;
174 if (
PRIO(insertion_result) <
PRIO(root))
180 return Node::NullPtr;
183 Node * search_or_insert (Node *& root, Node * p) noexcept
185 if (root == Node::NullPtr)
188 if (cmp(
KEY(p),
KEY(root)))
190 Node * ret = search_or_insert(
LLINK(root), p);
197 else if (cmp(
KEY(root),
KEY(p)))
199 Node * ret = search_or_insert(
RLINK(root), p);
210 Node * insert_dup(Node * root, Node * p) noexcept
212 if (root == Node::NullPtr)
215 if (cmp(
KEY(p),
KEY(root)))
217 Node * result =
LLINK(root) = insert_dup(
LLINK(root), p);
225 Node * result =
RLINK(root) = insert_dup(
RLINK(root), p);
246 assert(p != Node::NullPtr);
248 PRIO(p) = gsl_rng_get(r);
249 Node * result = insert(tree_root, p);
250 if (result == Node::NullPtr)
272 assert(p != Node::NullPtr);
274 PRIO(p) = gsl_rng_get(r);
276 return search_or_insert(tree_root, p);
288 assert(p != Node::NullPtr);
290 PRIO(p) = gsl_rng_get(r);
291 tree_root = insert_dup(tree_root, p);
297 bool verify() const noexcept {
return is_treap(tree_root); }
305 Node *
remove(
const Key & key) noexcept
307 Node ** pp = &
RLINK(head_ptr);
308 Node * p = tree_root;
310 while (p != Node::NullPtr)
311 if (cmp(key,
KEY(p)))
316 else if (cmp(
KEY(p), key))
324 if (p == Node::NullPtr)
328 while (not (
LLINK(p) == Node::NullPtr and
RLINK(p) == Node::NullPtr))
349 static Node * join_exclusive(Node * t1, Node * t2) noexcept
351 if (t1 == Node::NullPtr)
354 if (t2 == Node::NullPtr)
369 Node *
remove(Node *& root,
const Key & key) noexcept
371 if (root == Node::NullPtr)
372 return Node::NullPtr;
374 if (cmp(key,
KEY(root)))
375 return remove(
LLINK(root), key);
376 else if (cmp(
KEY(root), key))
377 return remove(
RLINK(root), key);
380 root = join_exclusive(
LLINK(root),
RLINK(root));
386 void join_dup(Node *& t1, Node * t2) noexcept
388 if (t2 == Node::NullPtr)
393 t1 = insert_dup(t1, t2);
398 void join(Node *& t1, Node * t2, Node *& dup) noexcept
400 if (t2 == Node::NullPtr)
406 Node * ret = insert(t1, t2);
407 if (ret == Node::NullPtr)
409 dup = insert_dup(dup,
remove(t1,
KEY(t2)));
434 join(tree_root, t.tree_root, dup.tree_root);
435 t.tree_root = Node::NullPtr;
448 join_dup(tree_root, t.tree_root);
449 t.tree_root = Node::NullPtr;
465 tree_root = join_exclusive(tree_root, t.tree_root);
466 t.tree_root = Node::NullPtr;
534 template <
typename Key,
class Compare = Aleph::less<Key>>
567 template <
typename Key,
class Compare = Aleph::less<Key>>
576 # endif // TPL_TREAP_H Definition: tpl_binNodeUtils.H:2445
void join(Gen_Treap &t, Gen_Treap &dup) noexcept
Definition: tpl_treap.H:432
Node * rotate_to_right(Node *p) noexcept
Definition: tpl_binNodeUtils.H:1891
bool verify() const noexcept
Return true if this is a consistent treap.
Definition: tpl_treap.H:297
void join_dup(Gen_Treap &t) noexcept
Definition: tpl_treap.H:446
Compare & get_compare() noexcept
Definition: tpl_treap.H:108
Definition: tpl_treap.H:503
gsl_rng * gsl_rng_object() noexcept
Get a pointer to gsl random number generator.
Definition: tpl_treap.H:130
bool split_key_rec(Node *&root, const typename Node::key_type &key, Node *&ts, Node *&tg, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1643
void set_seed(unsigned long seed) noexcept
Set the random number generator seed.
Definition: tpl_treap.H:94
Node * search(const Key &key) const noexcept
Definition: tpl_treap.H:141
Node * insert(Node *p) noexcept
Definition: tpl_treap.H:244
Node * searchInBinTree(Node *root, const typename Node::key_type &key, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1323
Node::Key_Type & KEY(Node *p) noexcept
Definition: tpl_binNode.H:318
Definition: tpl_treap.H:568
Definition: tpl_treap.H:535
Node *& LLINK(Node *p) noexcept
Definition: tpl_binNode.H:298
Gen_Treap(Compare cmp=Compare())
Definition: tpl_treap.H:120
Gen_Treap(unsigned long seed, Compare &__cmp=Compare())
Definition: tpl_treap.H:112
void swap(Gen_Treap &tree) noexcept
Swap in constant time all the nodes of this with tree
Definition: tpl_treap.H:97
Compare & key_comp() noexcept
return the comparison criteria
Definition: tpl_treap.H:105
Node *& getRoot() noexcept
Return the tree's root.
Definition: tpl_treap.H:133
Node * search_or_insert(Node *p) noexcept
Definition: tpl_treap.H:270
bool split_key(const Key &key, Gen_Treap &t1, Gen_Treap &t2)
Definition: tpl_treap.H:477
Definition: tpl_treap.H:66
Node * insert_dup(Node *p) noexcept
Definition: tpl_treap.H:286
unsigned long & PRIO(Node *p) noexcept
Definition: treapNode.H:63
void split_key_dup(const Key &key, Gen_Treap &t1, Gen_Treap &t2)
Definition: tpl_treap.H:492
Node * rotate_to_left(Node *p) noexcept
Definition: tpl_binNodeUtils.H:1932
void join_exclusive(Gen_Treap &t) noexcept
Definition: tpl_treap.H:463
void split_key_dup_rec(Node *&root, const typename Node::key_type &key, Node *&ts, Node *&tg, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1686
Node *& RLINK(Node *p) noexcept
Definition: tpl_binNode.H:307