9#include <QtCore/QtGlobal>
22template <
class Element,
int Dimensions>
54 friend class TArray<Element, Dimensions>;
60 TArray* m_arrayPtr =
nullptr;
149 const Iterator&
End()
const;
181template <
class Element,
int Dimensions>
188template <
class Element,
int Dimensions>
195template <
class Element,
int Dimensions>
202template <
class Element,
int Dimensions>
205 return (count == GetDimensionsCount());
209template <
class Element,
int Dimensions>
216template <
class Element,
int Dimensions>
219 Q_ASSERT(dimension >= 0);
220 Q_ASSERT(dimension < Dimensions);
222 return m_sizes[dimension];
226template <
class Element,
int Dimensions>
231 int elementIndex = GetElementIndex(index);
232 Q_ASSERT(elementIndex <
int(m_elements.size()));
234 return m_elements[elementIndex];
238template <
class Element,
int Dimensions>
243 int elementIndex = GetElementIndex(index);
244 Q_ASSERT(elementIndex <
int(m_elements.size()));
246 return m_elements[elementIndex];
250template <
class Element,
int Dimensions>
255 int elementIndex = GetElementIndex(index);
256 Q_ASSERT(elementIndex <
int(m_elements.size()));
258 m_elements[elementIndex] = value;
264template <
class Element,
int Dimensions>
271template <
class Element,
int Dimensions>
274 return s_endIterator;
278template <
class Element,
int Dimensions>
285template <
class Element,
int Dimensions>
288 int elementIndex = GetElementIndex(index);
289 Q_ASSERT(elementIndex <
int(m_elements.size()));
291 return m_elements[elementIndex];
297template <
class Element,
int Dimensions>
300 int elementIndex = 0;
301 int cumulatedSizes = 1;
302 for (
int i = 0; i < Dimensions; ++i){
303 Q_ASSERT(index[i] >= 0);
304 Q_ASSERT(index[i] < m_sizes[i]);
306 elementIndex += index[i] * cumulatedSizes;
308 cumulatedSizes *= m_sizes[i];
317template <
class Element,
int Dimensions>
320 for (
int i = 0; i < Dimensions; ++i){
326template <
class Element,
int Dimensions>
328: m_sizes(array.m_sizes), m_elements(array.m_elements)
333template <
class Element,
int Dimensions>
341template <
class Element,
int Dimensions>
350template <
class Element,
int Dimensions>
355 UpdateElementsSize();
361template <
class Element,
int Dimensions>
364 Q_ASSERT(dimension >= 0);
365 Q_ASSERT(dimension < Dimensions);
367 m_sizes[dimension] = size;
369 UpdateElementsSize();
375template <
class Element,
int Dimensions>
378 for (
typename Elements::iterator iter = m_elements.begin();
379 iter != m_elements.end();
388template <
class Element,
int Dimensions>
395template <
class Element,
int Dimensions>
404template <
class Element,
int Dimensions>
407 int cumulatedSizes = 1;
408 for (
int i = 0; i < Dimensions; ++i){
409 cumulatedSizes *= m_sizes[i];
412 m_elements.resize(cumulatedSizes, value);
416template <
class Element,
int Dimensions>
419 Q_ASSERT(
int(elements.size()) == sizes[0] * sizes[1]);
421 m_elements = elements;
428template <
class Element,
int Dimensions>
434template <
class Element,
int Dimensions>
436:
BaseClass(iterator), m_arrayPtr(iterator.m_arrayPtr)
441template <
class Element,
int Dimensions>
444 Q_ASSERT(m_arrayPtr !=
NULL);
445 Q_ASSERT(BaseClass::IsInside(m_arrayPtr->GetSizes()));
447 return m_arrayPtr->GetAt(*
this);
451template <
class Element,
int Dimensions>
454 Q_ASSERT(m_arrayPtr !=
NULL);
455 Q_ASSERT(BaseClass::IsInside(m_arrayPtr->GetSizes()));
457 return m_arrayPtr->operator[](*this);
461template <
class Element,
int Dimensions>
464 Q_ASSERT(m_arrayPtr !=
NULL);
465 Q_ASSERT(BaseClass::IsInside(m_arrayPtr->GetSizes()));
467 return &m_arrayPtr->GetAt(*
this);
471template <
class Element,
int Dimensions>
474 Q_ASSERT(m_arrayPtr !=
NULL);
475 Q_ASSERT(BaseClass::IsInside(m_arrayPtr->GetSizes()));
477 return &m_arrayPtr->operator[](*this);
481template <
class Element,
int Dimensions>
484 if ((m_arrayPtr !=
NULL) && !BaseClass::Increase(m_arrayPtr->GetSizes())){
492template <
class Element,
int Dimensions>
497 if ((m_arrayPtr !=
NULL) && !BaseClass::Increase(m_arrayPtr->GetSizes())){
505template <
class Element,
int Dimensions>
508 if ((m_arrayPtr !=
NULL) && !Decrease(m_arrayPtr->GetSizes())){
516template <
class Element,
int Dimensions>
521 if ((m_arrayPtr !=
NULL) && !Decrease(m_arrayPtr->GetSizes())){
529template <
class Element,
int Dimensions>
532 BaseClass::operator=(iterator);
534 m_arrayPtr = iterator.m_arrayPtr;
540template <
class Element,
int Dimensions>
543 if ((m_arrayPtr !=
NULL) && (iterator.m_arrayPtr !=
NULL)){
544 return (m_arrayPtr == iterator.m_arrayPtr) && (BaseClass::operator==(iterator));
547 return (m_arrayPtr == iterator.m_arrayPtr);
551template <
class Element,
int Dimensions>
560template <
class Element,
int Dimensions>
564 if ((m_arrayPtr !=
NULL) && !BaseClass::IsInside(m_arrayPtr->
GetSizes())){
TIndex< Dimensions > BaseClass
Iterator & operator=(const Iterator &iterator)
bool operator==(const Iterator &iterator) const
bool operator!=(const Iterator &iterator) const
Multidimensional array with fixed number of dimensions.
TIndex< Dimensions > IndexType
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 Reset()
Removes all elements and set all sizes to 0.
int GetDimensionsCount() const
Get number of dimensions of this array.
bool operator!=(const TArray< Element, Dimensions > &value) const
TArray(const SizesType &sizes, const ElementType &value=ElementType())
Element & GetAtRef(const IndexType &index)
Get reference to element stored at specified index.
bool IsDimensionsCountFixed() const
Check, if number dimensions is fixed.
TArray(const TArray &array)
bool SetSizes(const SizesType &sizes)
Set list of all sizes.
const Element & GetAt(const IndexType &index) const
Get element stored at specified index.
void SetAt(const IndexType &index, const Element &value)
Set element at specified index.
Element & operator[](const IndexType &index)
Iterator Begin() const
Get begin value of element access iterator.
TIndex< Dimensions > SizesType
void UpdateElementsSize(const ElementType &value=ElementType())
Update size of elements to size changes.
std::vector< Element > Elements
bool operator==(const TArray< Element, Dimensions > &value) const
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.