Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
SortedAssociation.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4
7
9
10 /*
11 ********************************************************************************
12 ************* SortedAssociation<KEY_TYPE, MAPPED_VALUE_TYPE> *******************
13 ********************************************************************************
14 */
15 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
17 requires (ITotallyOrderingComparer<less<KEY_TYPE>, KEY_TYPE>)
18 : SortedAssociation{less<KEY_TYPE>{}}
19 {
20 _AssertRepValidType ();
21 }
22 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
23 template <ITotallyOrderingComparer<KEY_TYPE> KEY_COMPARER>
24 inline SortedAssociation<KEY_TYPE, MAPPED_VALUE_TYPE>::SortedAssociation (KEY_COMPARER&& comparer)
25 : inherited{Factory::SortedAssociation_Factory<KEY_TYPE, MAPPED_VALUE_TYPE, remove_cvref_t<KEY_COMPARER>>::Default () (
26 forward<KEY_COMPARER> (comparer))}
27 {
28 _AssertRepValidType ();
29 }
30 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
31 inline SortedAssociation<KEY_TYPE, MAPPED_VALUE_TYPE>::SortedAssociation (const initializer_list<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>& src)
32 requires (ITotallyOrderingComparer<less<KEY_TYPE>, KEY_TYPE>)
33 : SortedAssociation{}
34 {
35 this->AddAll (src);
36 _AssertRepValidType ();
37 }
38 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
39 template <ITotallyOrderingComparer<KEY_TYPE> KEY_COMPARER>
41 const initializer_list<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>& src)
42 : SortedAssociation{forward<KEY_COMPARER> (comparer)}
43 {
44 this->AddAll (src);
45 _AssertRepValidType ();
46 }
47#if !qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
48 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
49 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
51 requires (ITotallyOrderingComparer<less<KEY_TYPE>, KEY_TYPE> and
52 not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, SortedAssociation<KEY_TYPE, MAPPED_VALUE_TYPE>>)
53 : SortedAssociation{}
54 {
55 _AssertRepValidType ();
56 this->AddAll (forward<ITERABLE_OF_ADDABLE> (src));
57 _AssertRepValidType ();
58 }
59#endif
60 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
61 template <ITotallyOrderingComparer<KEY_TYPE> KEY_COMPARER, IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
62 inline SortedAssociation<KEY_TYPE, MAPPED_VALUE_TYPE>::SortedAssociation (KEY_COMPARER&& comparer, ITERABLE_OF_ADDABLE&& src)
63 : SortedAssociation{forward<KEY_COMPARER> (comparer)}
64 {
65 _AssertRepValidType ();
66 this->AddAll (forward<ITERABLE_OF_ADDABLE> (src));
67 _AssertRepValidType ();
68 }
69 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
70 template <IInputIterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERATOR_OF_ADDABLE>
71 SortedAssociation<KEY_TYPE, MAPPED_VALUE_TYPE>::SortedAssociation (ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end)
72 requires (ITotallyOrderingComparer<less<KEY_TYPE>, KEY_TYPE>)
73 : SortedAssociation{}
74 {
75 this->AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE> (end));
76 _AssertRepValidType ();
77 }
78 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
79 template <ITotallyOrderingComparer<KEY_TYPE> KEY_COMPARER, IInputIterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERATOR_OF_ADDABLE>
80 SortedAssociation<KEY_TYPE, MAPPED_VALUE_TYPE>::SortedAssociation (KEY_COMPARER&& comparer, ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end)
81 : SortedAssociation{forward<KEY_COMPARER> (comparer)}
82 {
83 this->AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE> (end));
84 _AssertRepValidType ();
85 }
86 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
87 inline SortedAssociation<KEY_TYPE, MAPPED_VALUE_TYPE>::SortedAssociation (const shared_ptr<_IRep>& src) noexcept
88 : inherited{(RequireExpression (src != nullptr), src)}
89 {
90 _AssertRepValidType ();
91 }
92 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
93 inline SortedAssociation<KEY_TYPE, MAPPED_VALUE_TYPE>::SortedAssociation (shared_ptr<_IRep>&& src) noexcept
94 : inherited{(RequireExpression (src != nullptr), move (src))}
95 {
96 _AssertRepValidType ();
97 }
98 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
99 inline void SortedAssociation<KEY_TYPE, MAPPED_VALUE_TYPE>::_AssertRepValidType () const
100 {
102 [[maybe_unused]] _SafeReadRepAccessor<_IRep> ignored{this};
103 }
104 }
105 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
107 {
109 _SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().GetKeyThreeWayComparer ()};
110 }
111 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
113 {
114 return _SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().GetKeyThreeWayComparer ();
115 }
116 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
117 template <typename RESULT_CONTAINER, invocable<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ELEMENT_MAPPER>
118 inline RESULT_CONTAINER SortedAssociation<KEY_TYPE, MAPPED_VALUE_TYPE>::Map (ELEMENT_MAPPER&& elementMapper) const
119 requires (convertible_to<invoke_result_t<ELEMENT_MAPPER, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>, typename RESULT_CONTAINER::value_type> or
120 convertible_to<invoke_result_t<ELEMENT_MAPPER, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>, optional<typename RESULT_CONTAINER::value_type>>)
121 {
122 if constexpr (same_as<RESULT_CONTAINER, SortedAssociation>) {
123 // clone the rep so we retain any ordering function/etc, rep type
124 return inherited::template Where<RESULT_CONTAINER> (
125 forward<ELEMENT_MAPPER> (elementMapper), RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().CloneEmpty ()});
126 }
127 else {
128 return inherited::template Where<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper)); // default Iterable<> implementation then...
129 }
130 }
131 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
132 template <derived_from<Iterable<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>> RESULT_CONTAINER, typename INCLUDE_PREDICATE>
133 inline RESULT_CONTAINER SortedAssociation<KEY_TYPE, MAPPED_VALUE_TYPE>::Where (INCLUDE_PREDICATE&& includeIfTrue) const
134 requires (predicate<INCLUDE_PREDICATE, KEY_TYPE> or predicate<INCLUDE_PREDICATE, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>)
135 {
136 if constexpr (same_as<RESULT_CONTAINER, SortedAssociation>) {
137 // clone the rep so we retain any ordering function/etc, rep type
138 return inherited::template Where<RESULT_CONTAINER> (
139 forward<INCLUDE_PREDICATE> (includeIfTrue), RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().CloneEmpty ()});
140 }
141 else {
142 return inherited::template Where<RESULT_CONTAINER> (forward<INCLUDE_PREDICATE> (includeIfTrue)); // default Iterable<> implementation then...
143 }
144 }
145 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
147 {
148 // nb: no need to take into account comparison on values, because total ordering on keys sequences these elements
149 return typename Iterable<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>::SequentialThreeWayComparer{
150 Common::ThreeWayComparerAdapter{GetKeyInOrderComparer ()}}(*this, rhs);
151 }
152
153}
#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(ITERABLE_OF_ADDABLE &&items)
nonvirtual strong_ordering operator<=>(const SortedAssociation &rhs) const
nonvirtual KeyThreeWayComparerType GetKeyThreeWayComparer() const
nonvirtual RESULT_CONTAINER Where(INCLUDE_PREDICATE &&includeIfTrue) const
subset of this SortedAssociation matching filter-function
nonvirtual RESULT_CONTAINER Map(ELEMENT_MAPPER &&elementMapper) const
'override' Iterable<>::Map () function so RESULT_CONTAINER defaults to SortedAssociation,...
nonvirtual KeyInOrderComparerType GetKeyInOrderComparer() 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
Use this to wrap a basic (ITotallyOrderingComparer) comparer, and produce a Three-Way comparer.
Definition Compare.h:414