28 # ifndef TPL_BINNODEXT_H 29 # define TPL_BINNODEXT_H 31 # include <tpl_binNode.H> 32 # include <tpl_binNodeUtils.H> 34 using namespace Aleph;
44 BinNodeXt_Data() noexcept : count(1) {}
45 BinNodeXt_Data(SentinelCtor) noexcept : count(0) {}
47 size_t & getCount() noexcept {
return count; }
48 size_t size() const noexcept {
return count; }
50 void reset() noexcept { count = 1; }
66 template <
class Node>
inline auto &
COUNT(Node * p) noexcept
72 template <
class Node>
static inline 73 Node * __select_rec(Node * r,
const size_t i) noexcept
75 assert(r != Node::NullPtr);
76 assert(
COUNT(Node::NullPtr) == 0);
82 return __select_rec(
LLINK(r), i);
98 template <
class Node>
inline 102 throw std::out_of_range(
"infix position out of range");
104 return __select_rec(r, i);
117 template <
class Node>
inline 120 assert(
COUNT(Node::NullPtr) == 0);
123 assert(i <
COUNT(r) and
149 template <
class Node>
inline 150 Node *
select(Node * r,
const size_t pos)
152 assert(
COUNT(Node::NullPtr) == 0);
154 throw std::out_of_range(
"infix position out of range");
172 template <
class Node>
inline 173 Node *
select(Node * root,
const size_t pos, Node *& parent)
175 assert(
COUNT(Node::NullPtr) == 0);
177 if (pos >=
COUNT(root))
178 throw std::out_of_range(
"infix position out of range");
180 parent = Node::NullPtr;
181 for (
size_t i = pos; i !=
COUNT(
LLINK(root)); )
183 assert(i <
COUNT(root) and
209 template <
class Node,
class Compare>
inline 211 const typename Node::key_type & key,
212 Node *& p, Compare & cmp) noexcept
214 assert(
COUNT(Node::NullPtr) == 0);
216 if (r == Node::NullPtr)
219 if (cmp(key,
KEY(r)))
221 else if (cmp(
KEY(r), key))
236 template <
class Node,
class Compare = Aleph::less<
typename Node::key_type>>
238 const typename Node::key_type & key,
239 Node *& p, Compare && cmp = Compare())
246 template <
class Node,
class Compare>
inline 248 Compare & cmp) noexcept
255 template <
class Node,
class Compare = Aleph::less<
typename Node::key_type>>
257 Compare && cmp = Compare()) noexcept
288 template <
class Node,
289 class Compare = Aleph::less<typename Node::key_type>>
inline 291 Node *& p, Compare & cmp) noexcept
293 assert(
COUNT(Node::NullPtr) == 0);
295 Node * parent =
nullptr;
298 while (r != Node::NullPtr)
299 if (cmp(key,
KEY(r)))
305 else if (cmp(
KEY(r), key))
322 template <
class Node,
323 class Compare = Aleph::less<typename Node::key_type>>
inline 324 long find_position(Node * r,
const typename Node::key_type & key,
325 Node *& p, Compare && cmp = Compare()) noexcept
343 template <
class Node,
class Compare>
inline 346 assert(
COUNT(Node::NullPtr) == 0);
348 if (r == Node::NullPtr)
351 Node * q = Node::NullPtr;
355 if (q != Node::NullPtr)
358 else if (cmp(
KEY(r),
KEY(p)))
361 if (q != Node::NullPtr)
370 template <
class Node,
371 class Compare = Aleph::less<typename Node::key_type>>
inline 388 template <
class Node,
class Compare>
inline 391 assert(
COUNT(Node::NullPtr) == 0);
393 if (r == Node::NullPtr)
408 template <
class Node,
409 class Compare = Aleph::less<typename Node::key_type>>
inline 428 template <
class Node,
class Compare>
inline 429 Node * search_or_insert_by_key_xt(Node *& r, Node * p, Compare & cmp) noexcept
431 assert(
COUNT(Node::NullPtr) == 0);
433 if (r == Node::NullPtr)
440 if (q != Node::NullPtr)
443 else if (cmp(
KEY(r),
KEY(p)))
446 if (q != Node::NullPtr)
456 template <
class Node,
457 class Compare = Aleph::less<typename Node::key_type>>
inline 458 Node * search_or_insert_by_key_xt(Node *& r, Node * p,
459 Compare && cmp = Compare()) noexcept
461 return search_or_insert_by_key_xt(r, p, cmp);
465 template <
class Node,
class Compare>
static inline 466 bool __split_key_rec_xt(Node * root,
const typename Node::key_type & key,
467 Node *& l, Node *& r, Compare & cmp) noexcept
469 if (root == Node::NullPtr)
471 l = r = Node::NullPtr;
475 if (cmp(key,
KEY(root)))
477 if (not __split_key_rec_xt(
LLINK(root), key, l,
LLINK(root), cmp))
483 else if (cmp(
KEY(root), key))
485 if (not __split_key_rec_xt(
RLINK(root), key,
RLINK(root), r, cmp))
511 template <
class Node,
class Compare>
inline 513 Node *& l, Node *& r, Compare & cmp) noexcept
515 bool ret = __split_key_rec_xt(root, key, l, r, cmp);
517 root = Node::NullPtr;
522 template <
class Node,
523 class Compare = Aleph::less<typename Node::key_type>>
inline 525 Node *& l, Node *& r, Compare && cmp = Compare())
532 template <
class Node,
class Compare>
static inline 533 void __split_key_dup_rec_xt(Node * root,
const typename Node::key_type & key,
534 Node *& l, Node *& r, Compare & cmp) noexcept
536 if (root == Node::NullPtr)
538 l = r = Node::NullPtr;
542 if (cmp(key,
KEY(root)))
544 __split_key_dup_rec_xt(
LLINK(root), key, l,
LLINK(root), cmp);
550 __split_key_dup_rec_xt(
RLINK(root), key,
RLINK(root), r, cmp);
571 template <
class Node,
class Compare>
inline 573 Node *& l, Node *& r, Compare & cmp) noexcept
575 __split_key_dup_rec_xt<Node, Compare>(root, key, l, r, cmp);
576 root = Node::NullPtr;
580 template <
class Node,
581 class Compare = Aleph::less<typename Node::key_type>>
inline 583 Node *& l, Node *& r, Compare && cmp = Compare())
604 template <
class Node,
class Compare>
inline 607 if (root == Node::NullPtr)
614 return Node::NullPtr;
623 template <
class Node,
624 class Compare = Aleph::less<typename Node::key_type>>
inline 625 Node *
insert_root_xt(Node *& root, Node * p, Compare && cmp = Compare())
645 template <
class Node,
class Compare>
inline 648 if (root == Node::NullPtr)
658 template <
class Node,
659 class Compare = Aleph::less<typename Node::key_type>>
inline 667 template <
class Node>
static inline 668 void __split_pos_rec(Node * r,
size_t i, Node *& ts, Node *& tg) noexcept
674 LLINK(tg) = Node::NullPtr;
709 template <
class Node>
inline 713 throw std::out_of_range(
"infix position out of range");
718 r = tg = Node::NullPtr;
722 __split_pos_rec<Node>(r, i, ts, tg);
741 template <
class Node>
inline 744 assert(
COUNT(Node::NullPtr) == 0);
763 template <
class Node>
inline 766 if (ts == Node::NullPtr)
769 if (tg == Node::NullPtr)
780 ts = tg = Node::NullPtr;
801 template <
class Node,
802 class Compare = Aleph::less<typename Node::key_type>>
inline 804 Compare & cmp) noexcept
806 assert(root != Node::NullPtr);
808 if (root == Node::NullPtr)
809 return Node::NullPtr;
811 Node * ret_val = Node::NullPtr;
812 if (cmp(key,
KEY(root)))
815 if (ret_val != Node::NullPtr)
820 else if (cmp(
KEY(root), key))
823 if (ret_val != Node::NullPtr)
838 template <
class Node,
class Compare = Aleph::less<
typename Node::key_type>>
840 const typename Node::key_type & key,
841 Compare && cmp = Compare()) noexcept
847 template <
class Node>
static inline 848 Node * __remove_by_pos_xt(Node *& root,
size_t pos) noexcept
852 Node * ret_val = root;
862 ret_val = __remove_by_pos_xt(
LLINK(root), pos);
864 ret_val = __remove_by_pos_xt(
RLINK(root), pos - (
COUNT(
LLINK(root)) + 1));
866 if (ret_val != Node::NullPtr)
882 template <
class Node>
inline 885 if (pos >=
COUNT(root))
886 throw std::out_of_range(
"infix position out of range");
888 return __remove_by_pos_xt(root, pos);
895 template <
class Node>
inline 898 if (root == Node::NullPtr)
913 template <
class Node>
inline 916 assert(p != Node::NullPtr);
934 template <
class Node>
inline 937 assert(p != Node::NullPtr);
960 template <
class Node,
class Key,
class Compare>
inline 961 Node * search_or_insert_root_rec_xt(Node * root, Node * p, Compare & cmp)
964 if (root == Node::NullPtr)
967 if (cmp(
KEY(p),
KEY(root)))
969 Node * left_branch = search_or_insert_root_rec_xt(
LLINK(root), p, cmp);
970 if (left_branch == p)
973 LLINK(root) = left_branch;
980 else if (cmp(
KEY(root),
KEY(p)))
982 Node * right_branch = search_or_insert_root_rec_xt(
RLINK(root), p, cmp);
983 if (right_branch == p)
986 RLINK(root) = right_branch;
998 template <
class Node,
class Key,
999 class Compare = Aleph::less<typename Node::key_type>>
inline 1000 Node * search_or_insert_root_rec_xt(Node * root, Node * p,
1001 Compare && cmp = Compare()) noexcept
1003 return search_or_insert_root_rec_xt(root, p, cmp);
1009 # endif // TPL_BINNODEXT_H Node * rotate_to_left_xt(Node *p) noexcept
Definition: tpl_binNodeXt.H:935
Node * remove_by_key_xt(Node *&root, const typename Node::key_type &key, Compare &cmp) noexcept
Definition: tpl_binNodeXt.H:803
auto & COUNT(Node *p) noexcept
Definition: tpl_binNodeXt.H:66
long find_position(Node *r, const typename Node::key_type &key, Node *&p, Compare &cmp) noexcept
Definition: tpl_binNodeXt.H:290
void split_key_dup_rec_xt(Node *&root, const typename Node::key_type &key, Node *&l, Node *&r, Compare &cmp) noexcept
Definition: tpl_binNodeXt.H:572
Node * rotate_to_right_xt(Node *p) noexcept
Definition: tpl_binNodeXt.H:914
bool check_rank_tree(Node *root) noexcept
Definition: tpl_binNodeXt.H:896
Node::Key_Type & KEY(Node *p) noexcept
Definition: tpl_binNode.H:318
void split_pos_rec(Node *&r, const size_t i, Node *&ts, Node *&tg)
Definition: tpl_binNodeXt.H:710
Node * remove_by_pos_xt(Node *&root, size_t pos)
Definition: tpl_binNodeXt.H:883
Node * insert_by_key_xt(Node *&r, Node *p, Compare &cmp) noexcept
Definition: tpl_binNodeXt.H:344
Node * insert_root_xt(Node *&root, Node *p, Compare &cmp) noexcept
Definition: tpl_binNodeXt.H:605
long inorder_position(Node *r, const typename Node::key_type &key, Node *&p, Compare &cmp) noexcept
Definition: tpl_binNodeXt.H:210
Node for extended binary search tree.
Node * select_ne(Node *r, const size_t pos) noexcept
Definition: tpl_binNodeXt.H:118
Node * insert_dup_by_key_xt(Node *&r, Node *p, Compare &cmp) noexcept
Definition: tpl_binNodeXt.H:389
Node * insert_dup_root_xt(Node *&root, Node *p, Compare &cmp) noexcept
Definition: tpl_binNodeXt.H:646
Node *& LLINK(Node *p) noexcept
Definition: tpl_binNode.H:298
Node * join_exclusive_xt(Node *&ts, Node *&tg) noexcept
Definition: tpl_binNodeXt.H:764
Node * select(Node *root, const size_t pos, Node *&parent)
Definition: tpl_binNodeXt.H:173
#define DECLARE_BINNODE_SENTINEL(Name, height, Control_Data)
Definition: tpl_binNode.H:272
void insert_by_pos_xt(Node *&r, Node *p, size_t pos)
Definition: tpl_binNodeXt.H:742
bool split_key_rec_xt(Node *&root, const typename Node::key_type &key, Node *&l, Node *&r, Compare &cmp) noexcept
Definition: tpl_binNodeXt.H:512
Node * select_rec(Node *r, const size_t i)
Definition: tpl_binNodeXt.H:99
Node *& RLINK(Node *p) noexcept
Definition: tpl_binNode.H:307