53#ifndef DOXYGEN_SHOULD_SKIP_THIS
58 template <
typename Val,
typename Cmp >
59 SharedAVLTree< Val, Cmp >::SharedAVLTree(
const Cmp& compare) :
AVLTree< Val, Cmp >(compare) {
60 this->owns_nodes_ =
false;
63 GUM_CONSTRUCTOR(SharedAVLTree);
67 template <
typename Val,
typename Cmp >
68 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 SharedAVLTree< Val, Cmp >::~SharedAVLTree() {
78 GUM_DESTRUCTOR(SharedAVLTree);
82 template <
typename Val,
typename Cmp >
83 SharedAVLTree< Val, Cmp >&
84 SharedAVLTree< Val, Cmp >::operator=(SharedAVLTree< Val, Cmp >&& from) {
85 operator=(std::move(from));
90 template <
typename Val,
typename Cmp >
91 typename SharedAVLTree< Val, Cmp >::AVLNode*
92 SharedAVLTree< Val, Cmp >::highestNode() const noexcept {
93 return this->highest_node_;
97 template <
typename Val,
typename Cmp >
98 typename SharedAVLTree< Val, Cmp >::AVLNode*
99 SharedAVLTree< Val, Cmp >::lowestNode() const noexcept {
100 return this->lowest_node_;
104 template <
typename Val,
typename Cmp >
105 void SharedAVLTree< Val, Cmp >::insert(AVLNode* node) {
109 node->left_child =
nullptr;
110 node->right_child =
nullptr;
115 template <
typename Val,
typename Cmp >
116 void SharedAVLTree< Val, Cmp >::erase(AVLNode* node) {
117 this->removeNodeFromTree_(node);
121 template <
typename Val,
typename Cmp >
122 void SharedAVLTree< Val, Cmp >::erase(iterator_safe& iter) {
123 this->removeNodeFromTree_(iter.node_);
127 template <
typename Val,
typename Cmp >
128 void SharedAVLTree< Val, Cmp >::erase(reverse_iterator_safe& iter) {
129 this->removeNodeFromTree_(iter.node_);
133 template <
typename Val,
typename Cmp >
134 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 typename SharedAVLTree< Val, Cmp >::reverse_iterator SharedAVLTree< Val, Cmp >::rbegin()
const {
148 return SharedAVLTreeReverseIterator(*
this,
true);
152 template <
typename Val,
typename Cmp >
153 constexpr const typename SharedAVLTree< Val, Cmp >::reverse_iterator&
154 SharedAVLTree< Val, Cmp >::rend()
const {
155 return *(
reinterpret_cast< const reverse_iterator*
>(_SharedAVLTree_rend_));
159 template <
typename Val,
typename Cmp >
160 typename SharedAVLTree< Val, Cmp >::iterator_safe SharedAVLTree< Val, Cmp >::beginSafe() {
161 return SharedAVLTreeIteratorSafe(*
this);
165 template <
typename Val,
typename Cmp >
166 constexpr const typename SharedAVLTree< Val, Cmp >::iterator_safe&
167 SharedAVLTree< Val, Cmp >::endSafe()
const {
168 return *(
reinterpret_cast< const iterator_safe*
>(_SharedAVLTree_end_safe_));
172 template <
typename Val,
typename Cmp >
173 typename SharedAVLTree< Val, Cmp >::reverse_iterator_safe
174 SharedAVLTree< Val, Cmp >::rbeginSafe() {
175 return SharedAVLTreeReverseIteratorSafe(*
this,
true);
179 template <
typename Val,
typename Cmp >
180 constexpr const typename SharedAVLTree< Val, Cmp >::reverse_iterator_safe&
181 SharedAVLTree< Val, Cmp >::rendSafe()
const {
182 return *(
reinterpret_cast< const reverse_iterator_safe*
>(_SharedAVLTree_rend_safe_));
188 template <
typename Val,
typename Cmp >
189 SharedAVLTreeIterator< Val, Cmp >::SharedAVLTreeIterator(
const SharedAVLTree< Val, Cmp >& tree,
190 const bool begin) noexcept :
191 AVLTreeIterator< Val, Cmp >(tree, begin) {
192 GUM_CONSTRUCTOR(SharedAVLTreeIterator)
196 template <
typename Val,
typename Cmp >
197 SharedAVLTreeIterator< Val, Cmp >::SharedAVLTreeIterator(
198 const SharedAVLTreeIterator< Val, Cmp >& from) noexcept : AVLTreeIterator< Val, Cmp >(from) {
199 GUM_CONS_CPY(SharedAVLTreeIterator)
203 template <
typename Val,
typename Cmp >
204 SharedAVLTreeIterator< Val, Cmp >::SharedAVLTreeIterator(
205 SharedAVLTreeIterator< Val, Cmp >&& from) noexcept :
206 AVLTreeIterator< Val, Cmp >(std::move(from)) {
207 GUM_CONS_MOV(SharedAVLTreeIterator)
211 template <
typename Val,
typename Cmp >
212 SharedAVLTreeIterator< Val, Cmp >::~SharedAVLTreeIterator() noexcept {
213 GUM_DESTRUCTOR(SharedAVLTreeIterator)
217 template <
typename Val,
typename Cmp >
218 SharedAVLTreeIterator< Val, Cmp >& SharedAVLTreeIterator< Val, Cmp >::operator=(
219 const SharedAVLTreeIterator< Val, Cmp >& from)
noexcept {
220 AVLTreeIterator< Val, Cmp >::operator=(from);
225 template <
typename Val,
typename Cmp >
226 SharedAVLTreeIterator< Val, Cmp >& SharedAVLTreeIterator< Val, Cmp >::operator=(
227 SharedAVLTreeIterator< Val, Cmp >&& from)
noexcept {
228 AVLTreeIterator< Val, Cmp >::operator=(std::move(from));
233 template <
typename Val,
typename Cmp >
234 bool SharedAVLTreeIterator< Val, Cmp >::operator==(
235 const SharedAVLTreeIterator< Val, Cmp >& from)
const {
236 return AVLTreeIterator< Val, Cmp >::operator==(from);
240 template <
typename Val,
typename Cmp >
241 bool SharedAVLTreeIterator< Val, Cmp >::operator!=(
242 const SharedAVLTreeIterator< Val, Cmp >& from)
const {
243 return !SharedAVLTreeIterator< Val, Cmp >::operator==(from);
247 template <
typename Val,
typename Cmp >
248 SharedAVLTreeIterator< Val, Cmp >& SharedAVLTreeIterator< Val, Cmp >::operator++() noexcept {
249 AVLTreeIterator< Val, Cmp >::operator++();
254 template <
typename Val,
typename Cmp >
255 SharedAVLTreeIterator< Val, Cmp >&
256 SharedAVLTreeIterator< Val, Cmp >::operator+=(
const Size k)
noexcept {
257 AVLTreeIterator< Val, Cmp >::operator+=(k);
262 template <
typename Val,
typename Cmp >
263 SharedAVLTreeIterator< Val, Cmp >& SharedAVLTreeIterator< Val, Cmp >::operator--() noexcept {
264 AVLTreeIterator< Val, Cmp >::operator--();
269 template <
typename Val,
typename Cmp >
270 SharedAVLTreeIterator< Val, Cmp >&
271 SharedAVLTreeIterator< Val, Cmp >::operator-=(
const Size k)
noexcept {
272 AVLTreeIterator< Val, Cmp >::operator-=(k);
277 template <
typename Val,
typename Cmp >
278 typename SharedAVLTreeIterator< Val, Cmp >::const_reference
279 SharedAVLTreeIterator< Val, Cmp >::operator*()
const {
280 if (this->node_ !=
nullptr)
return *(this->node_);
282 if ((this->next_node_ ==
nullptr) || (this->preceding_node_ ==
nullptr)) {
291 template <
typename Val,
typename Cmp >
292 typename SharedAVLTreeIterator< Val, Cmp >::const_pointer
293 SharedAVLTreeIterator< Val, Cmp >::operator->()
const {
300 template <
typename Val,
typename Cmp >
301 SharedAVLTreeIteratorSafe< Val, Cmp >::SharedAVLTreeIteratorSafe(SharedAVLTree< Val, Cmp >& tree,
303 AVLTreeIteratorSafe< Val,
Cmp >(tree, rbegin) {
304 GUM_CONSTRUCTOR(SharedAVLTreeIteratorSafe)
308 template <
typename Val,
typename Cmp >
309 SharedAVLTreeIteratorSafe< Val, Cmp >::SharedAVLTreeIteratorSafe(
310 const SharedAVLTreeIteratorSafe< Val, Cmp >& from) : AVLTreeIteratorSafe< Val,
Cmp >(from) {
311 GUM_CONS_CPY(SharedAVLTreeIteratorSafe)
315 template <
typename Val,
typename Cmp >
316 SharedAVLTreeIteratorSafe< Val, Cmp >::SharedAVLTreeIteratorSafe(
317 SharedAVLTreeIteratorSafe< Val, Cmp >&& from) :
318 AVLTreeIteratorSafe< Val,
Cmp >(
std::move(from)) {
319 GUM_CONS_CPY(SharedAVLTreeIteratorSafe)
323 template <
typename Val,
typename Cmp >
324 SharedAVLTreeIteratorSafe< Val, Cmp >::~SharedAVLTreeIteratorSafe() noexcept {
325 GUM_DESTRUCTOR(SharedAVLTreeIteratorSafe)
329 template <
typename Val,
typename Cmp >
330 SharedAVLTreeIteratorSafe< Val, Cmp >& SharedAVLTreeIteratorSafe< Val, Cmp >::operator=(
331 const SharedAVLTreeIteratorSafe< Val, Cmp >& from) {
332 AVLTreeIteratorSafe< Val, Cmp >::operator=(from);
337 template <
typename Val,
typename Cmp >
338 SharedAVLTreeIteratorSafe< Val, Cmp >& SharedAVLTreeIteratorSafe< Val, Cmp >::operator=(
339 SharedAVLTreeIteratorSafe< Val, Cmp >&& from) {
340 AVLTreeIteratorSafe< Val, Cmp >::operator=(std::move(from));
345 template <
typename Val,
typename Cmp >
346 bool SharedAVLTreeIteratorSafe< Val, Cmp >::operator==(
347 const SharedAVLTreeIteratorSafe< Val, Cmp >& from)
const {
348 return AVLTreeIteratorSafe< Val, Cmp >::operator==(from);
352 template <
typename Val,
typename Cmp >
353 bool SharedAVLTreeIteratorSafe< Val, Cmp >::operator!=(
354 const SharedAVLTreeIteratorSafe< Val, Cmp >& from)
const {
355 return !SharedAVLTreeIteratorSafe< Val, Cmp >::operator==(from);
359 template <
typename Val,
typename Cmp >
360 SharedAVLTreeIteratorSafe< Val, Cmp >&
361 SharedAVLTreeIteratorSafe< Val, Cmp >::operator++() noexcept {
362 AVLTreeIteratorSafe< Val, Cmp >::operator++();
367 template <
typename Val,
typename Cmp >
368 SharedAVLTreeIteratorSafe< Val, Cmp >&
369 SharedAVLTreeIteratorSafe< Val, Cmp >::operator+=(
const Size k)
noexcept {
370 AVLTreeIteratorSafe< Val, Cmp >::operator+=(k);
375 template <
typename Val,
typename Cmp >
376 SharedAVLTreeIteratorSafe< Val, Cmp >&
377 SharedAVLTreeIteratorSafe< Val, Cmp >::operator--() noexcept {
378 AVLTreeIteratorSafe< Val, Cmp >::operator--();
383 template <
typename Val,
typename Cmp >
384 SharedAVLTreeIteratorSafe< Val, Cmp >&
385 SharedAVLTreeIteratorSafe< Val, Cmp >::operator-=(
const Size k)
noexcept {
386 AVLTreeIteratorSafe< Val, Cmp >::operator-=(k);
391 template <
typename Val,
typename Cmp >
392 typename SharedAVLTreeIteratorSafe< Val, Cmp >::const_reference
393 SharedAVLTreeIteratorSafe< Val, Cmp >::operator*()
const {
394 if (this->node_ !=
nullptr)
return *(this->node_);
396 if ((this->next_node_ ==
nullptr) || (this->preceding_node_ ==
nullptr)) {
405 template <
typename Val,
typename Cmp >
406 typename SharedAVLTreeIteratorSafe< Val, Cmp >::const_pointer
407 SharedAVLTreeIteratorSafe< Val, Cmp >::operator->()
const {
414 template <
typename Val,
typename Cmp >
415 SharedAVLTreeReverseIterator< Val, Cmp >::SharedAVLTreeReverseIterator(
416 const SharedAVLTree< Val, Cmp >& tree,
417 const bool rbegin) noexcept : SharedAVLTreeIterator< Val, Cmp >(tree, !rbegin) {
418 GUM_CONSTRUCTOR(SharedAVLTreeReverseIterator)
422 template <
typename Val,
typename Cmp >
423 SharedAVLTreeReverseIterator< Val, Cmp >::SharedAVLTreeReverseIterator(
424 const SharedAVLTreeReverseIterator< Val, Cmp >& from) noexcept :
425 SharedAVLTreeIterator< Val, Cmp >(from) {
426 GUM_CONS_CPY(SharedAVLTreeReverseIterator)
430 template <
typename Val,
typename Cmp >
431 SharedAVLTreeReverseIterator< Val, Cmp >::SharedAVLTreeReverseIterator(
432 SharedAVLTreeReverseIterator< Val, Cmp >&& from) noexcept :
433 SharedAVLTreeIterator< Val, Cmp >(std::move(from)) {
434 GUM_CONS_CPY(SharedAVLTreeReverseIterator)
438 template <
typename Val,
typename Cmp >
439 SharedAVLTreeReverseIterator< Val, Cmp >::~SharedAVLTreeReverseIterator() noexcept {
440 GUM_DESTRUCTOR(SharedAVLTreeReverseIterator)
444 template <
typename Val,
typename Cmp >
445 SharedAVLTreeReverseIterator< Val, Cmp >& SharedAVLTreeReverseIterator< Val, Cmp >::operator=(
446 const SharedAVLTreeReverseIterator< Val, Cmp >& from)
noexcept {
447 SharedAVLTreeIterator< Val, Cmp >::operator=(from);
452 template <
typename Val,
typename Cmp >
453 SharedAVLTreeReverseIterator< Val, Cmp >& SharedAVLTreeReverseIterator< Val, Cmp >::operator=(
454 SharedAVLTreeReverseIterator< Val, Cmp >&& from)
noexcept {
455 SharedAVLTreeIterator< Val, Cmp >::operator=(std::move(from));
460 template <
typename Val,
typename Cmp >
461 bool SharedAVLTreeReverseIterator< Val, Cmp >::operator==(
462 const SharedAVLTreeReverseIterator< Val, Cmp >& from)
const {
472 return (this->node_ == from.node_) && (this->preceding_node_ == from.preceding_node_);
476 template <
typename Val,
typename Cmp >
477 bool SharedAVLTreeReverseIterator< Val, Cmp >::operator!=(
478 const SharedAVLTreeReverseIterator< Val, Cmp >& from)
const {
479 return !SharedAVLTreeReverseIterator< Val, Cmp >::operator==(from);
483 template <
typename Val,
typename Cmp >
484 SharedAVLTreeReverseIterator< Val, Cmp >&
485 SharedAVLTreeReverseIterator< Val, Cmp >::operator++() noexcept {
486 SharedAVLTreeIterator< Val, Cmp >::operator--();
491 template <
typename Val,
typename Cmp >
492 SharedAVLTreeReverseIterator< Val, Cmp >&
493 SharedAVLTreeReverseIterator< Val, Cmp >::operator+=(
const Size k)
noexcept {
494 SharedAVLTreeIterator< Val, Cmp >::operator-=(k);
499 template <
typename Val,
typename Cmp >
500 SharedAVLTreeReverseIterator< Val, Cmp >&
501 SharedAVLTreeReverseIterator< Val, Cmp >::operator--() noexcept {
502 SharedAVLTreeIterator< Val, Cmp >::operator++();
507 template <
typename Val,
typename Cmp >
508 SharedAVLTreeReverseIterator< Val, Cmp >&
509 SharedAVLTreeReverseIterator< Val, Cmp >::operator-=(
const Size k)
noexcept {
510 SharedAVLTreeIterator< Val, Cmp >::operator+=(k);
517 template <
typename Val,
typename Cmp >
518 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::SharedAVLTreeReverseIteratorSafe(
519 SharedAVLTree< Val, Cmp >& tree,
520 const bool rbegin) : SharedAVLTreeIteratorSafe< Val,
Cmp >(tree, !rbegin) {
521 GUM_CONSTRUCTOR(SharedAVLTreeReverseIteratorSafe)
525 template <
typename Val,
typename Cmp >
526 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::SharedAVLTreeReverseIteratorSafe(
527 const SharedAVLTreeReverseIteratorSafe< Val, Cmp >& from) :
528 SharedAVLTreeIteratorSafe< Val,
Cmp >(from) {
529 GUM_CONS_CPY(SharedAVLTreeReverseIteratorSafe)
533 template <
typename Val,
typename Cmp >
534 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::SharedAVLTreeReverseIteratorSafe(
535 SharedAVLTreeReverseIteratorSafe< Val, Cmp >&& from) :
536 SharedAVLTreeIteratorSafe< Val,
Cmp >(
std::move(from)) {
537 GUM_CONS_MOV(SharedAVLTreeReverseIteratorSafe)
541 template <
typename Val,
typename Cmp >
542 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::~SharedAVLTreeReverseIteratorSafe() noexcept {
543 GUM_DESTRUCTOR(SharedAVLTreeReverseIteratorSafe)
547 template <
typename Val,
typename Cmp >
548 SharedAVLTreeReverseIteratorSafe< Val, Cmp >&
549 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator=(
550 const SharedAVLTreeReverseIteratorSafe< Val, Cmp >& from) {
551 SharedAVLTreeIteratorSafe< Val, Cmp >::operator=(from);
556 template <
typename Val,
typename Cmp >
557 SharedAVLTreeReverseIteratorSafe< Val, Cmp >&
558 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator=(
559 SharedAVLTreeReverseIteratorSafe< Val, Cmp >&& from) {
560 SharedAVLTreeIteratorSafe< Val, Cmp >::operator=(std::move(from));
565 template <
typename Val,
typename Cmp >
566 bool SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator==(
567 const SharedAVLTreeReverseIteratorSafe< Val, Cmp >& from)
const {
577 return (this->node_ == from.node_) && (this->preceding_node_ == from.preceding_node_);
581 template <
typename Val,
typename Cmp >
582 bool SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator!=(
583 const SharedAVLTreeReverseIteratorSafe< Val, Cmp >& from)
const {
584 return !SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator==(from);
588 template <
typename Val,
typename Cmp >
589 SharedAVLTreeReverseIteratorSafe< Val, Cmp >&
590 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator++() noexcept {
591 SharedAVLTreeIteratorSafe< Val, Cmp >::operator--();
596 template <
typename Val,
typename Cmp >
597 SharedAVLTreeReverseIteratorSafe< Val, Cmp >&
598 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator+=(
const Size k)
noexcept {
599 SharedAVLTreeIteratorSafe< Val, Cmp >::operator-=(k);
604 template <
typename Val,
typename Cmp >
605 SharedAVLTreeReverseIteratorSafe< Val, Cmp >&
606 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator--() noexcept {
607 SharedAVLTreeIteratorSafe< Val, Cmp >::operator++();
612 template <
typename Val,
typename Cmp >
613 SharedAVLTreeReverseIteratorSafe< Val, Cmp >&
614 SharedAVLTreeReverseIteratorSafe< Val, Cmp >::operator-=(
const Size k)
noexcept {
615 SharedAVLTreeIteratorSafe< Val, Cmp >::operator+=(k);
620 template <
typename Val,
typename Cmp >
621 std::ostream&
operator<<(std::ostream& stream,
const SharedAVLTree< Val, Cmp >& tree) {
622 return stream << tree.toString();
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.
std::ostream & operator<<(std::ostream &out, const TiXmlNode &base)