libUTL++
VectorMD.h
1 #pragma once
2 
4 
5 #include <libutl/Vector.h>
6 
8 
9 UTL_NS_BEGIN;
10 
12 // VectorMD ////////////////////////////////////////////////////////////////////////////////////////
14 
22 template <class T>
23 class VectorMD : public Object
24 {
26 
27 public:
28  VectorMD(size_t numDims);
29 
31  void clear();
32 
33  virtual int compare(const Object& rhs) const;
34  virtual void copy(const Object&);
35  virtual void serialize(Stream& stream, uint_t io, uint_t mode = ser_default);
36 
37  virtual size_t getSize() const;
38 
39 protected:
40  void setNumDims(size_t numDims);
41  size_t _numDims;
42  size_t* _dims;
43  T* _array;
44 
45 private:
46  void
47  init()
48  {
49  _numDims = 0;
50  _dims = nullptr;
51  _array = nullptr;
52  }
53  void
54  deInit()
55  {
56  delete[] _dims;
57  clear();
58  }
59 };
60 
62 // Vector1d ////////////////////////////////////////////////////////////////////////////////////////
64 
72 template <class T>
73 class Vector1d : public VectorMD<T>
74 {
76 
77 public:
78  Vector1d(size_t dim0)
79  {
80  init();
81  set(dim0);
82  }
83 
84  void set(size_t dim0);
85 
86  const T& operator()(size_t idx0) const
87  {
88  return get(idx0);
89  }
90 
91  T& operator()(size_t idx0)
92  {
93  return get(idx0);
94  }
95 
96  const T& get(size_t idx0) const;
97 
98  T& get(size_t idx0);
99 
100 private:
101  void
102  init()
103  {
104  this->setNumDims(1);
105  }
106  void
107  deInit()
108  {
109  }
110 };
111 
113 // Vector2d ////////////////////////////////////////////////////////////////////////////////////////
115 
123 template <class T>
124 class Vector2d : public VectorMD<T>
125 {
127 
128 public:
129  Vector2d(size_t dim0, size_t dim1)
130  {
131  init();
132  set(dim0, dim1);
133  }
134 
135  void set(size_t dim0, size_t dim1);
136 
137  const T& operator()(size_t idx0, size_t idx1) const
138  {
139  return get(idx0, idx1);
140  }
141 
142  T& operator()(size_t idx0, size_t idx1)
143  {
144  return get(idx0, idx1);
145  }
146 
147  const T& get(size_t idx0, size_t idx1) const;
148 
149  T& get(size_t idx0, size_t idx1);
150 
151 private:
152  void
153  init()
154  {
155  this->setNumDims(2);
156  }
157  void
158  deInit()
159  {
160  }
161 };
162 
164 // Vector3d ////////////////////////////////////////////////////////////////////////////////////////
166 
174 template <class T>
175 class Vector3d : public VectorMD<T>
176 {
178 
179 public:
180  Vector3d(size_t dim0, size_t dim1, size_t dim2)
181  {
182  init();
183  set(dim0, dim1, dim2);
184  }
185 
186  void set(size_t dim0, size_t dim1, size_t dim2);
187 
188  const T& operator()(size_t idx0, size_t idx1, size_t idx2) const
189  {
190  return get(idx0, idx1, idx2);
191  }
192 
193  T& operator()(size_t idx0, size_t idx1, size_t idx2)
194  {
195  return get(idx0, idx1, idx2);
196  }
197 
198  const T& get(size_t idx0, size_t idx1, size_t idx2) const;
199 
200  T& get(size_t idx0, size_t idx1, size_t idx2);
201 
202 private:
203  void
204  init()
205  {
206  this->setNumDims(3);
207  }
208  void
209  deInit()
210  {
211  }
212 };
213 
215 
216 template <class T>
217 VectorMD<T>::VectorMD(size_t numDims)
218 {
219  ASSERTD(numDims > 0);
220  init();
221  setNumDims(numDims);
222 }
223 
225 
226 template <class T>
227 void
229 {
230  size_t i;
231  for (i = 0; i < _numDims; i++)
232  {
233  _dims[i] = 0;
234  }
235  delete[] _array;
236  _array = nullptr;
237 }
238 
240 
241 template <class T>
242 int
243 VectorMD<T>::compare(const Object& rhs) const
244 {
245  int res;
246  if (rhs.isA(VectorMD<T>))
247  {
248  auto& vect = utl::cast<VectorMD<T>>(rhs);
249  res = utl::compare(_dims, _numDims, vect._dims, vect._numDims);
250  }
251  else
252  {
253  res = super::compare(rhs);
254  }
255  return res;
256 }
257 
259 
260 template <class T>
261 void
263 {
264  auto& vect = utl::cast<VectorMD<T>>(rhs);
265  ASSERTD(_numDims == vect._numDims);
266  if (memcmp(_dims, vect._dims, _numDims * sizeof(size_t)) != 0)
267  {
268  utl::copy(_dims, vect._dims, _numDims);
269  delete[] _array;
270  _array = new T[getSize()];
271  }
272  utl::copy(_array, vect._array, getSize());
273 }
274 
276 
277 template <class T>
278 void
280 {
281  // serialize _numDims, _dims[]
282  utl::serialize(_numDims, stream, io, mode);
283  if (io == io_rd)
284  {
285  delete[] _dims;
286  _dims = new size_t[_numDims];
287  utl::serialize(_dims, _numDims, stream, io, mode);
288 
289  delete[] _array;
290  _array = nullptr;
291  bool arrayExists;
292  utl::serialize(arrayExists, stream, io, mode);
293 
294  if (arrayExists)
295  {
296  _array = new T[getSize()];
297  utl::serialize(_array, getSize(), stream, io, mode);
298  }
299  }
300  else
301  {
302  utl::serialize(_dims, _numDims, stream, io, mode);
303 
304  bool arrayExists = (_array != nullptr);
305  utl::serialize(arrayExists, stream, io, mode);
306 
307  if (_array != nullptr)
308  {
309  utl::serialize(_array, getSize(), stream, io, mode);
310  }
311  }
312 }
313 
315 
316 template <class T>
317 size_t
318 VectorMD<T>::getSize() const
319 {
320  size_t res = _dims[0];
321  size_t i;
322  for (i = 1; i < _numDims; i++)
323  {
324  res *= _dims[i];
325  }
326  return res;
327 }
328 
330 
331 template <class T>
332 void
333 VectorMD<T>::setNumDims(size_t numDims)
334 {
335  ASSERTD(_numDims == 0);
336  _numDims = numDims;
337  _dims = new size_t[_numDims];
338 }
339 
341 
342 template <class T>
343 void
344 Vector1d<T>::set(size_t dim0)
345 {
346  this->clear();
347  this->_dims[0] = dim0;
348  this->_array = new T[this->getSize()];
349 }
350 
352 
353 template <class T>
354 const T&
355 Vector1d<T>::get(size_t idx0) const
356 {
357  ASSERTD(idx0 < this->_dims[0]);
358  return this->_array[idx0];
359 }
360 
362 
363 template <class T>
364 T&
365 Vector1d<T>::get(size_t idx0)
366 {
367  ASSERTD(idx0 < this->_dims[0]);
368  return this->_array[idx0];
369 }
370 
372 
373 template <class T>
374 void
375 Vector2d<T>::set(size_t dim0, size_t dim1)
376 {
377  this->clear();
378  this->_dims[0] = dim0;
379  this->_dims[1] = dim1;
380  this->_array = new T[this->getSize()];
381 }
382 
384 
385 template <class T>
386 const T&
387 Vector2d<T>::get(size_t idx0, size_t idx1) const
388 {
389  ASSERTD(idx0 < this->_dims[0]);
390  ASSERTD(idx1 < this->_dims[1]);
391  return this->_array[(idx0 * this->_dims[1]) + idx1];
392 }
393 
395 
396 template <class T>
397 T&
398 Vector2d<T>::get(size_t idx0, size_t idx1)
399 {
400  ASSERTD(idx0 < this->_dims[0]);
401  ASSERTD(idx1 < this->_dims[1]);
402  return this->_array[(idx0 * this->_dims[1]) + idx1];
403 }
404 
406 
407 template <class T>
408 void
409 Vector3d<T>::set(size_t dim0, size_t dim1, size_t dim2)
410 {
411  this->clear();
412  this->_dims[0] = dim0;
413  this->_dims[1] = dim1;
414  this->_dims[2] = dim2;
415  this->_array = new T[this->getSize()];
416 }
417 
419 
420 template <class T>
421 const T&
422 Vector3d<T>::get(size_t idx0, size_t idx1, size_t idx2) const
423 {
424  ASSERTD(idx0 < this->_dims[0]);
425  ASSERTD(idx1 < this->_dims[1]);
426  ASSERTD(idx2 < this->_dims[2]);
427  return this->_array[(((idx0 * this->_dims[1]) + idx1) * this->_dims[2]) + idx2];
428 }
429 
431 
432 template <class T>
433 T&
434 Vector3d<T>::get(size_t idx0, size_t idx1, size_t idx2)
435 {
436  ASSERTD(idx0 < this->_dims[0]);
437  ASSERTD(idx1 < this->_dims[1]);
438  ASSERTD(idx2 < this->_dims[2]);
439  return this->_array[(((idx0 * this->_dims[1]) + idx1) * this->_dims[2]) + idx2];
440 }
441 
443 
444 UTL_NS_END;
445 
447 
#define UTL_CLASS_IMPL_TPL(className, T)
Implementation of standard UTL++ functionality for a template class.
Definition: macros.h:906
void serialize(bool &b, Stream &stream, uint_t io, uint_t mode=ser_default)
Serialize a boolean.
void deInit()
De-initialize UTL++.
default representation (via getSerializeMode())
Definition: util.h:75
void copy(T *dest, const T *src, size_t len)
Copy one array of objects to another.
Definition: util_inl.h:690
Three-dimensional vector.
Definition: VectorMD.h:175
read
Definition: util.h:58
unsigned int uint_t
Unsigned integer.
Definition: types.h:59
Stream I/O abstraction.
Definition: Stream.h:68
One-dimensional vector.
Definition: VectorMD.h:73
#define UTL_CLASS_DECL_TPL(DC, T, BC)
Declaration of standard UTL++ functionality for a template class with one parameter.
Definition: macros.h:713
Abstract base for n-dimensional vectors.
Definition: VectorMD.h:23
Root of UTL++ class hierarchy.
Definition: Object.h:52
int compare(bool lhs, bool rhs)
Compare two boolean values.
void init()
Initialize UTL++.
#define ASSERTD
Do an assertion in DEBUG mode only.
Two-dimensional vector.
Definition: VectorMD.h:124