55 template <
typename TYPE,
56 typename HASH = hash<TYPE>,
57 typename ALLOC = allocator<couple<const TYPE, const bool>>>
59 public set<TYPE, ALLOC>,
100 u_integer bucket = 0, hashNode* node =
nullptr);
136 [[nodiscard]] std::string
className()
const override;
159 [[nodiscard]]
bool hasNext()
const override;
164 [[nodiscard]]
bool hasPrev()
const override;
183 void next()
const override;
188 void prev()
const override;
199 const TYPE&
get()
override;
205 const TYPE
get()
const override;
210 void set(
const TYPE& data)
override;
216 [[nodiscard]]
bool isValid()
const override;
226 explicit hashSet(HASH
hash = HASH{}, ALLOC alloc = ALLOC{});
234 hashSet(
const hashSet& other);
243 hashSet&
operator=(
const hashSet& other);
251 hashSet(hashSet&& other)
noexcept;
261 hashSet&
operator=(hashSet&& other)
noexcept;
274 bool contains(
const TYPE &e)
const override;
281 bool add(
const TYPE &e)
override;
288 bool remove(
const TYPE &e)
override;
294 Iterator*
begins()
const override;
300 Iterator*
ends()
const override;
306 [[nodiscard]] std::string
className()
const override;
313 [[nodiscard]] std::string
toString(
bool enter)
const override;
343 template <
typename TYPE,
344 typename Compare = increaseComparator<TYPE>,
345 typename ALLOC = allocator<couple<const TYPE, const bool>>>
347 public set<TYPE, ALLOC>,
415 [[nodiscard]] std::string
className()
const override;
438 [[nodiscard]]
bool hasNext()
const override;
444 [[nodiscard]]
bool hasPrev()
const override;
463 void next()
const override;
468 void prev()
const override;
480 const TYPE&
get()
override;
486 const TYPE
get()
const override;
492 void set(
const TYPE& data)
override;
498 [[nodiscard]]
bool isValid()
const override;
518 treeSet(
const treeSet& other);
527 treeSet&
operator=(
const treeSet& other);
535 treeSet(treeSet&& other)
noexcept;
545 treeSet&
operator=(treeSet&& other)
noexcept;
558 bool contains(
const TYPE &e)
const override;
565 bool add(
const TYPE &e)
override;
572 bool remove(
const TYPE &e)
override;
578 Iterator*
begins()
const override;
584 Iterator*
ends()
const override;
590 [[nodiscard]] std::string
className()
const override;
597 [[nodiscard]] std::string
toString(
bool enter)
const override;
607template<
typename TYPE,
typename HASH,
typename ALLOC>
609u_integer bucket, hashNode *node) : hashTable<TYPE, const bool, ALLOC, HASH>::Iterator(
610 const_cast<vector<hashNode*, rebind_alloc_pointer>*>(buckets), bucket, node) {}
612template<
typename TYPE,
typename HASH,
typename ALLOC>
614 auto other_it =
dynamic_cast<const Iterator*
>(other);
616 this->p_buckets == other_it->p_buckets &&
617 this->cur_bucket == other_it->cur_bucket &&
618 this->p_node == other_it->p_node;
621template<
typename TYPE,
typename HASH,
typename ALLOC>
626template<
typename TYPE,
typename HASH,
typename ALLOC>
629 if (
this == &other) {
637template<
typename TYPE,
typename HASH,
typename ALLOC>
643template<
typename TYPE,
typename HASH,
typename ALLOC>
645 return "hashSet::Iterator";
648template<
typename TYPE,
typename HASH,
typename ALLOC>
653template<
typename TYPE,
typename HASH,
typename ALLOC>
658template<
typename TYPE,
typename HASH,
typename ALLOC>
664template<
typename TYPE,
typename HASH,
typename ALLOC>
669template<
typename TYPE,
typename HASH,
typename ALLOC>
674template<
typename TYPE,
typename HASH,
typename ALLOC>
676 auto other_it =
dynamic_cast<const Iterator*
>(other);
680 auto next =
ownerPtr(this->clone());
681 if (!next->isValid()){
686 return next->equalPtr(other_it);
689template<
typename TYPE,
typename HASH,
typename ALLOC>
691 return other->
atPrev(*
this);
694template<
typename TYPE,
typename HASH,
typename ALLOC>
699template<
typename TYPE,
typename HASH,
typename ALLOC>
704template<
typename TYPE,
typename HASH,
typename ALLOC>
710template<
typename TYPE,
typename HASH,
typename ALLOC>
715template<
typename TYPE,
typename HASH,
typename ALLOC>
720template<
typename TYPE,
typename HASH,
typename ALLOC>
725template<
typename TYPE,
typename HASH,
typename ALLOC>
730template<
typename TYPE,
typename HASH,
typename ALLOC>
733 set<TYPE, ALLOC>(std::move(alloc)) {}
735template<
typename TYPE,
typename HASH,
typename ALLOC>
740template<
typename TYPE,
typename HASH,
typename ALLOC>
743 if (
this == &other) {
747 this->buckets = this->bucketsCopy(other.buckets);
748 this->size_ = other.size_;
749 if constexpr(ALLOC::propagate_on_container_copy_assignment::value) {
751 this->rebind_alloc = other.rebind_alloc;
756template<
typename TYPE,
typename HASH,
typename ALLOC>
758 this->operator=(std::move(other));
761template<
typename TYPE,
typename HASH,
typename ALLOC>
764 if (
this == &other) {
768 this->buckets = std::move(other.buckets);
769 this->size_ = other.size_;
771 if constexpr(ALLOC::propagate_on_container_move_assignment::value) {
772 this->
allocator = std::move(other.allocator);
773 this->rebind_alloc = std::move(other.rebind_alloc);
778template<
typename TYPE,
typename HASH,
typename ALLOC>
783template<
typename TYPE,
typename HASH,
typename ALLOC>
785 return this->find(e);
788template<
typename TYPE,
typename HASH,
typename ALLOC>
790 return this->insert(e,
true);
793template<
typename TYPE,
typename HASH,
typename ALLOC>
795 return this->erase(e);
798template<
typename TYPE,
typename HASH,
typename ALLOC>
802 if (this->buckets[0]) {
803 return new Iterator(p_buckets, 0, this->buckets[0]);
805 auto bucket = Iterator::findNextValidBucket(p_buckets, 0);
806 return new Iterator(p_buckets, bucket, p_buckets->get(bucket));
809template<
typename TYPE,
typename HASH,
typename ALLOC>
813 auto bucket = Iterator::findPrevValidBucket(p_buckets, this->buckets.size());
814 auto node = this->buckets[bucket];
815 while (node && node->getPNext()) {
816 node = node->getPNext();
818 return new Iterator(p_buckets, bucket, node);
821template<
typename TYPE,
typename HASH,
typename ALLOC>
826template<
typename TYPE,
typename HASH,
typename ALLOC>
828 std::stringstream ss;
829 ss << this->className();
832 for (
auto it = this->begin(); it != this->end(); it.next()){
845template<
typename TYPE,
typename HASH,
typename ALLOC>
848template <
typename TYPE,
typename Compare,
typename ALLOC>
850 : RBTreeType::Iterator(tree, cur) {}
852template <
typename TYPE,
typename Compare,
typename ALLOC>
855 auto other_it =
dynamic_cast<const Iterator*
>(other);
857 this->tree_ == other_it->tree_ &&
858 this->cur_ == other_it->cur_;
861template <
typename TYPE,
typename Compare,
typename ALLOC>
868template <
typename TYPE,
typename Compare,
typename ALLOC>
872 if (
this == &other) {
876 this->tree_ = other.
tree_;
877 this->cur_ = other.
cur_;
881template <
typename TYPE,
typename Compare,
typename ALLOC>
888template <
typename TYPE,
typename Compare,
typename ALLOC>
891 return "treeSet::Iterator";
894template <
typename TYPE,
typename Compare,
typename ALLOC>
897 RBTreeType::Iterator::operator+=(steps);
900template <
typename TYPE,
typename Compare,
typename ALLOC>
903 RBTreeType::Iterator::operator-=(steps);
906template <
typename TYPE,
typename Compare,
typename ALLOC>
913template <
typename TYPE,
typename Compare,
typename ALLOC>
916 return RBTreeType::Iterator::hasNext();
919template <
typename TYPE,
typename Compare,
typename ALLOC>
922 return RBTreeType::Iterator::hasPrev();
925template <
typename TYPE,
typename Compare,
typename ALLOC>
928 auto other_it =
dynamic_cast<const Iterator*
>(other);
932 auto next =
ownerPtr(this->clone());
933 if (!next->isValid()){
938 return next->equalPtr(other_it);
941template <
typename TYPE,
typename Compare,
typename ALLOC>
944 return other->
atNext(*
this);
947template <
typename TYPE,
typename Compare,
typename ALLOC>
950 RBTreeType::Iterator::next();
953template <
typename TYPE,
typename Compare,
typename ALLOC>
956 RBTreeType::Iterator::prev();
959template <
typename TYPE,
typename Compare,
typename ALLOC>
963 auto it = this->clone();
968template <
typename TYPE,
typename Compare,
typename ALLOC>
971 return RBTreeType::Iterator::get().template get<0>();
974template <
typename TYPE,
typename Compare,
typename ALLOC>
977 return RBTreeType::Iterator::get().template get<0>();
980template <
typename TYPE,
typename Compare,
typename ALLOC>
986template <
typename TYPE,
typename Compare,
typename ALLOC>
989 return RBTreeType::Iterator::isValid();
992template<
typename TYPE,
typename Compare,
typename ALLOC>
995 set<TYPE, ALLOC>(std::move(alloc)) {}
997template<
typename TYPE,
typename Compare,
typename ALLOC>
1002template<
typename TYPE,
typename Compare,
typename ALLOC>
1005 if (
this == &other){
1009 this->destroyTree();
1010 this->root_ = other.treeCopy();
1011 this->size_ = other.size_;
1012 if constexpr(ALLOC::propagate_on_container_copy_assignment::value) {
1014 this->rebind_alloc = other.rebind_alloc;
1019template<
typename TYPE,
typename Compare,
typename ALLOC>
1021 this->operator=(std::move(other));
1024template<
typename TYPE,
typename Compare,
typename ALLOC>
1027 if (
this == &other){
1031 this->root_ = other.root_;
1032 other.root_ =
nullptr;
1033 this->size_ = other.size_;
1035 if constexpr(ALLOC::propagate_on_container_move_assignment::value) {
1036 this->
allocator = std::move(other.allocator);
1037 this->rebind_alloc = std::move(other.rebind_alloc);
1042template<
typename TYPE,
typename Compare,
typename ALLOC>
1047template<
typename TYPE,
typename Compare,
typename ALLOC>
1049 return this->find(e);
1052template<
typename TYPE,
typename Compare,
typename ALLOC>
1054 return this->insert(e,
true);
1057template<
typename TYPE,
typename Compare,
typename ALLOC>
1059 return this->erase(e);
1062template <
typename TYPE,
typename Compare,
typename ALLOC>
1069template <
typename TYPE,
typename Compare,
typename ALLOC>
1076template<
typename TYPE,
typename Compare,
typename ALLOC>
1081template<
typename TYPE,
typename Compare,
typename ALLOC>
1083 std::stringstream ss;
1084 ss << this->className();
1087 for (
auto it = this->begin(); it != this->end(); it.next()){
1100template<
typename TYPE,
typename Compare,
typename ALLOC>
Red-Black Tree implementation header.
Memory allocation interface and implementations.
Bidirectional iterator for RBTree.
Definition RBTree.h:219
RBNode * cur_
Current node.
Definition RBTree.h:222
RBTree * tree_
Owning tree.
Definition RBTree.h:221
Internal node class for Red-Black Tree.
Definition RBTree.h:51
Red-Black Tree container implementation.
Definition RBTree.h:40
Default memory allocator using allocators utilities.
Definition allocator.h:154
A base class for basic iterators.
Definition iterator.h:296
Forward iterator for hashSet.
Definition sets.h:90
bool atNext(const iterator< const TYPE > *other) const override
Checks if other is next to this.
Definition sets.h:690
bool hasNext() const override
Checks if more elements exist.
Definition sets.h:665
void operator-=(integer steps) const override
Not supported (throws unSupportedMethodError)
Definition sets.h:654
void next() const override
Moves to next element.
Definition sets.h:695
bool atPrev(const iterator< const TYPE > *other) const override
Checks if other is previous to this.
Definition sets.h:675
Iterator * clone() const override
Creates a copy of this iterator.
Definition sets.h:639
bool hasPrev() const override
Not supported (throws unSupportedMethodError)
Definition sets.h:670
void set(const TYPE &data) override
Not supported (throws unSupportedMethodError)
Definition sets.h:721
Iterator * getPrev() const override
Not supported (throws unSupportedMethodError)
Definition sets.h:706
Iterator & operator=(const Iterator &other)
Copy assignment operator.
Definition sets.h:628
bool isValid() const override
Checks if iterator is valid.
Definition sets.h:726
const TYPE & get() override
Gets current element (non-const)
Definition sets.h:711
std::string className() const override
Gets iterator class name.
Definition sets.h:644
void prev() const override
Not supported (throws unSupportedMethodError)
Definition sets.h:700
void operator+=(integer steps) const override
Advances iterator by steps.
Definition sets.h:649
Hash table based implementation of the set interface.
Definition sets.h:61
std::string className() const override
Gets class name.
Definition sets.h:822
u_integer size() const override
Gets number of elements.
Definition sets.h:779
hashSet(HASH hash=HASH{}, ALLOC alloc=ALLOC{})
Constructs empty hashSet.
Definition sets.h:731
bool add(const TYPE &e) override
Adds new element.
Definition sets.h:789
std::string toString(bool enter) const override
Converts to string representation.
Definition sets.h:827
bool remove(const TYPE &e) override
Removes element.
Definition sets.h:794
bool contains(const TYPE &e) const override
Checks if element exists.
Definition sets.h:784
hashSet & operator=(const hashSet &other)
Copy assignment operator.
Definition sets.h:742
Iterator * ends() const override
Gets end iterator.
Definition sets.h:811
Iterator * begins() const override
Gets begin iterator.
Definition sets.h:800
void next() const
Advances to the next element.
Definition hashTable.h:634
couple< const K_TYPE, V_TYPE > & get()
Gets current key-value pair (non-const)
Definition hashTable.h:668
Iterator & operator=(const Iterator &other)
Copy assignment operator.
Definition hashTable.h:615
void operator+=(integer steps) const
Advances iterator by steps positions.
Definition hashTable.h:656
bool isValid() const
Checks if iterator points to valid element.
Definition hashTable.h:687
bool hasNext() const
Checks if more elements are available.
Definition hashTable.h:625
Internal node type for hash table storage.
Definition hashTable.h:71
Hash table implementation with separate chaining.
Definition hashTable.h:55
typename ALLOC::template rebind_alloc< hashNode * > rebind_alloc_pointer
Rebound allocator type for pointer storage.
Definition hashTable.h:174
Forward declaration of hash class template.
Definition hash.h:80
A base class for iterable containers that support multiple iteration patterns.
Definition iterable.h:59
Base iterator interface that supports common operations for iteration.
Definition iterator.h:37
virtual bool atNext(const iterator *other) const =0
Checks if this iterator is positioned at the next element.
virtual bool atPrev(const iterator *other) const =0
Checks if this iterator is positioned at the previous element.
friend iterator< T > * operator-(const iterator< T > &it, integer steps)
Subtracts a number of steps from the iterator's current position and returns a new iterator.
Unique ownership smart pointer with move semantics.
Definition ownerPtr.h:30
Base class providing polymorphic string conversion capabilities.
Definition printable.h:29
static std::string formatString(const TYPE &t)
Universal value-to-string conversion.
Abstract base class for unique element containers.
Definition set.h:44
Bidirectional iterator for treeSet.
Definition sets.h:373
bool isValid() const override
Checks if iterator is valid.
Definition sets.h:987
void next() const override
Moves to next element.
Definition sets.h:948
bool atPrev(const iterator< const TYPE > *other) const override
Checks if other is previous to this.
Definition sets.h:926
void operator-=(integer steps) const override
Rewinds iterator by steps.
Definition sets.h:901
const TYPE & get() override
Gets current element (non-const)
Definition sets.h:969
void set(const TYPE &data) override
Not supported.
Definition sets.h:981
std::string className() const override
Gets iterator class name.
Definition sets.h:889
bool atNext(const iterator< const TYPE > *other) const override
Checks if other is next to this.
Definition sets.h:942
void operator+=(integer steps) const override
Advances iterator by steps.
Definition sets.h:895
Iterator & operator=(const Iterator &other)
Copy assignment operator.
Definition sets.h:870
void prev() const override
Moves to previous element.
Definition sets.h:954
bool hasNext() const override
Checks if more elements exist in forward direction.
Definition sets.h:914
bool hasPrev() const override
Checks if more elements exist in backward direction.
Definition sets.h:920
Iterator * getPrev() const override
Gets previous iterator.
Definition sets.h:961
Iterator * clone() const override
Creates a copy of this iterator.
Definition sets.h:883
Red-Black Tree based implementation of the set interface.
Definition sets.h:349
bool contains(const TYPE &e) const override
Checks if element exists.
Definition sets.h:1048
bool remove(const TYPE &e) override
Removes element.
Definition sets.h:1058
treeSet(Compare comp=Compare{}, ALLOC alloc=ALLOC{})
Constructs empty treeSet.
Definition sets.h:993
treeSet & operator=(const treeSet &other)
Copy assignment operator.
Definition sets.h:1004
Iterator * ends() const override
Gets end iterator.
Definition sets.h:1071
~treeSet() override
Destructor.
std::string className() const override
Gets class name.
Definition sets.h:1077
Iterator * begins() const override
Gets begin iterator.
Definition sets.h:1064
bool add(const TYPE &e) override
Adds new element.
Definition sets.h:1053
u_integer size() const override
Gets number of elements.
Definition sets.h:1043
std::string toString(bool enter) const override
Converts to string representation.
Definition sets.h:1082
Exception for unimplemented method calls.
Definition error.h:123
Dynamic array container with amortized constant time operations.
Definition vector.h:43
Comparator base class and concrete comparator classes.
Combines Comparable and CallbackOf for comparison callbacks.
Definition types.h:92
Generic pair container implementation.
Implementation of hashTable container.
Provides a generic hashing utility and a base interface for hashable types.
Main namespace for the project Original.
Definition algorithms.h:21
std::uint32_t u_integer
32-bit unsigned integer type for sizes and indexes
Definition config.h:43
std::int64_t integer
64-bit signed integer type for arithmetic operations
Definition config.h:35
Exclusive-ownership smart pointer implementation.
Abstract base class for set container implementations.