4#include "Stroika/Foundation/Containers/DataStructures/Array.h"
5#include "Stroika/Foundation/Containers/Private/IteratorImplHelper.h"
13 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
14 template <qCompilerAndStdLib_Constra
intDiffersInTemplateRedeclaration_BWA (IEqualsComparer<KEY_TYPE>) KEY_EQUALS_COMPARER>
15 class KeyedCollection_Array<T, KEY_TYPE, TRAITS>::Rep_ :
public Private::ArrayBasedContainerRepImpl<Rep_<KEY_EQUALS_COMPARER>, IImplRepBase_>,
16 public Memory::UseBlockAllocationIfAppropriate<Rep_<KEY_EQUALS_COMPARER>> {
18 using inherited = Private::ArrayBasedContainerRepImpl<Rep_<KEY_EQUALS_COMPARER>, IImplRepBase_>;
25 Rep_ (
const KeyExtractorType& keyExtractor,
const KEY_EQUALS_COMPARER& keyComparer)
26 : fKeyExtractor_{keyExtractor}
27 , fKeyComparer_{keyComparer}
30 Rep_ (
const Rep_& from) =
default;
33 nonvirtual Rep_& operator= (
const Rep_&) =
delete;
37 virtual shared_ptr<typename Iterable<T>::_IRep> Clone ()
const override
40 return Memory::MakeSharedPtr<Rep_> (*
this);
42 virtual Iterator<value_type> MakeIterator ()
const override
45 return Iterator<value_type>{make_unique<IteratorRep_> (&fData_, &fChangeCounts_)};
48 virtual optional<span<const value_type>> PeekContiguousStorage ()
const override
51 return span<const value_type>{fData_.data (), fData_.size ()};
53 virtual size_t size ()
const override
56 return fData_.size ();
58 virtual bool empty ()
const override
61 return fData_.empty ();
63 virtual void Apply (
const function<
void (ArgByValueType<value_type> item)>& doToElement, [[maybe_unused]]
Execution::SequencePolicy seq)
const override
66 fData_.Apply (doToElement);
68 virtual Iterator<value_type> Find ([[maybe_unused]]
bool findFirst,
const function<
bool (ArgByValueType<value_type> item)>& that,
72 if (
auto i = fData_.Find (that)) {
73 return Iterator<value_type>{make_unique<IteratorRep_> (&fChangeCounts_, i)};
80 virtual KeyExtractorType GetKeyExtractor ()
const override
83 return fKeyExtractor_;
85 virtual KeyEqualityComparerType GetKeyEqualityComparer ()
const override
90 virtual shared_ptr<typename KeyedCollection<T, KEY_TYPE, TRAITS>::_IRep> CloneEmpty ()
const override
93 return Memory::MakeSharedPtr<Rep_> (this->fKeyExtractor_, this->fKeyComparer_);
95 virtual shared_ptr<typename KeyedCollection<T, KEY_TYPE, TRAITS>::_IRep> CloneAndPatchIterator (Iterator<value_type>* i)
const override
99 auto result = Memory::MakeSharedPtr<Rep_> (*
this);
100 auto& mir = Debug::UncheckedDynamicCast<const IteratorRep_&> (i->ConstGetRep ());
101 result->fData_.MoveIteratorHereAfterClone (&mir.fIterator, &fData_);
105 virtual bool Lookup (ArgByValueType<KeyType> key, optional<value_type>* item)
const override
108 if (
auto i = this->Find (
110 if (item !=
nullptr) {
117 virtual bool Add (ArgByValueType<value_type> item)
override
120 KEY_TYPE key{fKeyExtractor_ (item)};
121 if (
auto i = this->Find (
123 const IteratorRep_& iteratorRep = Debug::UncheckedDynamicCast<const IteratorRep_&> (i.ConstGetRep ());
124 fData_.SetAt (iteratorRep.fIterator, item);
125 fChangeCounts_.PerformedChange ();
129 fData_.push_back (item);
130 fChangeCounts_.PerformedChange ();
134 virtual void Remove (
const Iterator<value_type>& i, Iterator<value_type>* nextI)
override
137 const IteratorRep_& iteratorRep = Debug::UncheckedDynamicCast<const IteratorRep_&> (i.ConstGetRep ());
138 if (nextI ==
nullptr) {
139 fData_.Remove (iteratorRep.fIterator);
140 fChangeCounts_.PerformedChange ();
143 auto retI = fData_.erase (iteratorRep.fIterator);
144 fChangeCounts_.PerformedChange ();
145 *nextI = Iterator<value_type>{make_unique<IteratorRep_> (&fChangeCounts_, retI)};
148 virtual bool RemoveIf (ArgByValueType<KEY_TYPE> key)
override
151 if (
auto i = this->Find (
160 using DataStructureImplType_ = DataStructures::Array<value_type>;
161 using IteratorRep_ =
typename Private::IteratorImplHelper_<value_type, DataStructureImplType_>;
164 DataStructureImplType_ fData_;
176 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
177 template <IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
182 AssertRepValidType_ ();
184 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
185 template <IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
187 : inherited{Memory::MakeSharedPtr<Rep_<KEY_EQUALS_COMPARER>> (keyExtractor, forward<KEY_EQUALS_COMPARER> (keyComparer))}
189 AssertRepValidType_ ();
191#if !qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
192 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
193 template <IIterableOfTo<T> ITERABLE_OF_ADDABLE, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
195 not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, KeyedCollection_Array<T, KEY_TYPE, TRAITS>>)
197 : KeyedCollection_Array{KeyExtractorType{}, equal_to<KEY_TYPE>{}}
200 AssertRepValidType_ ();
203 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
204 template <IIterableOfTo<T> ITERABLE_OF_ADDABLE, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
206 requires (IKeyedCollection_ExtractorCanBeDefaulted<T, KEY_TYPE, TRAITS>)
207 : KeyedCollection_Array{KeyExtractorType{}, forward<KEY_EQUALS_COMPARER> (keyComparer)}
210 AssertRepValidType_ ();
212 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
213 template <IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER, IIterableOfTo<T> ITERABLE_OF_ADDABLE>
215 KEY_EQUALS_COMPARER&& keyComparer, ITERABLE_OF_ADDABLE&& src)
216 : KeyedCollection_Array{keyExtractor, forward<KEY_EQUALS_COMPARER> (keyComparer)}
219 AssertRepValidType_ ();
221 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
222 template <IInputIterator<T> ITERATOR_OF_ADDABLE, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
224 requires (IKeyedCollection_ExtractorCanBeDefaulted<T, KEY_TYPE, TRAITS>)
225 : KeyedCollection_Array{KeyExtractorType{}, KEY_EQUALS_COMPARER{}}
227 this->AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE> (end));
228 AssertRepValidType_ ();
230 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
231 template <IInputIterator<T> ITERATOR_OF_ADDABLE, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
233 ITERATOR_OF_ADDABLE&& end)
234 requires (IKeyedCollection_ExtractorCanBeDefaulted<T, KEY_TYPE, TRAITS>)
235 : KeyedCollection_Array{KeyExtractorType{}, forward<KEY_EQUALS_COMPARER> (keyComparer)}
237 this->AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE> (end));
238 AssertRepValidType_ ();
240 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
241 template <IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER, IInputIterator<T> ITERATOR_OF_ADDABLE>
243 ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end)
244 : KeyedCollection_Array{keyExtractor, forward<KEY_EQUALS_COMPARER> (keyComparer)}
246 this->AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE> (end));
247 AssertRepValidType_ ();
249 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
250 inline void KeyedCollection_Array<T, KEY_TYPE, TRAITS>::AssertRepValidType_ ()
const
253 typename inherited::template _SafeReadRepAccessor<IImplRepBase_> tmp{
this};
#define qStroika_Foundation_Debug_AssertionsChecked
The qStroika_Foundation_Debug_AssertionsChecked flag determines if assertions are checked and validat...
#define RequireNotNull(p)
#define qStroika_ATTRIBUTE_NO_UNIQUE_ADDRESS
qStroika_ATTRIBUTE_NO_UNIQUE_ADDRESS - used for the attribute [[no_unique_address]]
#define qStroika_ATTRIBUTE_NO_UNIQUE_ADDRESS_VCFORCE
[[msvc::no_unique_address]] isn't always broken in MSVC. Annotate with this on things where its not b...
KeyedCollection_Array<T> is an Array-based concrete implementation of the KeyedCollection<T> containe...
KeyedCollection_Array(KEY_EQUALS_COMPARER &&keyComparer=KEY_EQUALS_COMPARER{})
unique_lock< AssertExternallySynchronizedChecker > WriteContext
Instantiate AssertExternallySynchronizedChecker::WriteContext to designate an area of code where prot...
shared_lock< const AssertExternallySynchronizedChecker > ReadContext
Instantiate AssertExternallySynchronizedChecker::ReadContext to designate an area of code where prote...
SequencePolicy
equivalent which of 4 types being used std::execution::sequenced_policy, parallel_policy,...
@ eSeq
default case - not parallelized