Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
SortedKeyedCollection.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4
7
9
10 /*
11 ********************************************************************************
12 **************** SortedKeyedCollection<T, KEY_TYPE, TRAITS> ********************
13 ********************************************************************************
14 */
15 template <typename T, typename KEY_TYPE, typename TRAITS>
16 template <ITotallyOrderingComparer<KEY_TYPE> KEY_COMPARER>
19 : SortedKeyedCollection{KeyExtractorType{}, forward<KEY_COMPARER> (keyComparer)}
20 {
21 _AssertRepValidType ();
22 }
23 template <typename T, typename KEY_TYPE, typename TRAITS>
24 template <ITotallyOrderingComparer<KEY_TYPE> KEY_COMPARER>
25 SortedKeyedCollection<T, KEY_TYPE, TRAITS>::SortedKeyedCollection (const KeyExtractorType& keyExtractor, KEY_COMPARER&& keyComparer)
26 : inherited (Factory::SortedKeyedCollection_Factory<T, KEY_TYPE, TRAITS, remove_cvref_t<KEY_COMPARER>>::Default () (
27 keyExtractor, forward<KEY_COMPARER> (keyComparer)))
28 {
29 _AssertRepValidType ();
30 }
31#if !qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
32 template <typename T, typename KEY_TYPE, typename TRAITS>
33 template <IIterableOfTo<T> ITERABLE_OF_ADDABLE, ITotallyOrderingComparer<KEY_TYPE> KEY_COMPARER>
35 requires (IKeyedCollection_ExtractorCanBeDefaulted<T, KEY_TYPE, TRAITS> and
36 not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, SortedKeyedCollection<T, KEY_TYPE, TRAITS>>)
37 : SortedKeyedCollection{}
38 {
39 this->AddAll (src);
40 _AssertRepValidType ();
41 }
42#endif
43 template <typename T, typename KEY_TYPE, typename TRAITS>
44 template <IIterableOfTo<T> ITERABLE_OF_ADDABLE, ITotallyOrderingComparer<KEY_TYPE> KEY_COMPARER>
45 inline SortedKeyedCollection<T, KEY_TYPE, TRAITS>::SortedKeyedCollection (KEY_COMPARER&& keyComparer, ITERABLE_OF_ADDABLE&& src)
46 requires (IKeyedCollection_ExtractorCanBeDefaulted<T, KEY_TYPE, TRAITS>)
47 {
48 this->AddAll (src);
49 _AssertRepValidType ();
50 }
51 template <typename T, typename KEY_TYPE, typename TRAITS>
52 template <ITotallyOrderingComparer<KEY_TYPE> KEY_COMPARER, IIterableOfTo<T> ITERABLE_OF_ADDABLE>
53 inline SortedKeyedCollection<T, KEY_TYPE, TRAITS>::SortedKeyedCollection (const KeyExtractorType& keyExtractor,
54 KEY_COMPARER&& keyComparer, ITERABLE_OF_ADDABLE&& src)
55 : SortedKeyedCollection{keyExtractor, forward<KEY_COMPARER> (keyComparer)}
56 {
57 this->AddAll (src);
58 _AssertRepValidType ();
59 }
60 template <typename T, typename KEY_TYPE, typename TRAITS>
61 template <IInputIterator<T> ITERATOR_OF_ADDABLE, ITotallyOrderingComparer<KEY_TYPE> KEY_COMPARER>
62 inline SortedKeyedCollection<T, KEY_TYPE, TRAITS>::SortedKeyedCollection (ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end)
63 requires (IKeyedCollection_ExtractorCanBeDefaulted<T, KEY_TYPE, TRAITS>)
64 : SortedKeyedCollection{KeyExtractorType{}, KEY_COMPARER{}}
65 {
66 this->AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE> (end));
67 _AssertRepValidType ();
68 }
69 template <typename T, typename KEY_TYPE, typename TRAITS>
70 template <IInputIterator<T> ITERATOR_OF_ADDABLE, ITotallyOrderingComparer<KEY_TYPE> KEY_COMPARER>
71 inline SortedKeyedCollection<T, KEY_TYPE, TRAITS>::SortedKeyedCollection (KEY_COMPARER&& keyComparer, ITERATOR_OF_ADDABLE&& start,
72 ITERATOR_OF_ADDABLE&& end)
73 requires (IKeyedCollection_ExtractorCanBeDefaulted<T, KEY_TYPE, TRAITS>)
74 : SortedKeyedCollection{KeyExtractorType{}, forward<KEY_COMPARER> (keyComparer)}
75 {
76 this->AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE> (end));
77 _AssertRepValidType ();
78 }
79 template <typename T, typename KEY_TYPE, typename TRAITS>
80 template <ITotallyOrderingComparer<KEY_TYPE> KEY_COMPARER, IInputIterator<T> ITERATOR_OF_ADDABLE>
81 inline SortedKeyedCollection<T, KEY_TYPE, TRAITS>::SortedKeyedCollection (const KeyExtractorType& keyExtractor, KEY_COMPARER&& keyComparer,
82 ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end)
83 : SortedKeyedCollection{keyExtractor, forward<KEY_COMPARER> (keyComparer)}
84 {
85 this->AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE> (end));
86 _AssertRepValidType ();
87 }
88 template <typename T, typename KEY_TYPE, typename TRAITS>
89 inline SortedKeyedCollection<T, KEY_TYPE, TRAITS>::SortedKeyedCollection (const shared_ptr<_IRep>& src) noexcept
90 : inherited{src}
91 {
92 RequireNotNull (src);
93 _AssertRepValidType ();
94 }
95 template <typename T, typename KEY_TYPE, typename TRAITS>
96 inline SortedKeyedCollection<T, KEY_TYPE, TRAITS>::SortedKeyedCollection (shared_ptr<_IRep>&& src) noexcept
97 : inherited{(RequireExpression (src != nullptr), move (src))}
98 {
99 _AssertRepValidType ();
100 }
101 template <typename T, typename KEY_TYPE, typename TRAITS>
102 inline void SortedKeyedCollection<T, KEY_TYPE, TRAITS>::_AssertRepValidType () const
103 {
105 _SafeReadRepAccessor<_IRep>{this};
106 }
107 }
108 template <typename T, typename KEY_TYPE, typename TRAITS>
109 inline auto SortedKeyedCollection<T, KEY_TYPE, TRAITS>::GetInOrderKeyComparer () const -> KeyInOrderComparerType
110 {
111 return _SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().GetThreeWayKeyComparer ();
112 }
113 template <typename T, typename KEY_TYPE, typename TRAITS>
114 inline auto SortedKeyedCollection<T, KEY_TYPE, TRAITS>::GetThreeWayKeyComparer () const -> KeyThreeWayComparerType
115 {
116 return _SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().GetThreeWayKeyComparer ();
117 }
118 template <typename T, typename KEY_TYPE, typename TRAITS>
119 template <typename RESULT_CONTAINER, invocable<T> ELEMENT_MAPPER>
120 inline RESULT_CONTAINER SortedKeyedCollection<T, KEY_TYPE, TRAITS>::Map (ELEMENT_MAPPER&& elementMapper) const
121 requires (convertible_to<invoke_result_t<ELEMENT_MAPPER, T>, typename RESULT_CONTAINER::value_type> or
122 convertible_to<invoke_result_t<ELEMENT_MAPPER, T>, optional<typename RESULT_CONTAINER::value_type>>)
123 {
124 if constexpr (same_as<RESULT_CONTAINER, SortedKeyedCollection>) {
125 // clone the rep so we retain the ordering function etc
126 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper),
127 RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().CloneEmpty ()});
128 }
129 else {
130 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper)); // default inherited interpretation
131 }
132 }
133 template <typename T, typename KEY_TYPE, typename TRAITS>
134 template <derived_from<Iterable<T>> RESULT_CONTAINER, predicate<T> INCLUDE_PREDICATE>
135 inline RESULT_CONTAINER SortedKeyedCollection<T, KEY_TYPE, TRAITS>::Where (INCLUDE_PREDICATE&& includeIfTrue) const
136 {
137 if constexpr (same_as<RESULT_CONTAINER, SortedKeyedCollection>) {
138 // clone the rep so we retain the ordering function etc
139 return inherited::template Where<RESULT_CONTAINER> (
140 forward<INCLUDE_PREDICATE> (includeIfTrue), RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().CloneEmpty ()});
141 }
142 else {
143 return inherited::template Where<RESULT_CONTAINER> (forward<INCLUDE_PREDICATE> (includeIfTrue)); // default inherited interpretation
144 }
145 }
146
147}
#define qStroika_Foundation_Debug_AssertionsChecked
The qStroika_Foundation_Debug_AssertionsChecked flag determines if assertions are checked and validat...
Definition Assertions.h:48
#define RequireNotNull(p)
Definition Assertions.h:347
#define RequireExpression(c)
Definition Assertions.h:267
nonvirtual unsigned int AddAll(ITERATOR_OF_ADDABLE &&start, ITERATOR_OF_ADDABLE2 &&end)
A SortedKeyedCollection is a KeyedCollection<T> which remains sorted (iteration produces items sorted...
nonvirtual RESULT_CONTAINER Where(INCLUDE_PREDICATE &&includeIfTrue) const
subset of this SortedKeyedCollection matching filter-function
nonvirtual RESULT_CONTAINER Map(ELEMENT_MAPPER &&elementMapper) const
'override' Iterable<>::Map () function so RESULT_CONTAINER defaults to SortedKeyedCollection,...
SortedKeyedCollection(KEY_COMPARER &&keyComparer=KEY_COMPARER{})
static constexpr default_sentinel_t end() noexcept
Support for ranged for, and STL syntax in general.