6#include <QtCore/QVector>
19template <
class Element>
100 int GetSize(
int dimension)
const;
107 bool SetSize(
int dimension,
int size);
151 typedef QVector<Element> Elements;
162template <
class Element>
169template <
class Element>
176template <
class Element>
179 bool retVal = m_sizes.SetDimensionsCount(count);
181 UpdateElementsSize();
187template <
class Element>
194template <
class Element>
197 Q_ASSERT(dimension >= 0);
198 Q_ASSERT(dimension < m_sizes.GetDimensionsCount());
200 return m_sizes[dimension];
204template <
class Element>
209 int elementIndex = GetElementIndex(index);
210 Q_ASSERT(elementIndex <
int(m_elements.size()));
212 return m_elements[elementIndex];
216template <
class Element>
221 int elementIndex = GetElementIndex(index);
222 Q_ASSERT(elementIndex <
int(m_elements.size()));
224 m_elements[elementIndex] = value;
230template <
class Element>
237template <
class Element>
240 return s_endIterator;
244template <
class Element>
251template <
class Element>
254 int elementIndex = GetElementIndex(index);
255 Q_ASSERT(elementIndex <
int(m_elements.size()));
257 return m_elements[elementIndex];
261template <
class Element>
265 int dimensionsCount = m_sizes.GetDimensionsCount();
267 int minDimensionsCount = qMin(indexDimensionsCount, dimensionsCount);
269 int elementIndex = 0;
270 int cumulatedSizes = 1;
271 for (
int i = 0; i < minDimensionsCount; ++i){
272 Q_ASSERT(index[i] >= 0);
273 Q_ASSERT(index[i] < m_sizes[i]);
275 elementIndex += index[i] * cumulatedSizes;
277 cumulatedSizes *= m_sizes[i];
286template <
class Element>
292template <
class Element>
294: m_elements(array.m_elements),
295 m_sizes(array.m_sizes)
300template <
class Element>
309template <
class Element>
314 UpdateElementsSize();
320template <
class Element>
323 Q_ASSERT(dimension >= 0);
324 Q_ASSERT(dimension < m_sizes.GetDimensionsCount());
326 m_sizes[dimension] = size;
328 UpdateElementsSize();
334template <
class Element>
337 for (
typename Elements::Iterator iter = m_elements.begin();
338 iter != m_elements.end();
347template <
class Element>
350 int dimensionsCount = m_sizes.GetDimensionsCount();
351 int cumulatedSizes = 1;
352 for (
int i = 0; i < dimensionsCount; ++i){
353 cumulatedSizes *= m_sizes[i];
356 m_elements.resize(cumulatedSizes);
362template <
class Element>
368template <
class Element>
370:
BaseClass(iterator), m_arrayPtr(iterator.m_arrayPtr)
375template <
class Element>
378 Q_ASSERT(m_arrayPtr !=
NULL);
379 Q_ASSERT(BaseClass::IsInside(m_arrayPtr->GetSizes()));
381 return m_arrayPtr->GetAt(*
this);
385template <
class Element>
388 Q_ASSERT(m_arrayPtr !=
NULL);
389 Q_ASSERT(BaseClass::IsInside(m_arrayPtr->GetSizes()));
391 return m_arrayPtr->operator[](*this);
395template <
class Element>
398 Q_ASSERT(m_arrayPtr !=
NULL);
399 Q_ASSERT(BaseClass::IsInside(m_arrayPtr->GetSizes()));
401 return &m_arrayPtr->GetAt(*
this);
405template <
class Element>
408 Q_ASSERT(m_arrayPtr !=
NULL);
409 Q_ASSERT(BaseClass::IsInside(m_arrayPtr->GetSizes()));
411 return &m_arrayPtr->operator[](*this);
415template <
class Element>
418 if ((m_arrayPtr !=
NULL) && !Increase(m_arrayPtr->GetSizes())){
426template <
class Element>
431 if ((m_arrayPtr !=
NULL) && !Increase(m_arrayPtr->GetSizes())){
439template <
class Element>
442 if ((m_arrayPtr !=
NULL) && !Decrease(m_arrayPtr->GetSizes())){
450template <
class Element>
455 if ((m_arrayPtr !=
NULL) && !Decrease(m_arrayPtr->GetSizes())){
463template <
class Element>
466 BaseClass::operator=(iterator);
468 m_arrayPtr = iterator.m_arrayPtr;
472template <
class Element>
475 if ((m_arrayPtr !=
NULL) && (iterator.m_arrayPtr !=
NULL)){
476 return (m_arrayPtr == iterator.m_arrayPtr) && (BaseClass::operator==(iterator));
479 return (m_arrayPtr == iterator.m_arrayPtr);
483template <
class Element>
486 return !operator==(iterator);
492template <
class Element>
Multidimensional index used to addressing index.
Elements::iterator Iterator
bool IsInside(const CVarIndex &boundaries) const
Check if index is inside boundaries.
int GetDimensionsCount() const
Get number of dimensions of this index.
bool operator==(const Iterator &iterator) const
Iterator & operator=(const Iterator &iterator)
bool operator!=(const Iterator &iterator) const
Multidimensional array with fixed number of dimensions.
Iterator Begin() const
Get begin value of element access iterator.
int GetSize(int dimension) const
Get size of array for specified dimension.
int GetElementIndex(const IndexType &index) const
Get index of element in one dimensional array.
bool SetSizes(const SizesType &sizes)
Set list of all sizes.
const Element & GetAt(const IndexType &index) const
Get element stored at specified index.
int GetDimensionsCount() const
Get number of dimensions of this array.
void SetAllElements(const Element &value)
Set some value to all elements.
void SetAt(const IndexType &index, const Element &value)
Set element at specified index.
void Reset()
Removes all elements and set all sizes to 1.
bool SetSize(int dimension, int size)
Set size of array for specified dimension.
const SizesType & GetSizes() const
Get list of all sizes.
bool SetDimensionsCount(int count)
Set number of dimensions of this array.
bool IsDimensionsCountFixed() const
Check, if number dimensions is fixed.
void UpdateElementsSize()
Update size of elements to size changes.
const Iterator & End() const
Get end value of element access iterator.
const Element & operator[](const IndexType &index) const
TVarArray< double > CVarArray