Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
SortedMultiSet.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
6
8
9 /*
10 ********************************************************************************
11 ************************ SortedMultiSet<T, TRAITS> *****************************
12 ********************************************************************************
13 */
14 template <typename T, typename TRAITS>
17 : SortedMultiSet{less<T>{}}
18 {
19 _AssertRepValidType ();
20 }
21 template <typename T, typename TRAITS>
22 template <Common::ITotallyOrderingComparer<T> COMPARER>
23 inline SortedMultiSet<T, TRAITS>::SortedMultiSet (COMPARER&& comparer)
24 : inherited{Factory::SortedMultiSet_Factory<T, TRAITS, remove_cvref_t<COMPARER>>::Default () (forward<COMPARER> (comparer))}
25 {
26 _AssertRepValidType ();
27 }
28 template <typename T, typename TRAITS>
29 inline SortedMultiSet<T, TRAITS>::SortedMultiSet (const shared_ptr<_IRep>& src) noexcept
30 : inherited{(RequireExpression (src != nullptr), src)}
31 {
32 _AssertRepValidType ();
33 }
34 template <typename T, typename TRAITS>
35 inline SortedMultiSet<T, TRAITS>::SortedMultiSet (shared_ptr<_IRep>&& src) noexcept
36 : inherited{(RequireExpression (src != nullptr), move (src))}
37 {
38 _AssertRepValidType ();
39 }
40 template <typename T, typename TRAITS>
41 SortedMultiSet<T, TRAITS>::SortedMultiSet (const initializer_list<T>& src)
42 requires (Common::ITotallyOrderingComparer<less<T>, T>)
43 : SortedMultiSet{}
44 {
45 this->AddAll (src);
46 _AssertRepValidType ();
47 }
48 template <typename T, typename TRAITS>
49 template <Common::ITotallyOrderingComparer<T> COMPARER>
50 SortedMultiSet<T, TRAITS>::SortedMultiSet (COMPARER&& comparer, const initializer_list<T>& src)
51 : SortedMultiSet{forward<COMPARER> (comparer)}
52 {
53 this->AddAll (src);
54 _AssertRepValidType ();
55 }
56 template <typename T, typename TRAITS>
57 SortedMultiSet<T, TRAITS>::SortedMultiSet (const initializer_list<value_type>& src)
58 requires (Common::ITotallyOrderingComparer<less<T>, T>)
59 : SortedMultiSet{}
60 {
61 this->AddAll (src);
62 _AssertRepValidType ();
63 }
64 template <typename T, typename TRAITS>
65 template <Common::ITotallyOrderingComparer<T> COMPARER>
66 SortedMultiSet<T, TRAITS>::SortedMultiSet (COMPARER&& comparer, const initializer_list<value_type>& src)
67 : SortedMultiSet{forward<COMPARER> (comparer)}
68 {
69 this->AddAll (src);
70 _AssertRepValidType ();
71 }
72#if !qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
73 template <typename T, typename TRAITS>
74 template <IIterableOfTo<typename TRAITS::CountedValueType> ITERABLE_OF_ADDABLE>
75 inline SortedMultiSet<T, TRAITS>::SortedMultiSet (ITERABLE_OF_ADDABLE&& src)
76 requires (Common::ITotallyOrderingComparer<less<T>, T> and not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, SortedMultiSet<T, TRAITS>>)
77 : SortedMultiSet{}
78 {
79 this->AddAll (forward<ITERABLE_OF_ADDABLE> (src));
80 _AssertRepValidType ();
81 }
82#endif
83 template <typename T, typename TRAITS>
84 template <Common::ITotallyOrderingComparer<T> COMPARER, IIterableOfTo<typename TRAITS::CountedValueType> ITERABLE_OF_ADDABLE>
85 inline SortedMultiSet<T, TRAITS>::SortedMultiSet (COMPARER&& comparer, ITERABLE_OF_ADDABLE&& src)
86 : SortedMultiSet{forward<COMPARER> (comparer)}
87 {
88 this->AddAll (forward<ITERABLE_OF_ADDABLE> (src));
89 _AssertRepValidType ();
90 }
91 template <typename T, typename TRAITS>
92 template <IInputIterator<typename TRAITS::CountedValueType> ITERATOR_OF_ADDABLE>
93 SortedMultiSet<T, TRAITS>::SortedMultiSet (ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end)
94 requires (Common::ITotallyOrderingComparer<less<T>, T>)
96 {
97 AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE> (end));
98 _AssertRepValidType ();
99 }
100 template <typename T, typename TRAITS>
101 template <IInputIterator<typename TRAITS::CountedValueType> COMPARER, IInputIterator<typename TRAITS::CountedValueType> ITERATOR_OF_ADDABLE>
102 SortedMultiSet<T, TRAITS>::SortedMultiSet (COMPARER&& comparer, ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end)
103 : SortedMultiSet{forward<COMPARER> (comparer)}
104 {
105 AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE> (end));
106 _AssertRepValidType ();
107 }
108 template <typename T, typename TRAITS>
109 inline void SortedMultiSet<T, TRAITS>::_AssertRepValidType () const
110 {
112 _SafeReadRepAccessor<_IRep>{this};
113 }
114 }
115 template <typename T, typename TRAITS>
117 {
119 _SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().GetElementThreeWayComparer ()};
120 }
121 template <typename T, typename TRAITS>
122 inline auto SortedMultiSet<T, TRAITS>::GetElementThreeWayComparer () const -> ElementThreeWayComparerType
123 {
124 return _SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().GetElementThreeWayComparer ();
125 }
126 template <typename T, typename TRAITS>
127 template <typename RESULT_CONTAINER, invocable<T> ELEMENT_MAPPER>
128 nonvirtual RESULT_CONTAINER SortedMultiSet<T, TRAITS>::Map (ELEMENT_MAPPER&& elementMapper) const
129 requires (convertible_to<invoke_result_t<ELEMENT_MAPPER, typename TRAITS::CountedValueType>, typename RESULT_CONTAINER::value_type> or
130 convertible_to<invoke_result_t<ELEMENT_MAPPER, typename TRAITS::CountedValueType>, optional<typename RESULT_CONTAINER::value_type>>)
131 {
132 if constexpr (same_as<RESULT_CONTAINER, SortedMultiSet>) {
133 // clone the rep so we retain the ordering function
134 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper),
135 RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().CloneEmpty ()});
136 }
137 else {
138 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper)); // default Iterable<> interpretation
139 }
140 }
141 template <typename T, typename TRAITS>
142 template <derived_from<Iterable<typename TRAITS::CountedValueType>> RESULT_CONTAINER, predicate<typename TRAITS::CountedValueType> INCLUDE_PREDICATE>
143 inline RESULT_CONTAINER SortedMultiSet<T, TRAITS>::Where (INCLUDE_PREDICATE&& includeIfTrue) const
144 {
145 if constexpr (same_as<RESULT_CONTAINER, SortedMultiSet>) {
146 // clone the rep so we retain the ordering function
147 return inherited::template Map<RESULT_CONTAINER> (forward<INCLUDE_PREDICATE> (includeIfTrue),
148 RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().CloneEmpty ()});
149 }
150 else {
151 return inherited::template Where<RESULT_CONTAINER> (forward<INCLUDE_PREDICATE> (includeIfTrue)); // default inherited interpretation
152 }
153 }
154 template <typename T, typename TRAITS>
155 inline strong_ordering SortedMultiSet<T, TRAITS>::operator<=> (const SortedMultiSet& rhs) const
156 {
157 return typename Iterable<typename TRAITS::CountedValueType>::SequentialThreeWayComparer{GetElementThreeWayComparer ()}(*this, rhs);
158 }
159
160}
#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)
Use this to wrap any basic comparer, and produce a Less comparer.
Definition Compare.h:386