cryph utilities [subset]  2.0
Subset of the full cryph package of mathematical utilities for points, vectors, and matrices
Packed3DArray.h
Go to the documentation of this file.
1 
19 #ifndef PACKED3DARRAY_H
20 #define PACKED3DARRAY_H
21 
22 #include <iostream>
23 
24 namespace cryph
25 {
26 
27 template <typename T>
29 {
30 public:
37  Packed3DArray(int dim1=2, int dim2=2, int dim3=2, const T* initBuf=nullptr);
38 
42  Packed3DArray(const Packed3DArray<T>& t3da);
43 
45  virtual ~Packed3DArray();
46 
50  const T* getData() const { return mData; }
51 
60  T getDataElement(int i1, int i2, int i3) const;
61 
69  const T* getDataElementLoc(int i1, int i2, int i3) const;
70 
74  int getDim1() const { return mDim1; }
75 
79  int getDim2() const { return mDim2; }
80 
84  int getDim3() const { return mDim3; }
85 
89  T* getModifiableData() { return mData; }
90 
95  int getTotalNumberElements() const { return mDim1 * mDim2 * mDim3; }
96 
103  void setDataElement(int i1, int i2, int i3, const T& elem);
104 
108  static void setErrorReporting(bool r) { sReportErrors = r; }
109 
113  static void setOutOfBoundsValue(T defaultValue) { sOutOfBoundsValue = defaultValue; }
114 
115 private:
116 
117  void copyDataFrom(const T* from);
118  int getOffset(const char* routine, int i1, int i2, int i3) const;
119 
120  T* mData;
121  int mDim1;
122  int mDim2;
123  int mDim3;
124 
125  static bool sReportErrors;
126  static T sOutOfBoundsValue;
127 };
128 
129 template <typename T>
131 
132 template <typename T>
134 
135 template <typename T>
136 Packed3DArray<T>::Packed3DArray(int dim1, int dim2, int dim3, const T* initBuf) :
137  mData(nullptr), mDim1(dim1), mDim2(dim2), mDim3(dim3)
138 {
139  if ( (dim1 < 1) || (dim2 < 1) || (dim3 < 1) )
140  {
141  mDim1 = 0; mDim2 = 0; mDim3 = 0;
142  if (Packed3DArray<T>::sReportErrors)
143  std::cerr << "Invalid dimensions in constructor: ("
144  << dim1 << ", " << dim2 << ", " << dim3 << ')' << std::endl;
145  }
146  else
147  {
148  mData = new T[dim1*dim2*dim3];
149  if (initBuf != nullptr)
150  copyDataFrom(initBuf);
151  }
152 }
153 
154 template <typename T>
156  mData(nullptr), mDim1(t3da.mDim1), mDim2(t3da.mDim2), mDim3(t3da.mDim3)
157 {
158  mData = new T[mDim1 * mDim2 * mDim3];
159  copyDataFrom(t3da.mData);
160 }
161 
162 template <typename T>
164 {
165  if (mData != nullptr)
166  {
167  delete [] mData;
168  mData = nullptr;
169  mDim1 = 0;
170  mDim2 = 0;
171  mDim3 = 0;
172  }
173 }
174 
175 template <typename T>
176 std::ostream& operator<<(std::ostream& os, const Packed3DArray<T>& t3da)
177 {
178  int size = t3da.getTotalNumberElements();
179  const T* Tarr = t3da.getData();
180  for (int i=0 ; i<size ; i++)
181  {
182  // WARNING: Assuming integral type for now, hence cast to integer
183  // first. For example, if "typename T" is GLubyte, this ensures
184  // that full 8-bit ints are written as opposed to general
185  // ASCII chars.
186  os << (int)Tarr[i];
187  if ((i % 20) == 0)
188  os << '\n';
189  else
190  os << ' ';
191  }
192  os << '\n';
193  return os;
194 }
195 
196 template <typename T>
197 std::istream& operator>>(std::istream& is, Packed3DArray<T>& t3da)
198 {
199  int size = t3da.getTotalNumberElements();
200  int temp = 0;
201  T* Tarr = t3da.getModifiableData();
202  for (int i=0 ; i<size ; i++)
203  {
204  // WARNING: See 'WARNING' in "operator<<" above.
205  is >> temp;
206  Tarr[i] = (T)temp;
207  }
208  return is;
209 }
210 
211 template <typename T>
212 void Packed3DArray<T>::copyDataFrom(const T* from)
213 {
214  int size = mDim1 * mDim2 * mDim3;
215  for (int i=0 ; i<size ; i++)
216  mData[i] = from[i];
217 }
218 
219 template <typename T>
220 T Packed3DArray<T>::getDataElement(int i1, int i2, int i3) const
221 {
222  int loc = getOffset("getDataElement",i1,i2,i3);
223  if (loc < 0)
224  {
225  return Packed3DArray<T>::sOutOfBoundsValue;
226  }
227  return mData[loc];
228 }
229 
230 template <typename T>
231 const T* Packed3DArray<T>::getDataElementLoc(int i1, int i2, int i3) const
232 {
233  int loc = getOffset("getDataElementLoc",i1,i2,i3);
234  if (loc < 0)
235  return nullptr;
236  return &mData[loc];
237 }
238 
239 template <typename T>
240 int Packed3DArray<T>::getOffset(const char* routine, int i1, int i2, int i3)
241  const
242 {
243  if ( (i1 < 0) || (i1 >= mDim1) ||
244  (i2 < 0) || (i2 >= mDim2) ||
245  (i3 < 0) || (i3 >= mDim3) )
246  {
247  if (Packed3DArray<T>::sReportErrors)
248  std::cerr << routine << ": Invalid data element reference: ("
249  << i1 << ", " << i2 << ", " << i3 << ')' << std::endl;
250  return -1;
251  }
252  return (i1 * mDim2 * mDim3) + (i2 * mDim3) + i3;
253 }
254 
255 template <typename T>
256 void Packed3DArray<T>::setDataElement(int i1, int i2, int i3, const T& elem)
257 {
258  int loc = getOffset("setDataElement",i1,i2,i3);
259  if (loc >= 0)
260  mData[loc] = elem;
261 }
262 
263 }
264 
265 #endif
void setDataElement(int i1, int i2, int i3, const T &elem)
Definition: Packed3DArray.h:256
static void setOutOfBoundsValue(T defaultValue)
Definition: Packed3DArray.h:113
static void setErrorReporting(bool r)
Definition: Packed3DArray.h:108
Definition: AffPoint.c++:12
const T * getData() const
Definition: Packed3DArray.h:50
Packed3DArray(int dim1=2, int dim2=2, int dim3=2, const T *initBuf=nullptr)
Definition: Packed3DArray.h:136
Definition: Packed3DArray.h:28
int getTotalNumberElements() const
Definition: Packed3DArray.h:95
int getDim1() const
Definition: Packed3DArray.h:74
const T * getDataElementLoc(int i1, int i2, int i3) const
Definition: Packed3DArray.h:231
int getDim2() const
Definition: Packed3DArray.h:79
int getDim3() const
Definition: Packed3DArray.h:84
T * getModifiableData()
Definition: Packed3DArray.h:89
virtual ~Packed3DArray()
Definition: Packed3DArray.h:163
T getDataElement(int i1, int i2, int i3) const
Definition: Packed3DArray.h:220