Openholo  v2.1
Open Source Digital Holographic Library
coder_array.h
Go to the documentation of this file.
1 /* Copied from fullfile(matlabroot,'extern','include','coder','coder_array','coder_array_rtw.h') */
2 #pragma once
3 
4 #ifndef _mw_coder_array_h
5 #define _mw_coder_array_h
6 
7 // Usage:
8 //
9 // coder::array<T, N>: T base type of data, N number of dimensions
10 //
11 // coder::array()
12 // : default constructor
13 // coder::array(const coder::array &)
14 // : copy constructor (always make a deep copy of other array)
15 // coder::array(const T *data, const SizeType *sz)
16 // : Set data with sizes of this array.
17 // : (Data is not copied, data is not deleted)
18 // coder::array::operator = (coder coder::array &)
19 // : Assign into this array;
20 // : delete its previous contents (if owning the data.)
21 // set(const T *data, SizeType sz1, SizeType sz2, ...)
22 // : Set data with dimensions.
23 // : (Data is not copied, data is not deleted)
24 // set_size(SizeType sz1, SizeType sz2, ...)
25 // : Set sizes of array. Reallocate memory of data if needed.
26 // bool is_owner() : Return true if the data is owned by the class.
27 // void set_owner(b) : Set if the data is owned by the class.
28 // SizeType capacity() : How many entries are reserved by memory allocation.
29 // reshape( SizeType sz1, SizeType sz2, ...)
30 // : Reshape array to a different ND shape. Do not copy the data.
31 // : The number of elements must not be changed (numel()==sz1*sz2*...)
32 // : Return the array with possibly new number of dimensions.
33 // clear() : Reset array to be empty.
34 // SizeType numel() : Return the number of elements.
35 // operator [] (SizeType index) : Extract element at linear index (0 based.)
36 // size(SizeType dimension) : Size of array of the provided dimension.
37 // SizeType * size() : Return the pointer to all the sizes of this array.
38 // SizeType index(SizeType i1, SizeType i2, ...)
39 // : Compute the linear index from ND index (i1,i2,...)
40 // at(SizeType i1, SizeType i2, ...) : The element at index (i1,i2,...)
41 
42 #include <cassert>
43 #include <cstring>
44 #include <iterator>
45 #include <string>
46 #include <vector>
47 
48 #ifndef INT32_T
49 #include "rtwtypes.h"
50 #endif
51 
52 namespace coder {
53 
54 #ifndef CODER_ARRAY_NEW_DELETE
55 #define CODER_ARRAY_NEW_DELETE
56 #define CODER_NEW(T, N) new T[N]
57 #define CODER_DELETE(P) delete[](P)
58 #endif
59 
60 typedef int32_T SizeType;
61 
62 namespace detail {
63 
64 #ifndef CODER_ARRAY_DATA_PTR_DEFINED
65 template <typename T, typename SZ>
66 class data_ptr {
67  public:
68  typedef T value_type;
69  typedef SZ size_type;
70 
72  : data_(NULL)
73  , size_(0)
74  , capacity_(0)
75  , owner_(false) {
76  }
77  data_ptr(T* _data, SZ _sz)
78  : data_(_data)
79  , size_(_sz)
80  , capacity_(_sz)
81  , owner_(false) {
82  }
83 
84  data_ptr(const data_ptr& _other)
85  : data_(_other.owner_ ? NULL : _other.data_)
86  , size_(_other.owner_ ? 0 : _other.size_)
87  , capacity_(_other.owner_ ? 0 : _other.capacity_)
88  , owner_(_other.owner_) {
89  if (owner_) {
90  resize(_other.size_);
91  std::copy(_other.data_, _other.data_ + size_, stdext::checked_array_iterator<T *>(data_, size_));
92  }
93  }
94 
96  if (owner_) {
97  CODER_DELETE(data_);
98  }
99  }
100  SZ capacity() const {
101  return capacity_;
102  }
103  void reserve(SZ _n) {
104  if (_n > capacity_) {
105  T* new_data = CODER_NEW(T, _n);
106  std::copy(data_, data_ + size_, stdext::checked_array_iterator<T *>(new_data, size_));
107  if (owner_) {
108  CODER_DELETE(data_);
109  }
110  data_ = new_data;
111  capacity_ = _n;
112  owner_ = true;
113  }
114  }
115  void resize(SZ _n) {
116  reserve(_n);
117  size_ = _n;
118  }
119 
120  private:
121  // Prohibit use of assignment operator to prevent subtle bugs
122  void operator=(const data_ptr<T, SZ>& _other);
123 
124  public:
125  void set(T* _data, const SZ _sz) {
126  if (owner_) {
127  CODER_DELETE(data_);
128  }
129  data_ = _data;
130  size_ = _sz;
131  owner_ = false;
132  capacity_ = size_;
133  }
134 
135  void copy(const T* _data, SZ _size) {
136  if (data_ == _data) {
137  size_ = _size;
138  return;
139  }
140  if (owner_) {
141  CODER_DELETE(data_);
142  }
143  data_ = CODER_NEW(T, _size);
144  owner_ = true;
145  size_ = _size;
146  capacity_ = size_;
147  std::copy(_data, _data + _size, stdext::checked_array_iterator<T *>(data_, _size));
148  }
149 
150  void copy(const data_ptr<T, SZ>& _other) {
151  copy(_other.data_, _other.size_);
152  }
153 
154  operator T*() {
155  return &data_[0];
156  }
157 
158  operator const T*() const {
159  return &data_[0];
160  }
161 
162  T& operator[](SZ _index) {
163  return data_[_index];
164  }
165  const T& operator[](SZ _index) const {
166  return data_[_index];
167  }
168 
169  T* operator->() {
170  return data_;
171  }
172 
173  const T* operator->() const {
174  return data_;
175  }
176 
177  bool is_null() const {
178  return data_ == NULL;
179  }
180 
181  void clear() {
182  if (owner_) {
183  CODER_DELETE(data_);
184  }
185  data_ = NULL;
186  size_ = 0;
187  capacity_ = 0;
188  owner_ = false;
189  }
190 
191  bool is_owner() const {
192  return owner_;
193  }
194 
195  void set_owner(bool _b) {
196  owner_ = _b;
197  }
198 
199  private:
200  T* data_;
201  SZ size_;
202  SZ capacity_;
203  bool owner_;
204 };
205 #endif
206 
207 } // namespace detail
208 
209 // Implementing the random access iterator class so coder::array can be
210 // used in STL iterators.
211 template <typename T>
212 class array_iterator : public std::iterator<std::random_access_iterator_tag,
213  typename T::value_type,
214  typename T::size_type> {
215  public:
217  : arr_(NULL)
218  , i_(0) {
219  }
221  : arr_(other.arr_)
222  , i_(other.i_) {
223  }
225  }
226  typename T::value_type& operator*() const {
227  return (*arr_)[i_];
228  }
229  typename T::value_type* operator->() const {
230  return &(*arr_)[i_];
231  }
232  typename T::value_type& operator[](typename T::size_type _di) const {
233  return (*arr_)[i_ + _di];
234  }
236  ++i_;
237  return *this;
238  }
240  --i_;
241  return *this;
242  }
244  array_iterator<T> cp(*this);
245  ++i_;
246  return cp;
247  }
249  array_iterator<T> cp(*this);
250  --i_;
251  return cp;
252  }
254  this->i_ = _other.i_;
255  return *this;
256  }
257  bool operator==(const array_iterator<T>& _other) const {
258  return i_ == _other.i_;
259  }
260  bool operator!=(const array_iterator<T>& _other) const {
261  return i_ != _other.i_;
262  }
263  bool operator<(const array_iterator<T>& _other) const {
264  return i_ < _other.i_;
265  }
266  bool operator>(const array_iterator<T>& _other) const {
267  return i_ > _other.i_;
268  }
269  bool operator<=(const array_iterator<T>& _other) const {
270  return i_ <= _other.i_;
271  }
272  bool operator>=(const array_iterator<T>& _other) const {
273  return i_ >= _other.i_;
274  }
275  array_iterator<T> operator+(typename T::size_type _add) const {
276  array_iterator<T> cp(*this);
277  cp.i_ += _add;
278  return cp;
279  }
280  array_iterator<T>& operator+=(typename T::size_type _add) {
281  this->i_ += _add;
282  return *this;
283  }
284  array_iterator<T> operator-(typename T::size_type _subtract) const {
285  array_iterator<T> cp(*this);
286  cp.i_ -= _subtract;
287  return cp;
288  }
289  array_iterator<T>& operator-=(typename T::size_type _subtract) {
290  this->i_ -= _subtract;
291  return *this;
292  }
293  typename T::size_type operator-(const array_iterator<T>& _other) const {
294  return static_cast<typename T::size_type>(this->i_ - _other.i_);
295  }
296 
297  array_iterator(T* _arr, typename T::size_type _i)
298  : arr_(_arr)
299  , i_(_i) {
300  }
301 
302  private:
303  T* arr_;
304  typename T::size_type i_;
305 };
306 
307 // Const version of the array iterator.
308 template <typename T>
309 class const_array_iterator : public std::iterator<std::random_access_iterator_tag,
310  typename T::value_type,
311  typename T::size_type> {
312  public:
314  : arr_(NULL)
315  , i_(0) {
316  }
318  : arr_(other.arr_)
319  , i_(other.i_) {
320  }
322  }
323  const typename T::value_type& operator*() const {
324  return (*arr_)[i_];
325  }
326  const typename T::value_type* operator->() const {
327  return &(*arr_)[i_];
328  }
329  const typename T::value_type& operator[](typename T::size_type _di) const {
330  return (*arr_)[i_ + _di];
331  }
333  ++i_;
334  return *this;
335  }
337  --i_;
338  return *this;
339  }
341  const_array_iterator<T> copy(*this);
342  ++i_;
343  return copy;
344  }
346  const_array_iterator copy(*this);
347  --i_;
348  return copy;
349  }
351  this->i_ = _other.i_;
352  return *this;
353  }
354  bool operator==(const const_array_iterator<T>& _other) const {
355  return i_ == _other.i_;
356  }
357  bool operator!=(const const_array_iterator<T>& _other) const {
358  return i_ != _other.i_;
359  }
360  bool operator<(const const_array_iterator<T>& _other) const {
361  return i_ < _other.i_;
362  }
363  bool operator>(const const_array_iterator<T>& _other) const {
364  return i_ > _other.i_;
365  }
366  bool operator<=(const const_array_iterator<T>& _other) const {
367  return i_ <= _other.i_;
368  }
369  bool operator>=(const const_array_iterator<T>& _other) const {
370  return i_ >= _other.i_;
371  }
372  const_array_iterator<T> operator+(typename T::size_type _add) const {
373  const_array_iterator<T> cp(*this);
374  cp.i_ += _add;
375  return cp;
376  }
377  const_array_iterator<T>& operator+=(typename T::size_type _add) {
378  this->i_ += _add;
379  return *this;
380  }
381  const_array_iterator<T> operator-(typename T::size_type _subtract) const {
382  const_array_iterator<T> cp(*this);
383  cp.i_ -= _subtract;
384  return cp;
385  }
386 
387  const_array_iterator<T>& operator-=(typename T::size_type _subtract) {
388  this->i_ -= _subtract;
389  return *this;
390  }
391 
392  typename T::size_type operator-(const const_array_iterator<T>& _other) const {
393  return static_cast<typename T::size_type>(this->i_ - _other.i_);
394  }
395 
396  const_array_iterator(const T* _arr, typename T::size_type _i)
397  : arr_(_arr)
398  , i_(_i) {
399  }
400 
401  private:
402  const T* arr_;
403  typename T::size_type i_, n_;
404 };
405 
406 namespace detail {
407 
408 // detail::numel<N>: Compile-time product of the given size vector of length N.
409 template <int N>
410 class numel {
411  public:
412  template <typename SZ>
413  static SZ compute(SZ _size[]) {
414  return _size[N - 1] * numel<N - 1>::compute(_size);
415  }
416 };
417 template <>
418 class numel<0> {
419  public:
420  template <typename SZ>
421  static SZ compute(SZ[]) {
422  return 1;
423  }
424 };
425 
426 // Compute flat index from (column-major) ND size vector and a list of indices.
427 template <int I>
428 class index_nd {
429  public:
430  template <typename SZ>
431  static SZ compute(const SZ _size[], const SZ _indices[]) {
432  const SZ weight = numel<I - 1>::compute(_size);
433  return weight * _indices[I - 1] + index_nd<I - 1>::compute(_size, _indices);
434  }
435 };
436 
437 template <>
438 class index_nd<0> {
439  public:
440  template <typename SZ>
441  static SZ compute(SZ[], SZ[]) {
442  return 0;
443  }
444 };
445 
446 template <bool Cond>
447 struct match_dimensions {};
448 
449 template <>
450 struct match_dimensions<true> {
451  static void check() {
452  }
453 };
454 
455 } // namespace detail
456 
457 // Base class for code::array. SZ is the type used for sizes (currently int32_t.)
458 // Overloading up to 10 dimensions (not using variadic templates to
459 // stay compatible with C++98.)
460 template <typename T, typename SZ, int N>
461 class array_base {
462  public:
463  typedef T value_type;
464  typedef SZ size_type;
465 
467  std::memset(size_, 0, sizeof(SZ) * N);
468  }
469 
470  array_base(T* _data, const SZ* _sz)
471  : data_(_data, ::coder::detail::numel<N>::compute(_sz)) {
472  std::copy(_sz, _sz + N, size_);
473  }
474 
475  array_base& operator=(const array_base& _other) {
476  data_.copy(_other.data_);
477  std::copy(_other.size_, _other.size_ + N, size_);
478  return *this;
479  }
480 
481  void set(T* _data, SZ _n1) {
483  data_.set(_data, _n1);
484  size_[0] = _n1;
485  }
486 
487  void set(T* _data, SZ _n1, SZ _n2) {
489  data_.set(_data, _n1 * _n2);
490  size_[0] = _n1;
491  size_[1] = _n2;
492  }
493 
494  void set(T* _data, SZ _n1, SZ _n2, SZ _n3) {
496  data_.set(_data, _n1 * _n2 * _n3);
497  size_[0] = _n1;
498  size_[1] = _n2;
499  size_[2] = _n3;
500  }
501 
502  void set(T* _data, SZ _n1, SZ _n2, SZ _n3, SZ _n4) {
504  data_.set(_data, _n1 * _n2 * _n3 * _n4);
505  size_[0] = _n1;
506  size_[1] = _n2;
507  size_[2] = _n3;
508  size_[3] = _n4;
509  }
510 
511  void set(T* _data, SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5) {
513  data_.set(_data, _n1 * _n2 * _n3 * _n4 * _n5);
514  size_[0] = _n1;
515  size_[1] = _n2;
516  size_[2] = _n3;
517  size_[3] = _n4;
518  size_[4] = _n5;
519  }
520 
521  void set(T* _data, SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6) {
523  data_.set(_data, _n1 * _n2 * _n3 * _n4 * _n5 * _n6);
524  size_[0] = _n1;
525  size_[1] = _n2;
526  size_[2] = _n3;
527  size_[3] = _n4;
528  size_[4] = _n5;
529  size_[5] = _n6;
530  }
531 
532  void set(T* _data, SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7) {
534  data_.set(_data, _n1 * _n2 * _n3 * _n4 * _n5 * _n6 * _n7);
535  size_[0] = _n1;
536  size_[1] = _n2;
537  size_[2] = _n3;
538  size_[3] = _n4;
539  size_[4] = _n5;
540  size_[5] = _n6;
541  size_[6] = _n7;
542  }
543 
544  void set(T* _data, SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8) {
546  data_.set(_data, _n1 * _n2 * _n3 * _n4 * _n5 * _n6 * _n7 * _n8);
547  size_[0] = _n1;
548  size_[1] = _n2;
549  size_[2] = _n3;
550  size_[3] = _n4;
551  size_[4] = _n5;
552  size_[5] = _n6;
553  size_[6] = _n7;
554  size_[7] = _n8;
555  }
556 
557  void set(T* _data, SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9) {
559  data_.set(_data, _n1 * _n2 * _n3 * _n4 * _n5 * _n6 * _n7 * _n8 * _n9);
560  size_[0] = _n1;
561  size_[1] = _n2;
562  size_[2] = _n3;
563  size_[3] = _n4;
564  size_[4] = _n5;
565  size_[5] = _n6;
566  size_[6] = _n7;
567  size_[7] = _n8;
568  size_[8] = _n9;
569  }
570 
571  void
572  set(T* _data, SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9, SZ _n10) {
574  data_.set(_data, _n1 * _n2 * _n3 * _n4 * _n5 * _n6 * _n7 * _n8 * _n9 * _n10);
575  size_[0] = _n1;
576  size_[1] = _n2;
577  size_[2] = _n3;
578  size_[3] = _n4;
579  size_[4] = _n5;
580  size_[5] = _n6;
581  size_[6] = _n7;
582  size_[7] = _n8;
583  size_[8] = _n9;
584  size_[9] = _n10;
585  }
586 
587  bool is_owner() const {
588  return data_.is_owner();
589  }
590 
591  void set_owner(bool b) {
592  data_.set_owner(b);
593  }
594 
595  SZ capacity() const {
596  return data_.capacity();
597  }
598 
599  void set_size(SZ _n1) {
601  size_[0] = _n1;
602  ensureCapacity(numel());
603  }
604 
605  void set_size(SZ _n1, SZ _n2) {
607  size_[0] = _n1;
608  size_[1] = _n2;
609  ensureCapacity(numel());
610  }
611 
612  void set_size(SZ _n1, SZ _n2, SZ _n3) {
614  size_[0] = _n1;
615  size_[1] = _n2;
616  size_[2] = _n3;
617  ensureCapacity(numel());
618  }
619 
620  void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4) {
622  size_[0] = _n1;
623  size_[1] = _n2;
624  size_[2] = _n3;
625  size_[3] = _n4;
626  ensureCapacity(numel());
627  }
628 
629  void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5) {
631  size_[0] = _n1;
632  size_[1] = _n2;
633  size_[2] = _n3;
634  size_[3] = _n4;
635  size_[4] = _n5;
636  ensureCapacity(numel());
637  }
638 
639  void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6) {
641  size_[0] = _n1;
642  size_[1] = _n2;
643  size_[2] = _n3;
644  size_[3] = _n4;
645  size_[4] = _n5;
646  size_[5] = _n6;
647  ensureCapacity(numel());
648  }
649 
650  void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7) {
652  size_[0] = _n1;
653  size_[1] = _n2;
654  size_[2] = _n3;
655  size_[3] = _n4;
656  size_[4] = _n5;
657  size_[5] = _n6;
658  size_[6] = _n7;
659  ensureCapacity(numel());
660  }
661 
662  void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8) {
664  size_[0] = _n1;
665  size_[1] = _n2;
666  size_[2] = _n3;
667  size_[3] = _n4;
668  size_[4] = _n5;
669  size_[5] = _n6;
670  size_[6] = _n7;
671  size_[7] = _n8;
672  ensureCapacity(numel());
673  }
674 
675  void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9) {
677  size_[0] = _n1;
678  size_[1] = _n2;
679  size_[2] = _n3;
680  size_[3] = _n4;
681  size_[4] = _n5;
682  size_[5] = _n6;
683  size_[6] = _n7;
684  size_[7] = _n8;
685  size_[8] = _n9;
686  ensureCapacity(numel());
687  }
688 
689  void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9, SZ _n10) {
691  size_[0] = _n1;
692  size_[1] = _n2;
693  size_[2] = _n3;
694  size_[3] = _n4;
695  size_[4] = _n5;
696  size_[5] = _n6;
697  size_[6] = _n7;
698  size_[7] = _n8;
699  size_[8] = _n9;
700  size_[9] = _n10;
701  ensureCapacity(numel());
702  }
703 
704  template <size_t N1>
705  array_base<T, SZ, N1> reshape_n(const SZ (&_ns)[N1]) const {
706  array_base<T, SZ, N1> reshaped(const_cast<T*>(&data_[0]), _ns);
707  return reshaped;
708  }
709 
711  const SZ ns[] = {_n1};
712  return reshape_n(ns);
713  }
714 
715  array_base<T, SZ, 2> reshape(SZ _n1, SZ _n2) const {
716  const SZ ns[] = {_n1, _n2};
717  return reshape_n(ns);
718  }
719 
720  array_base<T, SZ, 3> reshape(SZ _n1, SZ _n2, SZ _n3) const {
721  const SZ ns[] = {_n1, _n2, _n3};
722  return reshape_n(ns);
723  }
724 
725  array_base<T, SZ, 4> reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4) const {
726  const SZ ns[] = {_n1, _n2, _n3, _n4};
727  return reshape_n(ns);
728  }
729 
730  array_base<T, SZ, 5> reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5) const {
731  const SZ ns[] = {_n1, _n2, _n3, _n4, _n5};
732  return reshape_n(ns);
733  }
734 
735  array_base<T, SZ, 6> reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6) const {
736  const SZ ns[] = {_n1, _n2, _n3, _n4, _n5, _n6};
737  return reshape_n(ns);
738  }
739 
740  array_base<T, SZ, 7> reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7) const {
741  const SZ ns[] = {_n1, _n2, _n3, _n4, _n5, _n6, _n7};
742  return reshape_n(ns);
743  }
744 
745  array_base<T, SZ, 8> reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8)
746  const {
747  const SZ ns[] = {_n1, _n2, _n3, _n4, _n5, _n6, _n7, _n8};
748  return reshape_n(ns);
749  }
750 
752  reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9) const {
753  const SZ ns[] = {_n1, _n2, _n3, _n4, _n5, _n6, _n7, _n8, _n9};
754  return reshape_n(ns);
755  }
756 
758  reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9, SZ _n10) const {
759  const SZ ns[] = {_n1, _n2, _n3, _n4, _n5, _n6, _n7, _n8, _n9, _n10};
760  return reshape_n(ns);
761  }
762 
763  T& operator[](SZ _index) {
764  return data_[_index];
765  }
766 
767  const T& operator[](SZ _index) const {
768  return data_[_index];
769  }
770 
771  void clear() {
772  data_.clear();
773  }
774 
775  T* data() {
776  return data_;
777  }
778 
779  const T* data() const {
780  return data_;
781  }
782 
783  const SZ* size() const {
784  return &size_[0];
785  }
786 
787  SZ size(SZ _index) const {
788  return size_[_index];
789  }
790 
791  SZ numel() const {
792  return ::coder::detail::numel<N>::compute(size_);
793  }
794 
795  SZ index(SZ _n1) const {
797  const SZ indices[] = {_n1};
798  return ::coder::detail::index_nd<1>::compute(size_, indices);
799  }
800  SZ index(SZ _n1, SZ _n2) const {
802  const SZ indices[] = {_n1, _n2};
803  return ::coder::detail::index_nd<2>::compute(size_, indices);
804  }
805  SZ index(SZ _n1, SZ _n2, SZ _n3) const {
807  const SZ indices[] = {_n1, _n2, _n3};
808  return ::coder::detail::index_nd<3>::compute(size_, indices);
809  }
810  SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4) const {
812  const SZ indices[] = {_n1, _n2, _n3, _n4};
813  return ::coder::detail::index_nd<4>::compute(size_, indices);
814  }
815  SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5) const {
817  const SZ indices[] = {_n1, _n2, _n3, _n4, _n5};
818  return ::coder::detail::index_nd<5>::compute(size_, indices);
819  }
820  SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6) const {
822  const SZ indices[] = {_n1, _n2, _n3, _n4, _n5, _n6};
823  return ::coder::detail::index_nd<6>::compute(size_, indices);
824  }
825  SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7) const {
827  const SZ indices[] = {_n1, _n2, _n3, _n4, _n5, _n6, _n7};
828  return ::coder::detail::index_nd<7>::compute(size_, indices);
829  }
830  SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8) const {
832  const SZ indices[] = {_n1, _n2, _n3, _n4, _n5, _n6, _n7, _n8};
833  return ::coder::detail::index_nd<8>::compute(size_, indices);
834  }
835  SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9) const {
837  const SZ indices[] = {_n1, _n2, _n3, _n4, _n5, _n6, _n7, _n8, _n9};
838  return ::coder::detail::index_nd<9>::compute(size_, indices);
839  }
840  SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9, SZ _n10)
841  const {
843  const SZ indices[] = {_n1, _n2, _n3, _n4, _n5, _n6, _n7, _n8, _n9, _n10};
844  return ::coder::detail::index_nd<10>::compute(size_, indices);
845  }
846 
847  T& at(SZ _i1) {
849  return data_[_i1];
850  }
851  T& at(SZ _i1, SZ _i2) {
853  return data_[index(_i1, _i2)];
854  }
855  T& at(SZ _i1, SZ _i2, SZ _i3) {
857  return data_[index(_i1, _i2, _i3)];
858  }
859  T& at(SZ _i1, SZ _i2, SZ _i3, SZ _i4) {
861  return data_[index(_i1, _i2, _i3, _i4)];
862  }
863  T& at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5) {
865  return data_[index(_i1, _i2, _i3, _i4, _i5)];
866  }
867  T& at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6) {
869  return data_[index(_i1, _i2, _i3, _i4, _i5, _i6)];
870  }
871  T& at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7) {
873  return data_[index(_i1, _i2, _i3, _i4, _i5, _i6, _i7)];
874  }
875  T& at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8) {
877  return data_[index(_i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8)];
878  }
879  T& at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8, SZ _i9) {
881  return data_[index(_i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8, _i9)];
882  }
883  T& at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8, SZ _i9, SZ _i10) {
885  return data_[index(_i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8, _i9, _i10)];
886  }
887 
888  const T& at(SZ _i1) const {
890  return data_[_i1];
891  }
892  const T& at(SZ _i1, SZ _i2) const {
894  return data_[index(_i1, _i2)];
895  }
896  const T& at(SZ _i1, SZ _i2, SZ _i3) const {
898  return data_[index(_i1, _i2, _i3)];
899  }
900  const T& at(SZ _i1, SZ _i2, SZ _i3, SZ _i4) const {
902  return data_[index(_i1, _i2, _i3, _i4)];
903  }
904  const T& at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5) const {
906  return data_[index(_i1, _i2, _i3, _i4, _i5)];
907  }
908  const T& at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6) const {
910  return data_[index(_i1, _i2, _i3, _i4, _i5, _i6)];
911  }
912  const T& at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7) const {
914  return data_[index(_i1, _i2, _i3, _i4, _i5, _i6, _i7)];
915  }
916  const T& at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8) const {
918  return data_[index(_i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8)];
919  }
920  const T& at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8, SZ _i9) const {
922  return data_[index(_i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8, _i9)];
923  }
924  const T& at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8, SZ _i9, SZ _i10)
925  const {
927  return data_[index(_i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8, _i9, _i10)];
928  }
929 
931  return array_iterator<array_base<T, SZ, N> >(this, 0);
932  }
934  return array_iterator<array_base<T, SZ, N> >(this, this->numel());
935  }
938  }
940  return const_array_iterator<array_base<T, SZ, N> >(this, this->numel());
941  }
942 
943  protected:
945  SZ size_[N];
946 
947  private:
948  void ensureCapacity(SZ _newNumel) {
949  if (_newNumel > data_.capacity()) {
950  SZ i = data_.capacity();
951  if (i < 16) {
952  i = 16;
953  }
954 
955  while (i < _newNumel) {
956  if (i > 1073741823) {
957  i = MAX_int32_T;
958  } else {
959  i <<= 1;
960  }
961  }
962  data_.reserve(i);
963  }
964  data_.resize(_newNumel);
965  }
966 };
967 
968 // The standard coder::array class with base type and number of dimensions.
969 template <typename T, int N>
970 class array : public array_base<T, SizeType, N> {
971  private:
972  typedef array_base<T, SizeType, N> Base;
973 
974  public:
976  : Base() {
977  }
978  array(const array<T, N>& _other)
979  : Base(_other) {
980  }
981  array(const Base& _other)
982  : Base(_other) {
983  }
984  array(T* _data, const SizeType* _sz)
985  : Base(_data, _sz) {
986  }
987 };
988 
989 // Specialize on char_T (row vector) for better support on strings.
990 template <>
991 class array<char_T, 2> : public array_base<char_T, SizeType, 2> {
992  private:
993  typedef array_base<char_T, SizeType, 2> Base;
994 
995  public:
997  : array_base() {
998  }
999  array(const array<char_T, 2>& _other)
1000  : Base(_other) {
1001  }
1002  array(const Base& _other)
1003  : Base(_other) {
1004  }
1005 
1006  array(const std::string& _str) {
1007  operator=(_str);
1008  }
1009 
1010  array(const char_T* _str) {
1011  operator=(_str);
1012  }
1013 
1014  array(const std::vector<char_T>& _vec) {
1015  SizeType n = static_cast<SizeType>(_vec.size());
1016  set_size(1, n);
1017  data_.copy(&_vec[0], n);
1018  }
1019 
1020  array& operator=(const std::string& _str) {
1021  SizeType n = static_cast<SizeType>(_str.size());
1022  set_size(1, n);
1023  data_.copy(_str.c_str(), n);
1024  return *this;
1025  }
1026 
1027  array& operator=(const char_T* _str) {
1028  SizeType n = static_cast<SizeType>(strlen(_str));
1029  set_size(1, n);
1030  data_.copy(_str, n);
1031  return *this;
1032  }
1033 
1034  operator std::string() const {
1035  return std::string(static_cast<const char*>(&(*this)[0]), static_cast<int>(size(1)));
1036  }
1037 };
1038 
1039 // Specialize on 2 dimensions for better support interactions with
1040 // std::vector and row vectors.
1041 template <typename T>
1042 class array<T, 2> : public array_base<T, SizeType, 2> {
1043  private:
1044  typedef array_base<T, SizeType, 2> Base;
1045 
1046  public:
1048  : Base() {
1049  }
1050  array(const array<T, 2>& _other)
1051  : Base(_other) {
1052  }
1053  array(const Base& _other)
1054  : Base(_other) {
1055  }
1056  array(const std::vector<T>& _vec) {
1057  operator=(_vec);
1058  }
1059 
1060  array& operator=(const std::vector<T>& _vec) {
1061  SizeType n = static_cast<SizeType>(_vec.size());
1062  Base::set_size(1, n);
1063  Base::data_.copy(&_vec[0], n);
1064  return *this;
1065  }
1066 
1067  operator std::vector<T>() const {
1068  const T* p = &Base::data_[0];
1069  return std::vector<T>(p, p + Base::numel());
1070  }
1071 };
1072 
1073 // Specialize on 1 dimension for better support with std::vector and
1074 // column vectors.
1075 template <typename T>
1076 class array<T, 1> : public array_base<T, SizeType, 1> {
1077  private:
1078  typedef array_base<T, SizeType, 1> Base;
1079 
1080  public:
1082  : Base() {
1083  }
1084  array(const array<T, 1>& _other)
1085  : Base(_other) {
1086  }
1087  array(const Base& _other)
1088  : Base(_other) {
1089  }
1090  array(const std::vector<T>& _vec) {
1091  operator=(_vec);
1092  }
1093 
1094  array& operator=(const std::vector<T>& _vec) {
1095  SizeType n = static_cast<SizeType>(_vec.size());
1096  Base::set_size(n);
1097  Base::data_.copy(&_vec[0], n);
1098  return *this;
1099  }
1100 
1101  operator std::vector<T>() const {
1102  const T* p = &Base::data_[0];
1103  return std::vector<T>(p, p + Base::numel());
1104  }
1105 };
1106 
1107 } // namespace coder
1108 
1109 #endif
array(const std::string &_str)
Definition: coder_array.h:1006
const T::value_type * operator->() const
Definition: coder_array.h:326
array_iterator< array_base< T, SZ, N > > begin()
Definition: coder_array.h:930
#define true
Definition: tmwtypes.h:803
array_iterator< T > operator+(typename T::size_type _add) const
Definition: coder_array.h:275
const T * operator->() const
Definition: coder_array.h:173
SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5) const
Definition: coder_array.h:815
static SZ compute(SZ[])
Definition: coder_array.h:421
const T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6) const
Definition: coder_array.h:908
array_base< T, SZ, 6 > reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6) const
Definition: coder_array.h:735
T::value_type * operator->() const
Definition: coder_array.h:229
array_iterator< T > operator--(int)
Definition: coder_array.h:248
array(const std::vector< T > &_vec)
Definition: coder_array.h:1056
Definition: Base.h:55
#define MAX_int32_T
Definition: tmwtypes.h:705
const T & operator[](SZ _index) const
Definition: coder_array.h:165
array_base< T, SZ, 10 > reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9, SZ _n10) const
Definition: coder_array.h:758
T & at(SZ _i1)
Definition: coder_array.h:847
::coder::detail::data_ptr< T, SZ > data_
Definition: coder_array.h:944
const_array_iterator< array_base< T, SZ, N > > begin() const
Definition: coder_array.h:936
void copy(const T *_data, SZ _size)
Definition: coder_array.h:135
array_iterator< T > & operator+=(typename T::size_type _add)
Definition: coder_array.h:280
const T * data() const
Definition: coder_array.h:779
array_base< T, SZ, 8 > reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8) const
Definition: coder_array.h:745
bool operator>(const array_iterator< T > &_other) const
Definition: coder_array.h:266
const_array_iterator< T > & operator--()
Definition: coder_array.h:336
array & operator=(const std::vector< T > &_vec)
Definition: coder_array.h:1094
const_array_iterator< T > operator-(typename T::size_type _subtract) const
Definition: coder_array.h:381
#define CODER_NEW(T, N)
Definition: coder_array.h:56
bool operator==(const const_array_iterator< T > &_other) const
Definition: coder_array.h:354
array(const Base &_other)
Definition: coder_array.h:1002
const_array_iterator< array_base< T, SZ, N > > end() const
Definition: coder_array.h:939
const_array_iterator(const const_array_iterator< T > &other)
Definition: coder_array.h:317
const T & at(SZ _i1) const
Definition: coder_array.h:888
const T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8, SZ _i9, SZ _i10) const
Definition: coder_array.h:924
T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8, SZ _i9, SZ _i10)
Definition: coder_array.h:883
void set_size(SZ _n1)
Definition: coder_array.h:599
array_base< T, SZ, 5 > reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5) const
Definition: coder_array.h:730
T::size_type operator-(const array_iterator< T > &_other) const
Definition: coder_array.h:293
T::value_type & operator[](typename T::size_type _di) const
Definition: coder_array.h:232
SZ size(SZ _index) const
Definition: coder_array.h:787
SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8) const
Definition: coder_array.h:830
array_iterator< array_base< T, SZ, N > > end()
Definition: coder_array.h:933
array_base< T, SZ, 2 > reshape(SZ _n1, SZ _n2) const
Definition: coder_array.h:715
const T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7) const
Definition: coder_array.h:912
void copy(const data_ptr< T, SZ > &_other)
Definition: coder_array.h:150
array_base< T, SZ, N1 > reshape_n(const SZ(&_ns)[N1]) const
Definition: coder_array.h:705
T & at(SZ _i1, SZ _i2)
Definition: coder_array.h:851
bool operator>(const const_array_iterator< T > &_other) const
Definition: coder_array.h:363
array_iterator< T > & operator=(const array_iterator< T > &_other)
Definition: coder_array.h:253
const T::value_type & operator[](typename T::size_type _di) const
Definition: coder_array.h:329
array_iterator< T > operator++(int)
Definition: coder_array.h:243
T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6)
Definition: coder_array.h:867
T::value_type & operator*() const
Definition: coder_array.h:226
array(const std::vector< T > &_vec)
Definition: coder_array.h:1090
T & operator[](SZ _index)
Definition: coder_array.h:763
array & operator=(const std::string &_str)
Definition: coder_array.h:1020
array_iterator< T > & operator-=(typename T::size_type _subtract)
Definition: coder_array.h:289
array(const Base &_other)
Definition: coder_array.h:1087
array_iterator< T > & operator--()
Definition: coder_array.h:239
const T & at(SZ _i1, SZ _i2, SZ _i3) const
Definition: coder_array.h:896
const T & at(SZ _i1, SZ _i2) const
Definition: coder_array.h:892
static SZ compute(const SZ _size[], const SZ _indices[])
Definition: coder_array.h:431
SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6) const
Definition: coder_array.h:820
const T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8, SZ _i9) const
Definition: coder_array.h:920
const_array_iterator< T > operator--(int)
Definition: coder_array.h:345
bool operator>=(const const_array_iterator< T > &_other) const
Definition: coder_array.h:369
array_base & operator=(const array_base &_other)
Definition: coder_array.h:475
void set_size(SZ _n1, SZ _n2)
Definition: coder_array.h:605
SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7) const
Definition: coder_array.h:825
array(const char_T *_str)
Definition: coder_array.h:1010
array(const std::vector< char_T > &_vec)
Definition: coder_array.h:1014
array(const array< T, N > &_other)
Definition: coder_array.h:978
array_iterator(const array_iterator< T > &other)
Definition: coder_array.h:220
const T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5) const
Definition: coder_array.h:904
#define false
Definition: tmwtypes.h:800
void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7)
Definition: coder_array.h:650
SZ index(SZ _n1, SZ _n2, SZ _n3) const
Definition: coder_array.h:805
void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4)
Definition: coder_array.h:620
array(const Base &_other)
Definition: coder_array.h:1053
T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8)
Definition: coder_array.h:875
array_base< T, SZ, 3 > reshape(SZ _n1, SZ _n2, SZ _n3) const
Definition: coder_array.h:720
T::size_type operator-(const const_array_iterator< T > &_other) const
Definition: coder_array.h:392
void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9, SZ _n10)
Definition: coder_array.h:689
const_array_iterator< T > & operator=(const const_array_iterator< T > &_other)
Definition: coder_array.h:350
array(const array< T, 2 > &_other)
Definition: coder_array.h:1050
data_ptr(T *_data, SZ _sz)
Definition: coder_array.h:77
T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7)
Definition: coder_array.h:871
CHARACTER_T char_T
Definition: tmwtypes.h:562
const complex< double > I
Definition: ophAS.h:14
const T & operator[](SZ _index) const
Definition: coder_array.h:767
void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6)
Definition: coder_array.h:639
array & operator=(const std::vector< T > &_vec)
Definition: coder_array.h:1060
T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4)
Definition: coder_array.h:859
data_ptr(const data_ptr &_other)
Definition: coder_array.h:84
array_base< T, SZ, 1 > reshape(SZ _n1) const
Definition: coder_array.h:710
const_array_iterator< T > operator+(typename T::size_type _add) const
Definition: coder_array.h:372
void set_owner(bool _b)
Definition: coder_array.h:195
void set_size(SZ _n1, SZ _n2, SZ _n3)
Definition: coder_array.h:612
const T::value_type & operator*() const
Definition: coder_array.h:323
const_array_iterator< T > & operator-=(typename T::size_type _subtract)
Definition: coder_array.h:387
#define CODER_DELETE(P)
Definition: coder_array.h:57
array_base< T, SZ, 4 > reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4) const
Definition: coder_array.h:725
array_base< T, SZ, 7 > reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7) const
Definition: coder_array.h:740
array(const array< char_T, 2 > &_other)
Definition: coder_array.h:999
T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8, SZ _i9)
Definition: coder_array.h:879
T & operator[](SZ _index)
Definition: coder_array.h:162
bool is_owner() const
Definition: coder_array.h:587
static SZ compute(SZ[], SZ[])
Definition: coder_array.h:441
SZ index(SZ _n1, SZ _n2) const
Definition: coder_array.h:800
void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5)
Definition: coder_array.h:629
void set_owner(bool b)
Definition: coder_array.h:591
bool operator==(const array_iterator< T > &_other) const
Definition: coder_array.h:257
SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9, SZ _n10) const
Definition: coder_array.h:840
int32_T SizeType
Definition: coder_array.h:60
array(const Base &_other)
Definition: coder_array.h:981
const_array_iterator< T > & operator+=(typename T::size_type _add)
Definition: coder_array.h:377
T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5)
Definition: coder_array.h:863
SZ numel() const
Definition: coder_array.h:791
SZ index(SZ _n1) const
Definition: coder_array.h:795
const SZ * size() const
Definition: coder_array.h:783
const_array_iterator(const T *_arr, typename T::size_type _i)
Definition: coder_array.h:396
array & operator=(const char_T *_str)
Definition: coder_array.h:1027
void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8)
Definition: coder_array.h:662
array(const array< T, 1 > &_other)
Definition: coder_array.h:1084
SZ capacity() const
Definition: coder_array.h:595
array_base< T, SZ, 9 > reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9) const
Definition: coder_array.h:752
array_iterator< T > operator-(typename T::size_type _subtract) const
Definition: coder_array.h:284
array_iterator< T > & operator++()
Definition: coder_array.h:235
SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4) const
Definition: coder_array.h:810
bool operator>=(const array_iterator< T > &_other) const
Definition: coder_array.h:272
const T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4) const
Definition: coder_array.h:900
bool operator!=(const const_array_iterator< T > &_other) const
Definition: coder_array.h:357
array_iterator(T *_arr, typename T::size_type _i)
Definition: coder_array.h:297
T & at(SZ _i1, SZ _i2, SZ _i3)
Definition: coder_array.h:855
const_array_iterator< T > operator++(int)
Definition: coder_array.h:340
const T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8) const
Definition: coder_array.h:916
const_array_iterator< T > & operator++()
Definition: coder_array.h:332
array_base(T *_data, const SZ *_sz)
Definition: coder_array.h:470
static SZ compute(SZ _size[])
Definition: coder_array.h:413
SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9) const
Definition: coder_array.h:835
array(T *_data, const SizeType *_sz)
Definition: coder_array.h:984
void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9)
Definition: coder_array.h:675
bool operator!=(const array_iterator< T > &_other) const
Definition: coder_array.h:260