ArrayArithmetic.h
Go to the documentation of this file.
1#ifndef GfxTL__ARRAYARITHMETIC_HEADER__
2#define GfxTL__ARRAYARITHMETIC_HEADER__
3#include <algorithm>
4
5namespace GfxTL
6{
7
8 // c-style (row major) array layout
9 template <unsigned int DimT>
11 {
12 public:
14 {
15 }
16
17 template <class ExtentT>
18 ArrayArithmetic(const ExtentT& ext)
19 {
20 Extent(ext);
21 }
22
23 template <class ExtentT>
24 void
25 Extent(const ExtentT& ext)
26 {
27 m_fac[DimT - 1] = 1;
28 for (unsigned int i = DimT - 1; i != 0; --i)
29 {
30 m_fac[i - 1] = m_fac[i] * ext[i];
31 }
32 m_transFac[0] = 1;
33 for (unsigned int i = 0; i < DimT - 1; ++i)
34 {
35 m_transFac[i + 1] = m_transFac[i] * ext[i];
36 }
37 }
38
39 template <class SubscriptT>
40 size_t
41 Sub2Idx(const SubscriptT& sub) const
42 {
43 size_t idx = sub[0] * m_fac[0];
44 for (unsigned int i = 1; i < DimT; ++i)
45 {
46 idx += sub[i] * m_fac[i];
47 }
48 return idx;
49 }
50
51 template <class SubscriptT>
52 size_t
53 Sub2TransposedIdx(const SubscriptT& sub) const
54 {
55 size_t idx = sub[0] * m_transFac[0];
56 for (unsigned int i = 1; i < DimT; ++i)
57 {
58 idx += sub[i] * m_transFac[i];
59 }
60 return idx;
61 }
62
63 template <class SubscriptT>
64 intptr_t
65 Sub2Off(const SubscriptT& sub) const
66 {
67 intptr_t off = sub[0] * m_fac[0];
68 for (unsigned int i = 1; i < DimT; ++i)
69 {
70 off += sub[i] * m_fac[i];
71 }
72 return off;
73 }
74
75 template <class SubscriptT>
76 void
77 Idx2Sub(size_t idx, SubscriptT* sub) const
78 {
79 for (unsigned int i = 0; i < DimT; ++i)
80 {
81 (*sub)[i] = idx / m_fac[i];
82 idx %= m_fac[i];
83 }
84 }
85
86 template <class SubscriptT>
87 void
88 TransposedIdx2Sub(size_t tidx, SubscriptT* sub) const
89 {
90 for (unsigned int i = DimT - 1; i != -1; --i)
91 {
92 (*sub)[i] = tidx / m_transFac[i];
93 tidx %= m_transFac[i];
94 }
95 }
96
97 // convert to column major index (Fortran and Matlab array layout)
98 size_t
99 Idx2TransposedIdx(size_t idx) const
100 {
101 size_t tidx = 0;
102 for (unsigned int i = 0; i < DimT; ++i)
103 {
104 size_t j = idx / m_fac[i];
105 idx %= m_fac[i];
106 tidx += j * m_transFac[i];
107 }
108 return tidx;
109 }
110
111 // convert column major index (Fortran and Matlab array layout) to row major (c/c++ array layout)
112 size_t
113 TransposedIdx2Idx(size_t tidx) const
114 {
115 size_t idx = 0;
116 for (unsigned int i = DimT - 1; i != -1; --i)
117 {
118 size_t j = tidx / m_transFac[i];
119 tidx %= m_transFac[i];
120 idx += j * m_fac[i];
121 }
122 return idx;
123 }
124
125 private:
126 size_t m_fac[DimT];
127 size_t m_transFac[DimT];
128 };
129
130}; // namespace GfxTL
131
132#endif
void Idx2Sub(size_t idx, SubscriptT *sub) const
size_t TransposedIdx2Idx(size_t tidx) const
void Extent(const ExtentT &ext)
size_t Sub2Idx(const SubscriptT &sub) const
size_t Sub2TransposedIdx(const SubscriptT &sub) const
void TransposedIdx2Sub(size_t tidx, SubscriptT *sub) const
ArrayArithmetic(const ExtentT &ext)
size_t Idx2TransposedIdx(size_t idx) const
intptr_t Sub2Off(const SubscriptT &sub) const
Definition AABox.h:10
Point sub(const Point &x, const Point &y)
Definition point.hpp:46