6#include <QtCore/QtGlobal>
16template <
int Dimensions>
184 int m_elements[Dimensions];
194template <
int Dimensions>
201template <
int Dimensions>
208template <
int Dimensions>
211 return (count == GetDimensionsCount());
215template <
int Dimensions>
218 for (
int i = 0; i < Dimensions; ++i){
219 if (m_elements[i] < 0){
228template <
int Dimensions>
231 for (
int i = 0; i < Dimensions; ++i){
232 if (m_elements[i] > 0){
241template <
int Dimensions>
244 for (
int i = 0; i < Dimensions; ++i){
245 if (m_elements[i] <= 0){
254template <
int Dimensions>
261template <
int Dimensions>
268template <
int Dimensions>
271 Q_ASSERT(index >= 0);
272 Q_ASSERT(index < Dimensions);
274 return m_elements[index];
278template <
int Dimensions>
281 Q_ASSERT(index >= 0);
282 Q_ASSERT(index < Dimensions);
284 m_elements[index] = value;
288template <
int Dimensions>
291 Q_ASSERT(index >= 0);
292 Q_ASSERT(index < Dimensions);
300template <
int Dimensions>
303 Q_ASSERT(index >= 0);
304 Q_ASSERT(index < Dimensions);
312template <
int Dimensions>
319template <
int Dimensions>
322 return (
Iterator)&m_elements[Dimensions];
326template <
int Dimensions>
333template <
int Dimensions>
336 Q_ASSERT(index >= 0);
337 Q_ASSERT(index < Dimensions);
339 return m_elements[index];
343template <
int Dimensions>
346 for (
int i = 0; i < Dimensions; ++i){
347 if (m_elements[i] != index.m_elements[i]){
356template <
int Dimensions>
359 return !operator==(index);
363template <
int Dimensions>
370 for (
int i = 0; i < Dimensions; ++i){
371 retVal[i] += index[i];
378template <
int Dimensions>
383 for (
int i = 0; i < Dimensions; ++i){
384 m_elements[i] += index[i];
391template <
int Dimensions>
398 for (
int i = 0; i < Dimensions; ++i){
399 retVal[i] -= index[i];
406template <
int Dimensions>
411 for (
int i = 0; i < Dimensions; ++i){
412 m_elements[i] -= index[i];
422template <
int Dimensions>
429template <
int Dimensions>
432 for (
int i = 0; i < Dimensions; ++i){
438template <
int Dimensions>
441 for (
int i = 0; i < Dimensions; ++i){
442 m_elements[i] = index.m_elements[i];
447template <
int Dimensions>
450 for (
int i = 0; i < Dimensions; ++i){
451 m_elements[i] = value;
456template <
int Dimensions>
459 for (
int i = 0; i < Dimensions; ++i){
460 Q_ASSERT(m_elements[i] >= 0);
462 if (m_elements[i] >= boundaries.m_elements[i]){
471template <
int Dimensions>
474 Q_ASSERT(IsInside(boundaries));
477 for (
int i = 0; i < Dimensions; ++i){
478 if (m_elements[i] < boundaries.m_elements[i] - 1){
480 for (
int j = 0; j < i; ++j){
494template <
int Dimensions>
497 Q_ASSERT(IsInside(boundaries));
500 for (
int i = 0; i < Dimensions; ++i){
501 if (m_elements[i] > 0){
504 for (
int j = 0; j < i; ++j){
505 m_elements[j] = boundaries.m_elements[j] - 1;
512 for (
int j = 0; j < Dimensions; ++j){
513 m_elements[j] = boundaries.m_elements[j] - 1;
520template <
int Dimensions>
525 for (
int i = 0; i < Dimensions; ++i){
526 retVal *= m_elements[i];
533template <
int Dimensions>
538 int positionBase = 1;
539 for (
int i = 0; i < Dimensions; ++i){
540 retVal += m_elements[i] * positionBase;
542 positionBase *= boundaries.m_elements[i];
551template <
int Dimensions>
554 return s_zeroInstance;
558template <
int Dimensions>
561 return s_invalidInstance;
567template <
int Dimensions>
569template <
int Dimensions>
575template <
int Dimensions>
580 for (
int i = 0; i < Dimensions; ++i){
581 uint value = uint(key[i]);
Multidimensional index used to addressing fixed-size array.
void SetAt(int index, int value)
Set element at specified index.
static const TIndex< Dimensions > & GetZero()
Get global instance of zero index.
void SetAllTo(int value)
Set all components to specified value.
Iterator End() const
Get end value of element access iterator.
bool IsZero() const
Check if this index point at zero element.
int GetDimensionsCount() const
Get number of dimensions of this index.
TIndex()
Default constructor with initialization of member to 0.
int GetAt(int index) const
Get element stored at specified index.
void Reset()
Reset this object.
int GetIterationIndex(const TIndex &boundaries) const
Get index of iteration from zero to current index inside some boundaries.
bool Increase(const TIndex &boundaries)
Increase this index inside the boundaries.
void Clear()
Set all components to 0.
bool SetDimensionsCount(int count) const
Set number of dimensions of this index.
bool IsValid() const
Check if this index is valid.
TIndex & operator+=(const TIndex &index)
TIndex & operator=(const TIndex &index)=default
bool IsDimensionsCountFixed() const
Check, if number dimensions is fixed.
TIndex & operator-=(const TIndex &index)
bool DecreaseAt(int index)
Decrease single component at specified position.
TIndex operator-(const TIndex &index) const
bool IsInside(const TIndex &boundaries) const
Check if index is inside boundaries.
Iterator Begin() const
Get begin value of element access iterator.
bool Decrease(const TIndex &boundaries)
Decrease this index inside the boundaries.
static const TIndex< Dimensions > & GetInvalid()
Get global instance of invalid index.
bool operator==(const TIndex &index) const
TIndex operator+(const TIndex &index) const
int GetProductVolume() const
Get total number of elements if this index is treated as size.
bool IsSizeEmpty() const
Check if this index interpreted as size is empty.
int & operator[](int index)
TIndex(int value)
Constructor initializing all members to specified value.
bool IncreaseAt(int index)
Increase single component at specified position.
TIndex(const TIndex &index)
Copy constructor.
int operator[](int index) const
bool operator!=(const TIndex &index) const
uint qHash(const CVarIndex &index, uint seed=0)