Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
SortedSet.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
6
8
9 /*
10 ********************************************************************************
11 ********************************** SortedSet<T> ********************************
12 ********************************************************************************
13 */
14 template <typename T>
16 requires (ITotallyOrderingComparer<less<T>, T>)
17 : SortedSet{less<T>{}}
18 {
19 _AssertRepValidType ();
20 }
21 template <typename T>
22 template <ITotallyOrderingComparer<T> COMPARER>
23 inline SortedSet<T>::SortedSet (COMPARER&& comparer)
24 : inherited{Factory::SortedSet_Factory<T, remove_cvref_t<COMPARER>>::Default () (forward<COMPARER> (comparer))}
25 {
26 _AssertRepValidType ();
27 }
28 template <typename T>
29 inline SortedSet<T>::SortedSet (const shared_ptr<_IRep>& src) noexcept
30 : inherited{(RequireExpression (src != nullptr), src)}
31 {
32 _AssertRepValidType ();
33 }
34 template <typename T>
35 inline SortedSet<T>::SortedSet (shared_ptr<_IRep>&& src) noexcept
36 : inherited{(RequireExpression (src != nullptr), move (src))}
37 {
38 _AssertRepValidType ();
39 }
40 template <typename T>
41 inline SortedSet<T>::SortedSet (const initializer_list<T>& src)
42 requires (ITotallyOrderingComparer<less<T>, T>)
43 : SortedSet{}
44 {
45 this->AddAll (src);
46 _AssertRepValidType ();
47 }
48 template <typename T>
49 template <ITotallyOrderingComparer<T> COMPARER>
50 inline SortedSet<T>::SortedSet (COMPARER&& comparer, const initializer_list<T>& src)
51 : SortedSet{forward<COMPARER> (comparer)}
52 {
53 this->AddAll (src);
54 _AssertRepValidType ();
55 }
56#if !qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
57 template <typename T>
58 template <IIterableOfTo<T> ITERABLE_OF_ADDABLE>
59 inline SortedSet<T>::SortedSet (ITERABLE_OF_ADDABLE&& src)
60 requires (ITotallyOrderingComparer<less<T>, T> and not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, SortedSet<T>>)
61 : SortedSet{}
62 {
63 this->AddAll (forward<ITERABLE_OF_ADDABLE> (src));
64 _AssertRepValidType ();
65 }
66#endif
67 template <typename T>
68 template <ITotallyOrderingComparer<T> COMPARER, IIterableOfTo<T> ITERABLE_OF_ADDABLE>
69 inline SortedSet<T>::SortedSet (COMPARER&& comparer, ITERABLE_OF_ADDABLE&& src)
70 : SortedSet (forward<COMPARER> (comparer))
71 {
72 this->AddAll (forward<ITERABLE_OF_ADDABLE> (src));
73 _AssertRepValidType ();
74 }
75 template <typename T>
76 template <IInputIterator<T> ITERATOR_OF_ADDABLE, sentinel_for<remove_cvref_t<ITERATOR_OF_ADDABLE>> ITERATOR_OF_ADDABLE2>
77 inline SortedSet<T>::SortedSet (ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE2&& end)
78 requires (ITotallyOrderingComparer<less<T>, T>)
79 : SortedSet{}
80 {
81 this->AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE2> (end));
82 _AssertRepValidType ();
83 }
84 template <typename T>
85 template <ITotallyOrderingComparer<T> COMPARER, IInputIterator<T> ITERATOR_OF_ADDABLE>
86 inline SortedSet<T>::SortedSet (COMPARER&& comparer, ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end)
87 : SortedSet{forward<COMPARER> (comparer)}
88 {
89 this->AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE> (end));
90 _AssertRepValidType ();
91 }
92 template <typename T>
93 inline void SortedSet<T>::_AssertRepValidType () const
94 {
96 _SafeReadRepAccessor<_IRep>{this};
97 }
98 }
99 template <typename T>
101 {
102 return Common::InOrderComparerAdapter<T, ElementInOrderComparerType>{_SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().GetElementInOrderComparer ()};
103 }
104 template <typename T>
106 {
107 return _SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().GetElementThreeWayComparer ();
108 }
109 template <typename T>
110 inline strong_ordering SortedSet<T>::operator<=> (const SortedSet& rhs) const
111 {
112 return typename Iterable<T>::template SequentialThreeWayComparer<ElementThreeWayComparerType>{GetElementThreeWayComparer ()}(*this, rhs);
113 }
114 template <typename T>
115 template <typename RESULT_CONTAINER, invocable<T> ELEMENT_MAPPER>
116 inline RESULT_CONTAINER SortedSet<T>::Map (ELEMENT_MAPPER&& elementMapper) const
117 requires (convertible_to<invoke_result_t<ELEMENT_MAPPER, T>, typename RESULT_CONTAINER::value_type> or
118 convertible_to<invoke_result_t<ELEMENT_MAPPER, T>, optional<typename RESULT_CONTAINER::value_type>>)
119 {
120 if constexpr (same_as<RESULT_CONTAINER, SortedSet>) {
121 // clone the rep so we retain the ordering function
122 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper),
123 RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().CloneEmpty ()});
124 }
125 else {
126 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper)); // default Iterable<> interpretation
127 }
128 }
129 template <typename T>
130 template <derived_from<Iterable<T>> RESULT_CONTAINER, predicate<T> INCLUDE_PREDICATE>
131 inline RESULT_CONTAINER SortedSet<T>::Where (INCLUDE_PREDICATE&& includeIfTrue) const
132 {
133 if constexpr (same_as<RESULT_CONTAINER, SortedSet>) {
134 // clone the rep so we retain the ordering function
135 return inherited::template Where<RESULT_CONTAINER> (
136 forward<INCLUDE_PREDICATE> (includeIfTrue), RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().CloneEmpty ()});
137 }
138 else {
139 return inherited::template Where<RESULT_CONTAINER> (forward<INCLUDE_PREDICATE> (includeIfTrue)); // default Iterable<> interpretation
140 }
141 }
142
143}
#define qStroika_Foundation_Debug_AssertionsChecked
The qStroika_Foundation_Debug_AssertionsChecked flag determines if assertions are checked and validat...
Definition Assertions.h:48
#define RequireExpression(c)
Definition Assertions.h:267
nonvirtual void AddAll(ITERATOR_OF_ADDABLE &&start, ITERATOR_OF_ADDABLE2 &&end)
nonvirtual RESULT_CONTAINER Map(ELEMENT_MAPPER &&elementMapper) const
'override' Iterable<>::Map () function so RESULT_CONTAINER defaults to SortedSet, and improve that ca...
nonvirtual ElementInOrderComparerType GetElementInOrderComparer() const
nonvirtual ElementThreeWayComparerType GetElementThreeWayComparer() const
nonvirtual strong_ordering operator<=>(const SortedSet &rhs) const
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.
Definition Iterable.h:237
static constexpr default_sentinel_t end() noexcept
Support for ranged for, and STL syntax in general.
Use this to wrap any basic comparer, and produce a Less comparer.
Definition Compare.h:386