21 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
22 template <IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
27 _AssertRepValidType ();
29 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
30 template <IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
32 : inherited{Factory::KeyedCollection_Factory<T, KEY_TYPE, TRAITS, remove_cvref_t<KEY_EQUALS_COMPARER>>::Default () (
33 keyExtractor, forward<KEY_EQUALS_COMPARER> (keyComparer))}
35 _AssertRepValidType ();
37 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
43#if !qCompilerAndStdLib_template_Requires_templateDeclarationMatchesOutOfLine2_Buggy
44 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
45 template <IIterableOfTo<T> ITERABLE_OF_ADDABLE, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
47 requires (IKeyedCollection_ExtractorCanBeDefaulted<T, KEY_TYPE, TRAITS> and
48 not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, KeyedCollection<T, KEY_TYPE, TRAITS>>)
51 AddAll (forward<ITERABLE_OF_ADDABLE> (src));
52 _AssertRepValidType ();
55#if !qCompilerAndStdLib_template_Requires_templateDeclarationMatchesOutOfLine2_Buggy
56 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
57 template <IIterableOfTo<T> ITERABLE_OF_ADDABLE, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
59 requires (IKeyedCollection_ExtractorCanBeDefaulted<T, KEY_TYPE, TRAITS> and
60 not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, KeyedCollection<T, KEY_TYPE, TRAITS>>)
61 : KeyedCollection{KeyExtractorType{}, forward<KEY_EQUALS_COMPARER> (keyComparer)}
64 _AssertRepValidType ();
67 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
68 template <IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER, IIterableOfTo<T> ITERABLE_OF_ADDABLE>
70 ITERABLE_OF_ADDABLE&& src)
71 : KeyedCollection{keyExtractor, forward<KEY_EQUALS_COMPARER> (keyComparer)}
74 _AssertRepValidType ();
76 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
77 template <IIterableOfTo<T> ITERABLE_OF_ADDABLE>
79 requires (IEqualsComparer<KEY_TYPE, equal_to<KEY_TYPE>>)
80 : KeyedCollection{keyExtractor, equal_to<KEY_TYPE>{}}
83 _AssertRepValidType ();
85 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
86 template <IInputIterator<T> ITERATOR_OF_ADDABLE, sentinel_for<remove_cvref_t<ITERATOR_OF_ADDABLE>> ITERATOR_OF_ADDABLE2, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
87 KeyedCollection<T, KEY_TYPE, TRAITS>::KeyedCollection (ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE2&& end)
88 requires (IKeyedCollection_ExtractorCanBeDefaulted<T, KEY_TYPE, TRAITS>)
89 : KeyedCollection{KeyExtractorType{}, KEY_EQUALS_COMPARER{}}
91 AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE2> (end));
92 _AssertRepValidType ();
94 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
95 template <IInputIterator<T> ITERATOR_OF_ADDABLE, sentinel_for<remove_cvref_t<ITERATOR_OF_ADDABLE>> ITERATOR_OF_ADDABLE2, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
96 KeyedCollection<T, KEY_TYPE, TRAITS>::KeyedCollection (KEY_EQUALS_COMPARER&& keyComparer, ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE2&& end)
97 requires (IKeyedCollection_ExtractorCanBeDefaulted<T, KEY_TYPE, TRAITS>)
98 : KeyedCollection{KeyExtractorType{}, forward<KEY_EQUALS_COMPARER> (keyComparer)}
100 AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE2> (end));
101 _AssertRepValidType ();
103 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
104 template <IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER, IInputIterator<T> ITERATOR_OF_ADDABLE, sentinel_for<remove_cvref_t<ITERATOR_OF_ADDABLE>> ITERATOR_OF_ADDABLE2>
105 KeyedCollection<T, KEY_TYPE, TRAITS>::KeyedCollection (
const KeyExtractorType& keyExtractor, KEY_EQUALS_COMPARER&& keyComparer,
106 ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE2&& end)
107 : KeyedCollection{keyExtractor, forward<KEY_EQUALS_COMPARER> (keyComparer)}
109 AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE2> (
end));
110 _AssertRepValidType ();
112 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
116 _AssertRepValidType ();
118 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
122 _AssertRepValidType ();
124 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
127 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().GetKeyExtractor ();
129 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
132 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().GetKeyEqualityComparer ();
134 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
137 return this->
template Map<Iterable<KEY_TYPE>> ([keyExtractor = this->GetKeyExtractor ()] (
const T& t) {
return keyExtractor (t); });
139 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
142 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key,
nullptr);
144 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
147 _SafeReadRepAccessor<_IRep> r{
this};
148 return r._ConstGetRep ().Lookup (r._ConstGetRep ().GetKeyExtractor () (elt),
nullptr);
150 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
154 [[maybe_unused]]
bool result = _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key, &r);
155 Ensure (result == r.has_value ());
158 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
161 if (item ==
nullptr) {
162 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key,
nullptr);
165 optional<value_type> tmp;
166 if (_SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key, &tmp)) {
173 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
176 if (item ==
nullptr) {
177 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key,
nullptr);
180 optional<value_type> tmp;
181 if (_SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key, &tmp)) {
188 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
191 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key,
nullptr);
193 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
194 template <
typename THROW_IF_MISSING>
197 if (optional<value_type> r{Lookup (key)}) [[likely]] {
202 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
205 optional<value_type> r{Lookup (key)};
206 return r.has_value () ? *r : defaultValue;
208 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
211 return _SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().Add (t);
213 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
214 template <IInputIterator<T> ITERATOR_OF_ADDABLE, sentinel_for<remove_cvref_t<ITERATOR_OF_ADDABLE>> ITERATOR_OF_ADDABLE2>
217 unsigned int cntAdded{};
218 _SafeReadWriteRepAccessor<_IRep> r{
this};
219 for (
auto i = forward<ITERATOR_OF_ADDABLE> (start); i != forward<ITERATOR_OF_ADDABLE2> (end); ++i) {
220 if (r._GetWriteableRep ().Add (*i)) {
226 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
227 template <IIterableOfTo<T> ITERABLE_OF_ADDABLE>
230 if constexpr (same_as<remove_cvref_t<ITERABLE_OF_ADDABLE>, KeyedCollection>) {
232 if (
this != &items) {
233 return AddAll (std::begin (items), std::end (items));
238 return AddAll (std::begin (items), std::end (items));
241 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
244 Verify (_SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().RemoveIf (key));
246 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
249 _SafeReadWriteRepAccessor<_IRep> writeAccessor{
this};
250 Verify (writeAccessor._GetWriteableRep ().RemoveIf (writeAccessor._ConstGetRep ().GetKeyExtractor () (elt)));
252 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
255 Require (not i.
Done ());
256 auto [writerRep, patchedIterator] = _GetWritableRepAndPatchAssociatedIterator (i);
257 writerRep->Remove (patchedIterator, nextI);
259 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
262 return _SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().RemoveIf (key);
264 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
267 _SafeReadWriteRepAccessor<_IRep> r{
this};
268 return r._GetWriteableRep ().Remove (r._ConstGetRep ().GetKeyExtractor () (elt));
270 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
271 inline void KeyedCollection<T, KEY_TYPE, TRAITS>::RemoveAll ()
273 _SafeReadRepAccessor<_IRep> tmp{
this};
274 if (not tmp._ConstGetRep ().empty ()) {
275 this->_fRep = tmp._ConstGetRep ().CloneEmpty ();
278 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
279 template <predicate<T> PREDICATE>
280 size_t KeyedCollection<T, KEY_TYPE, TRAITS>::RemoveAll (PREDICATE&& p)
283 for (Iterator<T> i = this->begin (); i != this->end ();) {
294 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
295 template <IIterableOfTo<T> ITERABLE_OF_ADDABLE>
296 inline size_t KeyedCollection<T, KEY_TYPE, TRAITS>::RemoveAll (
const ITERABLE_OF_ADDABLE& items)
299 for (
const auto& i : items) {
305 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
306 template <IInputIterator<T> ITERATOR_OF_ADDABLE>
310 for (
auto i = forward<ITERATOR_OF_ADDABLE> (start); i != end; ++i) {
316 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
317 template <
typename RESULT_CONTAINER, invocable<T> ELEMENT_MAPPER>
319 requires (convertible_to<invoke_result_t<ELEMENT_MAPPER, T>,
typename RESULT_CONTAINER::value_type> or
320 convertible_to<invoke_result_t<ELEMENT_MAPPER, T>, optional<typename RESULT_CONTAINER::value_type>>)
322 if constexpr (same_as<RESULT_CONTAINER, KeyedCollection>) {
324 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper),
325 RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().CloneEmpty ()});
328 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper));
331 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
332 template <derived_from<Iterable<T>> RESULT_CONTAINER, predicate<T> INCLUDE_PREDICATE>
335 if constexpr (same_as<RESULT_CONTAINER, KeyedCollection>) {
337 return inherited::template Where<RESULT_CONTAINER> (
338 forward<INCLUDE_PREDICATE> (includeIfTrue), RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().CloneEmpty ()});
341 return inherited::template Where<RESULT_CONTAINER> (forward<INCLUDE_PREDICATE> (includeIfTrue));
344 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
349 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
352 return EqualsComparer{}(*
this, rhs);
354 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
360 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
366 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
372 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
378 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
383 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
388 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
392 this->Remove (i, &nextI);
395 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
397 -> tuple<_IRep*, Iterator<value_type>>
399 Require (not i.Done ());
400 using element_type =
typename inherited::_SharedByValueRepType::element_type;
402 element_type* writableRep = this->_fRep.rwget ([&] (
const element_type& prevRepPtr) ->
typename inherited::_SharedByValueRepType::shared_ptr_type {
403 return Debug::UncheckedDynamicCast<const _IRep&> (prevRepPtr).CloneAndPatchIterator (&patchedIterator);
406 return make_tuple (Debug::UncheckedDynamicCast<_IRep*> (writableRep), move (patchedIterator));
408 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
412 [[maybe_unused]] _SafeReadRepAccessor<_IRep> ignored{
this};
421 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
422 inline bool KeyedCollection<T, KEY_TYPE, TRAITS>::EqualsComparer::operator() (
const KeyedCollection& lhs,
const KeyedCollection& rhs)
const
424 return operator() (lhs,
static_cast<const Iterable<T>&
> (rhs));
426 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
427 bool KeyedCollection<T, KEY_TYPE, TRAITS>::EqualsComparer::operator() (
const KeyedCollection& lhs,
const Iterable<value_type>& rhs)
const
429 _SafeReadRepAccessor<_IRep> lhsR{&lhs};
430 _SafeReadRepAccessor<_IRep> rhsR{&rhs};
431 if (&lhsR._ConstGetRep () == &rhsR._ConstGetRep ()) {
436 if (lhsR._ConstGetRep ().size () != rhsR._ConstGetRep ().size ()) {
446 for (
const auto& ri : rhs) {
447 if (not lhs.Contains (ri)) {
453 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
454 inline bool KeyedCollection<T, KEY_TYPE, TRAITS>::EqualsComparer::operator() (
const Iterable<value_type>& lhs,
const KeyedCollection& rhs)
const
456 return operator() (rhs, lhs);
#define qStroika_Foundation_Debug_AssertionsChecked
The qStroika_Foundation_Debug_AssertionsChecked flag determines if assertions are checked and validat...
#define RequireExpression(c)
a cross between Mapping<KEY, T> and Collection<T> and Set<T>
nonvirtual KeyedCollection & operator+=(ArgByValueType< value_type > item)
nonvirtual bool operator==(const KeyedCollection &rhs) const
nonvirtual value_type LookupValue(ArgByValueType< KeyType > key, ArgByValueType< value_type > defaultValue=value_type{}) const
nonvirtual void erase(ArgByValueType< value_type > item)
typename inherited::value_type value_type
nonvirtual bool Add(ArgByValueType< value_type > item)
nonvirtual KeyedCollection & operator-=(ArgByValueType< value_type > item)
nonvirtual bool Contains(ArgByValueType< KeyType > item) const
nonvirtual KeyExtractorType GetKeyExtractor() const
nonvirtual bool RemoveIf(ArgByValueType< KeyType > item)
nonvirtual RESULT_CONTAINER Where(INCLUDE_PREDICATE &&includeIfTrue) const
KeyedCollection(KEY_EQUALS_COMPARER &&keyComparer=KEY_EQUALS_COMPARER{})
nonvirtual KeyEqualityComparerType GetKeyEqualityComparer() const
typename TRAITS::KeyExtractorType KeyExtractorType
nonvirtual void Remove(const Iterator< value_type > &i, const Iterator< value_type > *nextI=nullptr)
Remove the argument value (which must exist) from the KeyedCollection.
nonvirtual tuple< _IRep *, Iterator< value_type > > _GetWritableRepAndPatchAssociatedIterator(const Iterator< value_type > &i)
Utility to get WRITABLE underlying shared_ptr (replacement for what we normally do - _SafeReadWriteRe...
nonvirtual unsigned int AddAll(ITERATOR_OF_ADDABLE &&start, ITERATOR_OF_ADDABLE2 &&end)
nonvirtual optional< value_type > Lookup(ArgByValueType< KeyType > key) const
nonvirtual RESULT_CONTAINER Map(ELEMENT_MAPPER &&elementMapper) const
'override' Iterable<>::Map () function so RESULT_CONTAINER defaults to KeyedCollection,...
nonvirtual value_type LookupChecked(ArgByValueType< KeyType > key, THROW_IF_MISSING &&throwIfMissing) const
nonvirtual Iterable< KeyType > Keys() const
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.
static constexpr default_sentinel_t end() noexcept
Support for ranged for, and STL syntax in general.
An Iterator<T> is a copyable object which allows traversing the contents of some container....
nonvirtual bool Done() const
Done () means there is nothing left in this iterator (a synonym for (it == container....
void Throw(T &&e2Throw)
identical to builtin C++ 'throw' except that it does helpful, type dependent DbgTrace() messages firs...