7#include "Stroika/Foundation/Containers/Private/IteratorImplHelper.h"
18 template <
typename T,
typename... INDEXES>
19 class SparseDataHyperRectangle_stdmap<T, INDEXES...>::Rep_ :
public DataHyperRectangle<T, INDEXES...>::_IRep,
20 public Memory::UseBlockAllocationIfAppropriate<Rep_> {
29 Rep_ (
const Rep_&
from) =
default;
32 nonvirtual Rep_& operator= (
const Rep_&) =
delete;
39 return Memory::MakeSharedPtr<Rep_> (*
this);
46 virtual size_t size ()
const override
49 return fData_.size ();
51 virtual bool empty ()
const override
54 return fData_.empty ();
66 auto iLink =
const_cast<DataStructureImplType_&
> (fData_).
Find (
68 if (
iLink == fData_.end ()) {
69 return RESULT_TYPE::GetEmptyIterator ();
81 return Memory::MakeSharedPtr<Rep_> (fDefaultValue_);
87 if (i != fData_.end ()) {
90 return fDefaultValue_;
95 if (v == fDefaultValue_) {
97 if (i != fData_.end ()) {
102#if qCompilerAndStdLib_template_map_tuple_insert_Buggy
106 Assert (i != fData_.end ());
113 fChangeCounts_.PerformedChange ();
118 template <
typename PATCHABLE_CONTAINER,
typename PATCHABLE_CONTAINER_ITERATOR =
typename PATCHABLE_CONTAINER::ForwardIterator>
119 class MyIteratorImplHelper_
120 :
public Iterator<tuple<T, INDEXES...>>::IRep,
121 public Memory::UseBlockAllocationIfAppropriate<MyIteratorImplHelper_<PATCHABLE_CONTAINER, PATCHABLE_CONTAINER_ITERATOR>> {
123 using inherited =
typename Iterator<tuple<T, INDEXES...>>::IRep;
126 MyIteratorImplHelper_ () =
delete;
127 MyIteratorImplHelper_ (
const MyIteratorImplHelper_&) =
default;
128 explicit MyIteratorImplHelper_ (
const PATCHABLE_CONTAINER* data,
129 [[maybe_unused]]
const Private::ContainerDebugChangeCounts_* changeCounter =
nullptr)
136 virtual ~MyIteratorImplHelper_ () =
default;
140 virtual unique_ptr<inherited> Clone ()
const override
142 return make_unique<MyIteratorImplHelper_> (*
this);
144 virtual bool AtEnd ()
const override
146 return fIterator.AtEnd ();
148 virtual optional<tuple<T, INDEXES...>> Current ()
const override
150 if (fIterator.AtEnd ()) [[unlikely]] {
154 auto tmp = *fIterator;
155 return tuple_cat (tuple<T>{tmp.second}, tmp.first);
158 virtual optional<tuple<T, INDEXES...>> More ()
override
160 Require (not fIterator.AtEnd ());
162 if (fIterator.AtEnd ()) [[unlikely]] {
166 auto tmp = *fIterator;
167 return tuple_cat (tuple<T>{tmp.second}, tmp.first);
170 virtual bool Equals (
const typename Iterator<tuple<T, INDEXES...>>::IRep* rhs)
const override
173 using ActualIterImplType_ = MyIteratorImplHelper_<PATCHABLE_CONTAINER, PATCHABLE_CONTAINER_ITERATOR>;
174 const ActualIterImplType_* rrhs = Debug::UncheckedDynamicCast<const ActualIterImplType_*> (rhs);
176 return fIterator == rrhs->fIterator;
180 mutable PATCHABLE_CONTAINER_ITERATOR fIterator;
184 using DataStructureImplType_ = DataStructures::STLContainerWrapper<map<
tuple<
INDEXES...>, T>>;
189 DataStructureImplType_ fData_;
198 template <
typename T,
typename... INDEXES>
200 :
inherited{Memory::MakeSharedPtr<Rep_> (defaultItem)}
202 AssertRepValidType_ ();
204 template <
typename T,
typename... INDEXES>
206 : inherited{static_cast<const inherited&> (src)}
208 AssertRepValidType_ ();
210 template <
typename T,
typename... INDEXES>
211 inline SparseDataHyperRectangle_stdmap<T, INDEXES...>&
212 SparseDataHyperRectangle_stdmap<T, INDEXES...>::operator= (
const SparseDataHyperRectangle_stdmap<T, INDEXES...>& rhs)
214 AssertRepValidType_ ();
215 inherited::operator= (
static_cast<const inherited&
> (rhs));
216 AssertRepValidType_ ();
219 template <
typename T,
typename... INDEXES>
220 inline void SparseDataHyperRectangle_stdmap<T, INDEXES...>::AssertRepValidType_ ()
const
223 typename inherited::template _SafeReadRepAccessor<Rep_> tmp{
this};
#define qStroika_Foundation_Debug_AssertionsChecked
The qStroika_Foundation_Debug_AssertionsChecked flag determines if assertions are checked and validat...
#define RequireNotNull(p)
bool Equals(const T *lhs, const T *rhs)
strcmp or wsccmp() as appropriate == 0
#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...
SparseDataHyperRectangle_stdmap<T, INDEXES...> is an Dense Vector-based concrete implementation of th...
SparseDataHyperRectangle_stdmap(Common::ArgByValueType< T > defaultItem={})
STDMAP is std::map<> that can be used inside SparseDataHyperRectangle_stdmap.
nonvirtual void SetAt(INDEXES... indexes, Common::ArgByValueType< T > v)
DataHyperRectangle(const DataHyperRectangle< T, INDEXES... > &src) noexcept
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...
nonvirtual Iterator< T > Find(THAT_FUNCTION &&that) const
Run the argument bool-returning function (or lambda) on the elements of the container,...
nonvirtual CONTAINER_OF_T As(CONTAINER_OF_T_CONSTRUCTOR_ARGS... args) const
nonvirtual size_t size() const
Returns the number of items contained.
nonvirtual void Apply(const function< void(ArgByValueType< T > item)> &doToElement) const
Run the argument function (or lambda) on each element of the container.
Iterable(const Iterable &) noexcept=default
Iterable are safely copyable (by value). Since Iterable uses COW, this just copies the underlying poi...
nonvirtual bool empty() const
Returns true iff size() == 0.
nonvirtual Iterator< T > MakeIterator() const
Create an iterator object which can be used to traverse the 'Iterable'.
conditional_t<(sizeof(CHECK_T)<=2 *sizeof(void *)) and is_trivially_copyable_v< CHECK_T >, CHECK_T, const CHECK_T & > ArgByValueType
This is an alias for 'T' - but how we want to pass it on stack as formal parameter.
SequencePolicy
equivalent which of 4 types being used std::execution::sequenced_policy, parallel_policy,...