Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
SortedMapping.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4
7
9
10 /*
11 ********************************************************************************
12 **************** SortedMapping<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 : SortedMapping{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 SortedMapping<KEY_TYPE, MAPPED_VALUE_TYPE>::SortedMapping (KEY_COMPARER&& keyComparer)
25 : inherited{Factory::SortedMapping_Factory<KEY_TYPE, MAPPED_VALUE_TYPE, remove_cvref_t<KEY_COMPARER>>::Default () (forward<KEY_COMPARER> (keyComparer))}
26 {
27 _AssertRepValidType ();
28 }
29 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
30 inline SortedMapping<KEY_TYPE, MAPPED_VALUE_TYPE>::SortedMapping (const initializer_list<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>& src)
31 requires (ITotallyOrderingComparer<less<KEY_TYPE>, KEY_TYPE>)
32 : SortedMapping{}
33 {
34 this->AddAll (src);
35 _AssertRepValidType ();
36 }
37 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
38 template <ITotallyOrderingComparer<KEY_TYPE> KEY_COMPARER>
39 inline SortedMapping<KEY_TYPE, MAPPED_VALUE_TYPE>::SortedMapping (KEY_COMPARER&& keyComparer,
40 const initializer_list<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>& src)
41 : SortedMapping{forward<KEY_COMPARER> (keyComparer)}
42 {
43 this->AddAll (src);
44 _AssertRepValidType ();
45 }
46#if !qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
47 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
48 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
49 inline SortedMapping<KEY_TYPE, MAPPED_VALUE_TYPE>::SortedMapping (ITERABLE_OF_ADDABLE&& src)
50 requires (ITotallyOrderingComparer<less<KEY_TYPE>, KEY_TYPE> and
51 not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, SortedMapping<KEY_TYPE, MAPPED_VALUE_TYPE>>)
52 : SortedMapping{}
53 {
54 _AssertRepValidType ();
55 this->AddAll (forward<ITERABLE_OF_ADDABLE> (src));
56 _AssertRepValidType ();
57 }
58#endif
59 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
60 template <ITotallyOrderingComparer<KEY_TYPE> KEY_COMPARER, IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
61 inline SortedMapping<KEY_TYPE, MAPPED_VALUE_TYPE>::SortedMapping (KEY_COMPARER&& keyComparer, ITERABLE_OF_ADDABLE&& src)
62 : SortedMapping{forward<KEY_COMPARER> (keyComparer)}
63 {
64 _AssertRepValidType ();
65 this->AddAll (forward<ITERABLE_OF_ADDABLE> (src));
66 _AssertRepValidType ();
67 }
68 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
69 template <IInputIterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERATOR_OF_ADDABLE>
70 SortedMapping<KEY_TYPE, MAPPED_VALUE_TYPE>::SortedMapping (ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end)
71 requires (ITotallyOrderingComparer<less<KEY_TYPE>, KEY_TYPE>)
72 : SortedMapping{}
73 {
74 this->AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE> (end));
75 _AssertRepValidType ();
76 }
77 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
78 template <ITotallyOrderingComparer<KEY_TYPE> KEY_COMPARER, IInputIterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERATOR_OF_ADDABLE>
79 SortedMapping<KEY_TYPE, MAPPED_VALUE_TYPE>::SortedMapping (KEY_COMPARER&& keyComparer, ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end)
80 : SortedMapping{forward<KEY_COMPARER> (keyComparer)}
81 {
82 this->AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE> (end));
83 _AssertRepValidType ();
84 }
85 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
86 inline SortedMapping<KEY_TYPE, MAPPED_VALUE_TYPE>::SortedMapping (const shared_ptr<_IRep>& src) noexcept
87 : inherited{(RequireExpression (src != nullptr), src)}
88 {
89 _AssertRepValidType ();
90 }
91 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
92 inline SortedMapping<KEY_TYPE, MAPPED_VALUE_TYPE>::SortedMapping (shared_ptr<_IRep>&& src) noexcept
93 : inherited{(RequireExpression (src != nullptr), move (src))}
94 {
95 _AssertRepValidType ();
96 }
97 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
98 inline void SortedMapping<KEY_TYPE, MAPPED_VALUE_TYPE>::_AssertRepValidType () const
99 {
101 [[maybe_unused]] _SafeReadRepAccessor<_IRep> ignored{this};
102 }
103 }
104 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
106 {
108 _SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().GetKeyThreeWayComparer ()};
109 }
110 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
112 {
113 return _SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().GetKeyThreeWayComparer ();
114 }
115 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
116 template <typename RESULT_CONTAINER, invocable<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ELEMENT_MAPPER>
117 inline RESULT_CONTAINER SortedMapping<KEY_TYPE, MAPPED_VALUE_TYPE>::Map (ELEMENT_MAPPER&& elementMapper) const
118 requires (convertible_to<invoke_result_t<ELEMENT_MAPPER, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>, typename RESULT_CONTAINER::value_type> or
119 convertible_to<invoke_result_t<ELEMENT_MAPPER, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>, optional<typename RESULT_CONTAINER::value_type>>)
120 {
121 if constexpr (same_as<RESULT_CONTAINER, SortedMapping>) {
122 // clone the rep so we retain any ordering function/etc, rep type
123 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper),
124 RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().CloneEmpty ()});
125 }
126 else {
127 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper)); // default Iterable<> implementation then...
128 }
129 }
130 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
131 template <derived_from<Iterable<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>> RESULT_CONTAINER, typename INCLUDE_PREDICATE>
132 inline RESULT_CONTAINER SortedMapping<KEY_TYPE, MAPPED_VALUE_TYPE>::Where (INCLUDE_PREDICATE&& includeIfTrue) const
133 requires (predicate<INCLUDE_PREDICATE, KEY_TYPE> or predicate<INCLUDE_PREDICATE, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>)
134 {
135 if constexpr (same_as<RESULT_CONTAINER, SortedMapping>) {
136 // clone the rep so we retain any ordering function/etc, rep type
137 return inherited::template Where<RESULT_CONTAINER> (
138 forward<INCLUDE_PREDICATE> (includeIfTrue), RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{this}._ConstGetRep ().CloneEmpty ()});
139 }
140 else {
141 return inherited::template Where<RESULT_CONTAINER> (forward<INCLUDE_PREDICATE> (includeIfTrue));
142 }
143 }
144 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
146 {
147 // Iterate over both mappings at the same time, only looking at the keys. If any two elements are !=,
148 // then use the value as a tie-breaker
150 return SeqCmp{}(*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 unsigned int AddAll(ITERABLE_OF_ADDABLE &&items, AddReplaceMode addReplaceMode=AddReplaceMode::eAddReplaces)
nonvirtual strong_ordering operator<=>(const SortedMapping &rhs) const
nonvirtual RESULT_CONTAINER Where(INCLUDE_PREDICATE &&includeIfTrue) const
subset of this SortedMapping matching filter-function
nonvirtual KeyInOrderComparerType GetKeyInOrderComparer() const
nonvirtual RESULT_CONTAINER Map(ELEMENT_MAPPER &&elementMapper) const
'override' Iterable<>::Map () function so RESULT_CONTAINER defaults to SortedMapping,...
nonvirtual KeyThreeWayComparerType GetKeyThreeWayComparer() 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