52#ifndef DOXYGEN_SHOULD_SKIP_THIS
57 template <
typename Val,
typename Cmp >
58 INLINE SharedAVLTree< Val, Cmp >::SharedAVLTree(
const Cmp& compare) :
60 this->owns_nodes_ =
false;
63 GUM_CONSTRUCTOR(SharedAVLTree);
67 template <
typename Val,
typename Cmp >
68 INLINE SharedAVLTree< Val, Cmp >::SharedAVLTree(SharedAVLTree< Val, Cmp >&& from) noexcept :
69 AVLTree< Val, Cmp >(std::move(from)) {
71 GUM_CONS_MOV(SharedAVLTree);
75 template <
typename Val,
typename Cmp >
76 INLINE SharedAVLTree< Val, Cmp >::~SharedAVLTree() {
78 GUM_DESTRUCTOR(SharedAVLTree);
82 template <
typename Val,
typename Cmp >
83 INLINE SharedAVLTree< Val, Cmp >&
84 SharedAVLTree< Val, Cmp >::operator=(SharedAVLTree< Val, Cmp >&& from) {
85 operator=(std::move(from));
90 template <
typename Val,
typename Cmp >
91 INLINE
typename SharedAVLTree< Val, Cmp >::AVLNode*
92 SharedAVLTree< Val, Cmp >::highestNode() const noexcept {
93 return this->highest_node_;
97 template <
typename Val,
typename Cmp >
98 INLINE
typename SharedAVLTree< Val, Cmp >::AVLNode*
99 SharedAVLTree< Val, Cmp >::lowestNode() const noexcept {
100 return this->lowest_node_;
104 template <
typename Val,
typename Cmp >
105 INLINE
void SharedAVLTree< Val, Cmp >::insert(AVLNode* node) {
109 node->left_child =
nullptr;
110 node->right_child =
nullptr;
115 template <
typename Val,
typename Cmp >
116 INLINE
void SharedAVLTree< Val, Cmp >::erase(AVLNode* node) {
117 this->removeNodeFromTree_(node);
121 template <
typename Val,
typename Cmp >
122 INLINE
void SharedAVLTree< Val, Cmp >::erase(iterator_safe& iter) {
123 this->removeNodeFromTree_(iter.node_);
127 template <
typename Val,
typename Cmp >
128 INLINE
void SharedAVLTree< Val, Cmp >::erase(reverse_iterator_safe& iter) {
129 this->removeNodeFromTree_(iter.node_);
133 template <
typename Val,
typename Cmp >
134 INLINE
typename SharedAVLTree< Val, Cmp >::iterator SharedAVLTree< Val, Cmp >::begin()
const {
135 return SharedAVLTreeIterator(*
this);
139 template <
typename Val,
typename Cmp >
140 constexpr const typename SharedAVLTree< Val, Cmp >::iterator&
141 SharedAVLTree< Val, Cmp >::end()
const {
142 return *(
reinterpret_cast< const iterator*
>(_SharedAVLTree_end_));
146 template <
typename Val,
typename Cmp >
147 INLINE
typename SharedAVLTree< Val, Cmp >::reverse_iterator
148 SharedAVLTree< Val, Cmp >::rbegin()
const {
149 return SharedAVLTreeReverseIterator(*
this,
true);
153 template <
typename Val,
typename Cmp >
154 constexpr const typename SharedAVLTree< Val, Cmp >::reverse_iterator&
155 SharedAVLTree< Val, Cmp >::rend()
const {
156 return *(
reinterpret_cast< const reverse_iterator*
>(_SharedAVLTree_rend_));
160 template <
typename Val,
typename Cmp >
161 INLINE
typename SharedAVLTree< Val, Cmp >::iterator_safe SharedAVLTree< Val, Cmp >::beginSafe() {
162 return SharedAVLTreeIteratorSafe(*
this);
166 template <
typename Val,
typename Cmp >
167 constexpr const typename SharedAVLTree< Val, Cmp >::iterator_safe&
168 SharedAVLTree< Val, Cmp >::endSafe()
const {
169 return *(
reinterpret_cast< const iterator_safe*
>(_SharedAVLTree_end_safe_));
173 template <
typename Val,
typename Cmp >
174 INLINE
typename SharedAVLTree< Val, Cmp >::reverse_iterator_safe
175 SharedAVLTree< Val, Cmp >::rbeginSafe() {
176 return SharedAVLTreeReverseIteratorSafe(*
this,
true);
180 template <
typename Val,
typename Cmp >
181 constexpr const typename SharedAVLTree< Val, Cmp >::reverse_iterator_safe&
182 SharedAVLTree< Val, Cmp >::rendSafe()
const {
183 return *(
reinterpret_cast< const reverse_iterator_safe*
>(_SharedAVLTree_rend_safe_));
189 template <
typename Val,
typename Cmp >
190 INLINE SharedAVLTreeIterator< Val, Cmp >::SharedAVLTreeIterator(
191 const SharedAVLTree< Val, Cmp >& tree,
192 const bool begin) noexcept : AVLTreeIterator< Val, Cmp >(tree, begin) {
193 GUM_CONSTRUCTOR(SharedAVLTreeIterator)
197 template <
typename Val,
typename Cmp >
198 INLINE SharedAVLTreeIterator< Val, Cmp >::SharedAVLTreeIterator(
199 const SharedAVLTreeIterator< Val, Cmp >& from) noexcept : AVLTreeIterator< Val, Cmp >(from) {
200 GUM_CONS_CPY(SharedAVLTreeIterator)
204 template <
typename Val,
typename Cmp >
205 INLINE SharedAVLTreeIterator< Val, Cmp >::SharedAVLTreeIterator(
206 SharedAVLTreeIterator< Val, Cmp >&& from) noexcept :
207 AVLTreeIterator< Val, Cmp >(std::move(from)) {
208 GUM_CONS_MOV(SharedAVLTreeIterator)
212 template <
typename Val,
typename Cmp >
213 INLINE SharedAVLTreeIterator< Val, Cmp >::~SharedAVLTreeIterator() noexcept {
214 GUM_DESTRUCTOR(SharedAVLTreeIterator)
218 template <
typename Val,
typename Cmp >
219 INLINE SharedAVLTreeIterator< Val, Cmp >& SharedAVLTreeIterator< Val, Cmp >::operator=(
220 const SharedAVLTreeIterator< Val, Cmp >& from)
noexcept {
221 AVLTreeIterator< Val, Cmp >::operator=(from);
226 template <
typename Val,
typename Cmp >
227 INLINE SharedAVLTreeIterator< Val, Cmp >& SharedAVLTreeIterator< Val, Cmp >::operator=(
228 SharedAVLTreeIterator< Val, Cmp >&& from)
noexcept {
229 AVLTreeIterator< Val, Cmp >::operator=(std::move(from));
234 template <
typename Val,
typename Cmp >
235 INLINE
bool SharedAVLTreeIterator< Val, Cmp >::operator==(
236 const SharedAVLTreeIterator< Val, Cmp >& from)
const {
237 return AVLTreeIterator< Val, Cmp >::operator==(from);
241 template <
typename Val,
typename Cmp >
242 INLINE
bool SharedAVLTreeIterator< Val, Cmp >::operator!=(
243 const SharedAVLTreeIterator< Val, Cmp >& from)
const {
244 return !SharedAVLTreeIterator< Val, Cmp >::operator==(from);
248 template <
typename Val,
typename Cmp >
249 INLINE SharedAVLTreeIterator< Val, Cmp >&
250 SharedAVLTreeIterator< Val, Cmp >::operator++() noexcept {
251 AVLTreeIterator< Val, Cmp >::operator++();
256 template <
typename Val,
typename Cmp >
257 INLINE SharedAVLTreeIterator< Val, Cmp >&
258 SharedAVLTreeIterator< Val, Cmp >::operator+=(
const Size k)
noexcept {
259 AVLTreeIterator< Val, Cmp >::operator+=(k);
264 template <
typename Val,
typename Cmp >
265 INLINE SharedAVLTreeIterator< Val, Cmp >&
266 SharedAVLTreeIterator< Val, Cmp >::operator--() noexcept {
267 AVLTreeIterator< Val, Cmp >::operator--();
272 template <
typename Val,
typename Cmp >
273 INLINE SharedAVLTreeIterator< Val, Cmp >&
274 SharedAVLTreeIterator< Val, Cmp >::operator-=(
const Size k)
noexcept {
275 AVLTreeIterator< Val, Cmp >::operator-=(k);
280 template <
typename Val,
typename Cmp >
281 INLINE
typename SharedAVLTreeIterator< Val, Cmp >::const_reference
282 SharedAVLTreeIterator< Val, Cmp >::operator*()
const {
283 if (this->node_ !=
nullptr)
return *(this->node_);
285 if ((this->next_node_ ==
nullptr) || (this->preceding_node_ ==
nullptr)) {
294 template <
typename Val,
typename Cmp >
295 INLINE
typename SharedAVLTreeIterator< Val, Cmp >::const_pointer
296 SharedAVLTreeIterator< Val, Cmp >::operator->()
const {
303 template <
typename Val,
typename Cmp >
304 INLINE SharedAVLTreeIteratorSafe< Val, Cmp >::SharedAVLTreeIteratorSafe(
305 SharedAVLTree< Val, Cmp >& tree,
306 const bool rbegin) : AVLTreeIteratorSafe< Val,
Cmp >(tree, rbegin) {
307 GUM_CONSTRUCTOR(SharedAVLTreeIteratorSafe)
311 template <
typename Val,
typename Cmp >
312 INLINE SharedAVLTreeIteratorSafe< Val, Cmp >::SharedAVLTreeIteratorSafe(
313 const SharedAVLTreeIteratorSafe< Val, Cmp >& from) : AVLTreeIteratorSafe< Val,
Cmp >(from) {
314 GUM_CONS_CPY(SharedAVLTreeIteratorSafe)
318 template <
typename Val,
typename Cmp >
319 INLINE SharedAVLTreeIteratorSafe< Val, Cmp >::SharedAVLTreeIteratorSafe(
320 SharedAVLTreeIteratorSafe< Val, Cmp >&& from) :
321 AVLTreeIteratorSafe< Val,
Cmp >(
std::move(from)) {
322 GUM_CONS_CPY(SharedAVLTreeIteratorSafe)
326 template <
typename Val,
typename Cmp >
327 INLINE SharedAVLTreeIteratorSafe< Val, Cmp >::~SharedAVLTreeIteratorSafe() noexcept {
328 GUM_DESTRUCTOR(SharedAVLTreeIteratorSafe)
332 template <
typename Val,
typename Cmp >
333 INLINE SharedAVLTreeIteratorSafe< Val, Cmp >& SharedAVLTreeIteratorSafe< Val, Cmp >::operator=(
334 const SharedAVLTreeIteratorSafe< Val, Cmp >& from) {
335 AVLTreeIteratorSafe< Val, Cmp >::operator=(from);
340 template <
typename Val,
typename Cmp >
341 INLINE SharedAVLTreeIteratorSafe< Val, Cmp >& SharedAVLTreeIteratorSafe< Val, Cmp >::operator=(
342 SharedAVLTreeIteratorSafe< Val, Cmp >&& from) {
343 AVLTreeIteratorSafe< Val, Cmp >::operator=(std::move(from));
348 template <
typename Val,
typename Cmp >
349 INLINE
bool SharedAVLTreeIteratorSafe< Val, Cmp >::operator==(
350 const SharedAVLTreeIteratorSafe< Val, Cmp >& from)
const {
351 return AVLTreeIteratorSafe< Val, Cmp >::operator==(from);
355 template <
typename Val,
typename Cmp >
356 INLINE
bool SharedAVLTreeIteratorSafe< Val, Cmp >::operator!=(
357 const SharedAVLTreeIteratorSafe< Val, Cmp >& from)
const {
358 return !SharedAVLTreeIteratorSafe< Val, Cmp >::operator==(from);
362 template <
typename Val,
typename Cmp >
363 INLINE SharedAVLTreeIteratorSafe< Val, Cmp >&
364 SharedAVLTreeIteratorSafe< Val, Cmp >::operator++() noexcept {
365 AVLTreeIteratorSafe< Val, Cmp >::operator++();
370 template <
typename Val,
typename Cmp >
371 INLINE SharedAVLTreeIteratorSafe< Val, Cmp >&
372 SharedAVLTreeIteratorSafe< Val, Cmp >::operator+=(
const Size k)
noexcept {
373 AVLTreeIteratorSafe< Val, Cmp >::operator+=(k);
378 template <
typename Val,
typename Cmp >
379 INLINE SharedAVLTreeIteratorSafe< Val, Cmp >&
380 SharedAVLTreeIteratorSafe< Val, Cmp >::operator--() noexcept {
381 AVLTreeIteratorSafe< Val, Cmp >::operator--();
386 template <
typename Val,
typename Cmp >
387 INLINE SharedAVLTreeIteratorSafe< Val, Cmp >&
388 SharedAVLTreeIteratorSafe< Val, Cmp >::operator-=(
const Size k)
noexcept {
389 AVLTreeIteratorSafe< Val, Cmp >::operator-=(k);
394 template <
typename Val,
typename Cmp >
395 INLINE
typename SharedAVLTreeIteratorSafe< Val, Cmp >::const_reference
396 SharedAVLTreeIteratorSafe< Val, Cmp >::operator*()
const {
397 if (this->node_ !=
nullptr)
return *(this->node_);
399 if ((this->next_node_ ==
nullptr) || (this->preceding_node_ ==
nullptr)) {
408 template <
typename Val,
typename Cmp >
409 INLINE
typename SharedAVLTreeIteratorSafe< Val, Cmp >::const_pointer
410 SharedAVLTreeIteratorSafe< Val, Cmp >::operator->()
const {
417 template <
typename Val,
typename Cmp >
418 INLINE SharedAVLTreeReverseIterator< Val, Cmp >::SharedAVLTreeReverseIterator(
419 const SharedAVLTree< Val, Cmp >& tree,
420 const bool rbegin) noexcept : SharedAVLTreeIterator< Val, Cmp >(tree, !rbegin) {
421 GUM_CONSTRUCTOR(SharedAVLTreeReverseIterator)
425 template <
typename Val,
typename Cmp >
426 INLINE SharedAVLTreeReverseIterator< Val, Cmp >::SharedAVLTreeReverseIterator(
427 const SharedAVLTreeReverseIterator< Val, Cmp >& from) noexcept :
428 SharedAVLTreeIterator< Val, Cmp >(from) {
429 GUM_CONS_CPY(SharedAVLTreeReverseIterator)
433 template <
typename Val,
typename Cmp >
434 INLINE SharedAVLTreeReverseIterator< Val, Cmp >::SharedAVLTreeReverseIterator(
435 SharedAVLTreeReverseIterator< Val, Cmp >&& from) noexcept :
436 SharedAVLTreeIterator< Val, Cmp >(std::move(from)) {
437 GUM_CONS_CPY(SharedAVLTreeReverseIterator)
441 template <
typename Val,
typename Cmp >
442 INLINE SharedAVLTreeReverseIterator< Val, Cmp >::~SharedAVLTreeReverseIterator() noexcept {
443 GUM_DESTRUCTOR(SharedAVLTreeReverseIterator)
447 template <
typename Val,
typename Cmp >
448 INLINE SharedAVLTreeReverseIterator< Val, Cmp >&
449 SharedAVLTreeReverseIterator< Val, Cmp >::operator=(
450 const SharedAVLTreeReverseIterator< Val, Cmp >& from)
noexcept {
451 SharedAVLTreeIterator< Val, Cmp >::operator=(from);
456 template <
typename Val,
typename Cmp >
457 INLINE SharedAVLTreeReverseIterator< Val, Cmp >&
458 SharedAVLTreeReverseIterator< Val, Cmp >::operator=(
459 SharedAVLTreeReverseIterator< Val, Cmp >&& from)
noexcept {
460 SharedAVLTreeIterator< Val, Cmp >::operator=(std::move(from));
465 template <
typename Val,
typename Cmp >
466 INLINE
bool SharedAVLTreeReverseIterator< Val, Cmp >::operator==(
467 const SharedAVLTreeReverseIterator< Val, Cmp >& from)
const {
477 return (this->node_ == from.node_) && (this->preceding_node_ == from.preceding_node_);
481 template <
typename Val,
typename Cmp >
482 INLINE
bool SharedAVLTreeReverseIterator< Val, Cmp >::operator!=(
483 const SharedAVLTreeReverseIterator< Val, Cmp >& from)
const {
484 return !SharedAVLTreeReverseIterator< Val, Cmp >::operator==(from);
488 template <
typename Val,
typename Cmp >
489 INLINE SharedAVLTreeReverseIterator< Val, Cmp >&
490 SharedAVLTreeReverseIterator< Val, Cmp >::operator++() noexcept {
491 SharedAVLTreeIterator< Val, Cmp >::operator--();
496 template <
typename Val,
typename Cmp >
497 INLINE SharedAVLTreeReverseIterator< Val, Cmp >&
498 SharedAVLTreeReverseIterator< Val, Cmp >::operator+=(
const Size k)
noexcept {
499 SharedAVLTreeIterator< Val, Cmp >::operator-=(k);
504 template <
typename Val,
typename Cmp >
505 INLINE SharedAVLTreeReverseIterator< Val, Cmp >&
506 SharedAVLTreeReverseIterator< Val, Cmp >::operator--() noexcept {
507 SharedAVLTreeIterator< Val, Cmp >::operator++();
512 template <
typename Val,
typename Cmp >
513 INLINE SharedAVLTreeReverseIterator< Val, Cmp >&
514 SharedAVLTreeReverseIterator< Val, Cmp >::operator-=(
const Size k)
noexcept {
515 SharedAVLTreeIterator< Val, Cmp >::operator+=(k);
522 template <
typename Val,
typename Cmp >
523 INLINE SharedAVLTreeReverseIteratorSafe< Val, Cmp >::SharedAVLTreeReverseIteratorSafe(
524 SharedAVLTree< Val, Cmp >& tree,
525 const bool rbegin) : SharedAVLTreeIteratorSafe< Val,
Cmp >(tree, !rbegin) {
526 GUM_CONSTRUCTOR(SharedAVLTreeReverseIteratorSafe)
530 template <
typename Val,
typename Cmp >
531 INLINE SharedAVLTreeReverseIteratorSafe< Val, Cmp >::SharedAVLTreeReverseIteratorSafe(
532 const SharedAVLTreeReverseIteratorSafe< Val, Cmp >& from) :
533 SharedAVLTreeIteratorSafe< Val,
Cmp >(from) {
534 GUM_CONS_CPY(SharedAVLTreeReverseIteratorSafe)
538 template <
typename Val,
typename Cmp >
539 INLINE SharedAVLTreeReverseIteratorSafe< Val, Cmp >::SharedAVLTreeReverseIteratorSafe(
540 SharedAVLTreeReverseIteratorSafe< Val, Cmp >&& from) :
541 SharedAVLTreeIteratorSafe< Val,
Cmp >(
std::move(from)) {
542 GUM_CONS_MOV(SharedAVLTreeReverseIteratorSafe)
546 template <
typename Val,
typename Cmp >
548 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::~SharedAVLTreeReverseIteratorSafe() noexcept {
549 GUM_DESTRUCTOR(SharedAVLTreeReverseIteratorSafe)
553 template <
typename Val,
typename Cmp >
554 INLINE SharedAVLTreeReverseIteratorSafe< Val, Cmp >&
555 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator=(
556 const SharedAVLTreeReverseIteratorSafe< Val, Cmp >& from) {
557 SharedAVLTreeIteratorSafe< Val, Cmp >::operator=(from);
562 template <
typename Val,
typename Cmp >
563 INLINE SharedAVLTreeReverseIteratorSafe< Val, Cmp >&
564 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator=(
565 SharedAVLTreeReverseIteratorSafe< Val, Cmp >&& from) {
566 SharedAVLTreeIteratorSafe< Val, Cmp >::operator=(std::move(from));
571 template <
typename Val,
typename Cmp >
572 INLINE
bool SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator==(
573 const SharedAVLTreeReverseIteratorSafe< Val, Cmp >& from)
const {
583 return (this->node_ == from.node_) && (this->preceding_node_ == from.preceding_node_);
587 template <
typename Val,
typename Cmp >
588 INLINE
bool SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator!=(
589 const SharedAVLTreeReverseIteratorSafe< Val, Cmp >& from)
const {
590 return !SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator==(from);
594 template <
typename Val,
typename Cmp >
595 INLINE SharedAVLTreeReverseIteratorSafe< Val, Cmp >&
596 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator++() noexcept {
597 SharedAVLTreeIteratorSafe< Val, Cmp >::operator--();
602 template <
typename Val,
typename Cmp >
603 INLINE SharedAVLTreeReverseIteratorSafe< Val, Cmp >&
604 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator+=(
const Size k)
noexcept {
605 SharedAVLTreeIteratorSafe< Val, Cmp >::operator-=(k);
610 template <
typename Val,
typename Cmp >
611 INLINE SharedAVLTreeReverseIteratorSafe< Val, Cmp >&
612 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator--() noexcept {
613 SharedAVLTreeIteratorSafe< Val, Cmp >::operator++();
618 template <
typename Val,
typename Cmp >
619 INLINE SharedAVLTreeReverseIteratorSafe< Val, Cmp >&
620 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator-=(
const Size k)
noexcept {
621 SharedAVLTreeIteratorSafe< Val, Cmp >::operator+=(k);
Exception : the element we looked for cannot be found.
#define GUM_ERROR(type, msg)
gum is the global namespace for all aGrUM entities
AVL binary search trees that do not possess their own nodes.