ArrayArithmetic.h
Go to the documentation of this file.
1 #ifndef GfxTL__ARRAYARITHMETIC_HEADER__
2 #define GfxTL__ARRAYARITHMETIC_HEADER__
3 #include <algorithm>
4 
5 namespace 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
GfxTL::ArrayArithmetic::ArrayArithmetic
ArrayArithmetic(const ExtentT &ext)
Definition: ArrayArithmetic.h:18
GfxTL::ArrayArithmetic
Definition: ArrayArithmetic.h:10
GfxTL::ArrayArithmetic::Idx2Sub
void Idx2Sub(size_t idx, SubscriptT *sub) const
Definition: ArrayArithmetic.h:77
GfxTL::ArrayArithmetic::Sub2Off
intptr_t Sub2Off(const SubscriptT &sub) const
Definition: ArrayArithmetic.h:65
GfxTL::ArrayArithmetic::Sub2TransposedIdx
size_t Sub2TransposedIdx(const SubscriptT &sub) const
Definition: ArrayArithmetic.h:53
GfxTL::ArrayArithmetic::ArrayArithmetic
ArrayArithmetic()
Definition: ArrayArithmetic.h:13
GfxTL::ArrayArithmetic::TransposedIdx2Sub
void TransposedIdx2Sub(size_t tidx, SubscriptT *sub) const
Definition: ArrayArithmetic.h:88
GfxTL::ArrayArithmetic::TransposedIdx2Idx
size_t TransposedIdx2Idx(size_t tidx) const
Definition: ArrayArithmetic.h:113
GfxTL
Definition: AABox.h:9
GfxTL::ArrayArithmetic::Extent
void Extent(const ExtentT &ext)
Definition: ArrayArithmetic.h:25
GfxTL::ArrayArithmetic::Idx2TransposedIdx
size_t Idx2TransposedIdx(size_t idx) const
Definition: ArrayArithmetic.h:99
sub
Point sub(const Point &x, const Point &y)
Definition: point.hpp:46
GfxTL::ArrayArithmetic::Sub2Idx
size_t Sub2Idx(const SubscriptT &sub) const
Definition: ArrayArithmetic.h:41