Advertisement
OMEGAHEAD_MonkoX

Untitled

May 4th, 2023
20
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.42 KB | None | 0 0
  1. #ifndef __TREE_H__
  2. #define __TREE_H__
  3.  
  4. #include <initializer_list>
  5. #include <memory>
  6. #include <chrono>
  7. #include <optional>
  8.  
  9. #include "base_container.h"
  10. #include "tree_node.h"
  11. #include "errors.h"
  12. #include "bst_iterator.hpp"
  13. #include "reverse_bst_iterator.h"
  14.  
  15. using namespace std;
  16.  
  17. template <Comparable T>
  18. class tree : public base_container
  19. {
  20. public:
  21.  
  22. using value_type = T;
  23. using iterator = bst_iterator<T>;
  24. using const_iterator = bst_iterator<T>;
  25. using reverse_iterator = reverse_bst_iterator<T>;
  26.  
  27. tree() noexcept;
  28.  
  29. template<Comparable U>
  30. requires Convertable<U, T>
  31. explicit tree(tree<U> &tree);
  32.  
  33. explicit tree(tree<T> &tree);
  34.  
  35. tree(tree<T> &&tree) noexcept;
  36.  
  37. template<Comparable U>
  38. requires Convertable<U, T>
  39. tree(initializer_list<U> list);
  40.  
  41. template<Comparable U>
  42. requires Convertable<U, T>
  43. explicit tree(const U& value);
  44.  
  45. template<input_iterator Iter>
  46. tree(const Iter &begin, const Iter &end);
  47.  
  48. template<Comparable U>
  49. requires Convertable<U, T>
  50. tree(const size_t &size, U const *arr);
  51.  
  52. template <Container C>
  53. requires Convertable<typename C::value_type, T>
  54. tree(const C &container);
  55.  
  56. ~tree() = default;
  57.  
  58. template <Container C>
  59. requires Convertable<typename C::value_type, T>
  60. tree<T> &operator = (const C &container);
  61. tree<T> &operator = (tree<T> &&tree) noexcept;
  62. tree<T> &operator = (const tree<T> &tree);
  63.  
  64. template<Comparable U>
  65. requires Convertable<U, T>
  66. tree<T> &operator = (initializer_list<U> list);
  67.  
  68. virtual bool is_empty() const noexcept;
  69. void clear();
  70.  
  71. template<Comparable U>
  72. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  73. tree<T> &merge(const tree<U> &tree) const;
  74. template<Comparable U>
  75. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  76. tree<T> operator + (const tree<T> &tree) const;
  77. template<Comparable U>
  78. requires Convertable<U, T>
  79. tree<T> &operator += (const tree<T> &tree);
  80.  
  81. template<Comparable U>
  82. requires Convertable<U, T>
  83. bool insert(const U& value);
  84.  
  85. const optional<bst_iterator<T>> find(const T& value) const;
  86. bool delete_node(const T& value);
  87. bool delete_node(bst_iterator<T> &iter);
  88.  
  89. template<Comparable U>
  90. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  91. tree<T> union_trees(const tree<U> &other) const;
  92. template<Comparable U>
  93. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  94. tree<T> operator | (const tree<U> &tree) const;
  95. tree<T> &operator |= (const tree<T> &tree);
  96.  
  97. template<Comparable U>
  98. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  99. tree<T> intersection_trees(const tree<U> &other) const;
  100. template<Comparable U>
  101. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  102. tree<T> operator & (const tree<U> &tree) const;
  103. tree<T> &operator &= (const tree<T> &tree);
  104.  
  105. template<Comparable U>
  106. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  107. tree<T> difference_trees(const tree<U> &other) const;
  108. template<Comparable U>
  109. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  110. tree<T> operator / (const tree<U> &tree) const;
  111. tree<T> &operator /= (const tree<T> &tree);
  112.  
  113. template<Comparable U>
  114. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  115. tree<T> symdifference_trees(const tree<U> &other) const;
  116. template<Comparable U>
  117. requires Convertable<T, Larger<T, U>> && Convertable<U, Larger<T, U>>
  118. tree<T> operator ^ (const tree<U> &tree) const;
  119. tree<T> &operator ^= (const tree<T> &tree);
  120.  
  121. bool operator == (const tree<T> &tree) const noexcept;
  122. bool operator != (const tree<T> &tree) const noexcept;
  123.  
  124. iterator begin() const noexcept;
  125. iterator end() const noexcept;
  126. reverse_iterator rbegin() const noexcept;
  127. reverse_iterator rend() const noexcept;
  128.  
  129. virtual size_t size() const noexcept override;
  130.  
  131. protected:
  132. shared_ptr<tree_node<T>> get_head() const noexcept;
  133.  
  134. void set_size(int value) noexcept;
  135. void reset_size() noexcept;
  136. void increment_size() noexcept;
  137. void decrement_size() noexcept;
  138.  
  139. bool insert(shared_ptr<tree_node<T>> _node);
  140.  
  141. private:
  142. shared_ptr<tree_node<T>> head;
  143. };
  144.  
  145. #include "tree.hpp"
  146.  
  147. #endif
  148.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement