13#include <QtCore/QtGlobal>
26template <
class Element,
int Dimensions>
58 friend class TArray<Element, Dimensions>;
154 const iterator&
end()
const;
189template <
class Element,
int Dimensions>
196template <
class Element,
int Dimensions>
203template <
class Element,
int Dimensions>
210template <
class Element,
int Dimensions>
213 return (count == GetDimensionsCount());
217template <
class Element,
int Dimensions>
224template <
class Element,
int Dimensions>
227 Q_ASSERT(dimension >= 0);
228 Q_ASSERT(dimension < Dimensions);
230 return m_sizes[dimension];
234template <
class Element,
int Dimensions>
239 int elementIndex = GetElementIndex(index);
240 Q_ASSERT(elementIndex <
int(m_elements.size()));
242 return m_elements[elementIndex];
246template <
class Element,
int Dimensions>
251 int elementIndex = GetElementIndex(index);
252 Q_ASSERT(elementIndex <
int(m_elements.size()));
254 return m_elements[elementIndex];
258template <
class Element,
int Dimensions>
263 int elementIndex = GetElementIndex(index);
264 Q_ASSERT(elementIndex <
int(m_elements.size()));
266 m_elements[elementIndex] = value;
272template <
class Element,
int Dimensions>
279template <
class Element,
int Dimensions>
282 return s_endIterator;
286template <
class Element,
int Dimensions>
293template <
class Element,
int Dimensions>
296 int elementIndex = GetElementIndex(index);
297 Q_ASSERT(elementIndex <
int(m_elements.size()));
299 return m_elements[elementIndex];
305template <
class Element,
int Dimensions>
308 int elementIndex = 0;
309 int cumulatedSizes = 1;
310 for (
int i = 0; i < Dimensions; ++i){
311 Q_ASSERT(index[i] >= 0);
312 Q_ASSERT(index[i] < m_sizes[i]);
314 elementIndex += index[i] * cumulatedSizes;
316 cumulatedSizes *= m_sizes[i];
325template <
class Element,
int Dimensions>
328 for (
int i = 0; i < Dimensions; ++i){
334template <
class Element,
int Dimensions>
342template <
class Element,
int Dimensions>
351template <
class Element,
int Dimensions>
356 UpdateElementsSize();
362template <
class Element,
int Dimensions>
365 Q_ASSERT(dimension >= 0);
366 Q_ASSERT(dimension < Dimensions);
368 m_sizes[dimension] = size;
370 UpdateElementsSize();
376template <
class Element,
int Dimensions>
379 for (
typename Elements::iterator iter = m_elements.begin();
380 iter != m_elements.end();
389template <
class Element,
int Dimensions>
396template <
class Element,
int Dimensions>
405template <
class Element,
int Dimensions>
408 int cumulatedSizes = 1;
409 for (
int i = 0; i < Dimensions; ++i){
410 cumulatedSizes *= m_sizes[i];
413 m_elements.resize(cumulatedSizes);
417template <
class Element,
int Dimensions>
420 Q_ASSERT(
int(elements.size()) == sizes[0] * sizes[1]);
422 m_elements = elements;
429template <
class Element,
int Dimensions>
435template <
class Element,
int Dimensions>
442template <
class Element,
int Dimensions>
445 Q_ASSERT(m_arrayPtr !=
nullptr);
446 Q_ASSERT(BaseClass::IsInside(m_arrayPtr->GetSizes()));
448 return m_arrayPtr->GetAt(*
this);
452template <
class Element,
int Dimensions>
455 Q_ASSERT(m_arrayPtr !=
nullptr);
456 Q_ASSERT(BaseClass::IsInside(m_arrayPtr->GetSizes()));
458 return m_arrayPtr->operator[](*this);
462template <
class Element,
int Dimensions>
465 Q_ASSERT(m_arrayPtr !=
nullptr);
466 Q_ASSERT(BaseClass::IsInside(m_arrayPtr->GetSizes()));
468 return &m_arrayPtr->GetAt(*
this);
472template <
class Element,
int Dimensions>
475 Q_ASSERT(m_arrayPtr !=
nullptr);
476 Q_ASSERT(BaseClass::IsInside(m_arrayPtr->GetSizes()));
478 return &m_arrayPtr->operator[](*this);
482template <
class Element,
int Dimensions>
485 if ((m_arrayPtr !=
nullptr) && !BaseClass::Increase(m_arrayPtr->GetSizes())){
486 m_arrayPtr =
nullptr;
493template <
class Element,
int Dimensions>
498 if ((m_arrayPtr !=
nullptr) && !BaseClass::Increase(m_arrayPtr->GetSizes())){
499 m_arrayPtr =
nullptr;
506template <
class Element,
int Dimensions>
509 if ((m_arrayPtr !=
nullptr) && !Decrease(m_arrayPtr->GetSizes())){
510 m_arrayPtr =
nullptr;
517template <
class Element,
int Dimensions>
522 if ((m_arrayPtr !=
nullptr) && !Decrease(m_arrayPtr->GetSizes())){
523 m_arrayPtr =
nullptr;
530template <
class Element,
int Dimensions>
539template <
class Element,
int Dimensions>
542 if ((m_arrayPtr !=
nullptr) && (
iterator.m_arrayPtr !=
nullptr)){
543 return (m_arrayPtr ==
iterator.m_arrayPtr) && (BaseClass::operator==(
iterator));
546 return (m_arrayPtr ==
iterator.m_arrayPtr);
550template <
class Element,
int Dimensions>
559template <
class Element,
int Dimensions>
564 m_arrayPtr = nullptr;
bool operator==(const iterator &iterator) const
bool operator!=(const iterator &iterator) const
TIndex< Dimensions > BaseClass
iterator & operator=(const iterator &iterator)
Multidimensional array with fixed number of dimensions.
void SetAllElements(const Element &value)
Set some value to all elements.
const iterator & end() const
Get end value of element access iterator.
bool IsEmpty() const
Check if this array has no elements.
int GetElementIndex(const IndexType &index) const
Get index of element in one dimensional array.
bool SetSize(int dimension, int size)
Set size of array for specified dimension.
const Element & operator[](const IndexType &index) const
void UpdateElementsSize()
Update size of elements to size changes.
void Reset()
Removes all elements and set all sizes to 0.
int GetDimensionsCount() const
Get number of dimensions of this array.
std::vector< Element > Elements
bool operator!=(const TArray< Element, Dimensions > &value) const
Element & GetAtRef(const IndexType &index)
Get reference to element stored at specified index.
bool IsDimensionsCountFixed() const
Check, if number dimensions is fixed.
iterator begin() const
Get begin value of element access iterator.
bool SetSizes(const SizesType &sizes)
Set list of all sizes.
const Element & GetAt(const IndexType &index) const
Get element stored at specified index.
TIndex< Dimensions > IndexType
void SetAt(const IndexType &index, const Element &value)
Set element at specified index.
TArray(const SizesType &sizes)
TArray(const TArray &array)=default
Element & operator[](const IndexType &index)
TIndex< Dimensions > SizesType
TArray & operator=(TArray &&array)=default
TArray & operator=(const TArray &array)=default
bool operator==(const TArray< Element, Dimensions > &value) const
TArray(TArray &&array)=default
int GetSize(int dimension) const
Get size of array for specified dimension.
const SizesType & GetSizes() const
Get list of all sizes.
void DeepCopy(const Elements &elements, const SizesType &sizes)
bool SetDimensionsCount(int count)
Set number of dimensions of this array.
Multidimensional index used to addressing fixed-size array.
bool IsInside(const TIndex &boundaries) const
Check if index is inside boundaries.
bool IsSizeEmpty() const
Check if this index interpreted as size is empty.