4 #ifndef _mw_coder_array_h 5 #define _mw_coder_array_h 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) 64 #ifndef CODER_ARRAY_DATA_PTR_DEFINED 65 template <
typename T,
typename SZ>
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_) {
91 std::copy(_other.data_, _other.data_ + size_, stdext::checked_array_iterator<T *>(data_, size_));
104 if (_n > capacity_) {
106 std::copy(data_, data_ + size_, stdext::checked_array_iterator<T *>(new_data, size_));
125 void set(T* _data,
const SZ _sz) {
135 void copy(
const T* _data, SZ _size) {
136 if (data_ == _data) {
147 std::copy(_data, _data + _size, stdext::checked_array_iterator<T *>(data_, _size));
151 copy(_other.data_, _other.size_);
158 operator const T*()
const {
163 return data_[_index];
166 return data_[_index];
178 return data_ == NULL;
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> {
232 typename T::value_type&
operator[](
typename T::size_type _di)
const {
233 return (*arr_)[i_ + _di];
254 this->i_ = _other.i_;
258 return i_ == _other.i_;
261 return i_ != _other.i_;
263 bool operator<(const array_iterator<T>& _other)
const {
264 return i_ < _other.i_;
267 return i_ > _other.i_;
269 bool operator<=(const array_iterator<T>& _other)
const {
270 return i_ <= _other.i_;
273 return i_ >= _other.i_;
290 this->i_ -= _subtract;
294 return static_cast<typename T::size_type
>(this->i_ - _other.i_);
304 typename T::size_type i_;
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> {
329 const typename T::value_type&
operator[](
typename T::size_type _di)
const {
330 return (*arr_)[i_ + _di];
351 this->i_ = _other.i_;
355 return i_ == _other.i_;
358 return i_ != _other.i_;
360 bool operator<(const const_array_iterator<T>& _other)
const {
361 return i_ < _other.i_;
364 return i_ > _other.i_;
366 bool operator<=(const const_array_iterator<T>& _other)
const {
367 return i_ <= _other.i_;
370 return i_ >= _other.i_;
388 this->i_ -= _subtract;
393 return static_cast<typename T::size_type
>(this->i_ - _other.i_);
403 typename T::size_type i_, n_;
412 template <
typename SZ>
420 template <
typename SZ>
430 template <
typename SZ>
431 static SZ
compute(
const SZ _size[],
const SZ _indices[]) {
440 template <
typename SZ>
447 struct match_dimensions {};
450 struct match_dimensions<
true> {
460 template <
typename T,
typename SZ,
int N>
467 std::memset(
size_, 0,
sizeof(SZ) * N);
472 std::copy(_sz, _sz + N,
size_);
476 data_.copy(_other.data_);
477 std::copy(_other.size_, _other.size_ + N,
size_);
481 void set(T* _data, SZ _n1) {
483 data_.set(_data, _n1);
487 void set(T* _data, SZ _n1, SZ _n2) {
489 data_.set(_data, _n1 * _n2);
494 void set(T* _data, SZ _n1, SZ _n2, SZ _n3) {
496 data_.set(_data, _n1 * _n2 * _n3);
502 void set(T* _data, SZ _n1, SZ _n2, SZ _n3, SZ _n4) {
504 data_.set(_data, _n1 * _n2 * _n3 * _n4);
511 void set(T* _data, SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5) {
513 data_.set(_data, _n1 * _n2 * _n3 * _n4 * _n5);
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);
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);
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);
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);
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);
588 return data_.is_owner();
596 return data_.capacity();
602 ensureCapacity(
numel());
609 ensureCapacity(
numel());
617 ensureCapacity(
numel());
626 ensureCapacity(
numel());
629 void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5) {
636 ensureCapacity(
numel());
639 void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6) {
647 ensureCapacity(
numel());
650 void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7) {
659 ensureCapacity(
numel());
662 void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8) {
672 ensureCapacity(
numel());
675 void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9) {
686 ensureCapacity(
numel());
689 void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9, SZ _n10) {
701 ensureCapacity(
numel());
711 const SZ ns[] = {_n1};
716 const SZ ns[] = {_n1, _n2};
721 const SZ ns[] = {_n1, _n2, _n3};
726 const SZ ns[] = {_n1, _n2, _n3, _n4};
731 const SZ ns[] = {_n1, _n2, _n3, _n4, _n5};
736 const SZ ns[] = {_n1, _n2, _n3, _n4, _n5, _n6};
741 const SZ ns[] = {_n1, _n2, _n3, _n4, _n5, _n6, _n7};
747 const SZ ns[] = {_n1, _n2, _n3, _n4, _n5, _n6, _n7, _n8};
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};
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};
764 return data_[_index];
768 return data_[_index];
788 return size_[_index];
792 return ::coder::detail::numel<N>::compute(
size_);
797 const SZ indices[] = {_n1};
798 return ::coder::detail::index_nd<1>::compute(
size_, indices);
802 const SZ indices[] = {_n1, _n2};
803 return ::coder::detail::index_nd<2>::compute(
size_, indices);
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);
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);
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);
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);
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);
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);
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);
840 SZ
index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9, SZ _n10)
843 const SZ indices[] = {_n1, _n2, _n3, _n4, _n5, _n6, _n7, _n8, _n9, _n10};
844 return ::coder::detail::index_nd<10>::compute(
size_, indices);
851 T&
at(SZ _i1, SZ _i2) {
855 T&
at(SZ _i1, SZ _i2, SZ _i3) {
859 T&
at(SZ _i1, SZ _i2, SZ _i3, SZ _i4) {
863 T&
at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5) {
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)];
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)];
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)];
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)];
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)];
888 const T&
at(SZ _i1)
const {
892 const T&
at(SZ _i1, SZ _i2)
const {
896 const T&
at(SZ _i1, SZ _i2, SZ _i3)
const {
900 const T&
at(SZ _i1, SZ _i2, SZ _i3, SZ _i4)
const {
904 const T&
at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5)
const {
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)];
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)];
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)];
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)];
924 const T&
at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8, SZ _i9, SZ _i10)
927 return data_[
index(_i1, _i2, _i3, _i4, _i5, _i6, _i7, _i8, _i9, _i10)];
948 void ensureCapacity(SZ _newNumel) {
949 if (_newNumel >
data_.capacity()) {
950 SZ i =
data_.capacity();
955 while (i < _newNumel) {
956 if (i > 1073741823) {
964 data_.resize(_newNumel);
969 template <
typename T,
int N>
970 class array :
public array_base<T, SizeType, N> {
972 typedef array_base<T, SizeType, N>
Base;
991 class array<
char_T, 2> :
public array_base<char_T, SizeType, 2> {
993 typedef array_base<char_T, SizeType, 2>
Base;
1014 array(
const std::vector<char_T>& _vec) {
1034 operator std::string()
const {
1035 return std::string(static_cast<const char*>(&(*
this)[0]), static_cast<int>(
size(1)));
1041 template <
typename T>
1042 class array<T, 2> :
public array_base<T, SizeType, 2> {
1044 typedef array_base<T, SizeType, 2>
Base;
1067 operator std::vector<T>()
const {
1075 template <
typename T>
1076 class array<T, 1> :
public array_base<T, SizeType, 1> {
1078 typedef array_base<T, SizeType, 1>
Base;
1101 operator std::vector<T>()
const {
array(const std::string &_str)
const T::value_type * operator->() const
array_iterator< array_base< T, SZ, N > > begin()
array_iterator< T > operator+(typename T::size_type _add) const
const T * operator->() const
SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5) const
const T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6) const
array_base< T, SZ, 6 > reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6) const
T::value_type * operator->() const
array_iterator< T > operator--(int)
array(const std::vector< T > &_vec)
const T & operator[](SZ _index) const
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
::coder::detail::data_ptr< T, SZ > data_
const_array_iterator< array_base< T, SZ, N > > begin() const
void copy(const T *_data, SZ _size)
array_iterator< T > & operator+=(typename T::size_type _add)
array_base< T, SZ, 8 > reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8) const
bool operator>(const array_iterator< T > &_other) const
const_array_iterator< T > & operator--()
array & operator=(const std::vector< T > &_vec)
const_array_iterator< T > operator-(typename T::size_type _subtract) const
bool operator==(const const_array_iterator< T > &_other) const
array(const Base &_other)
const_array_iterator< array_base< T, SZ, N > > end() const
const_array_iterator(const const_array_iterator< T > &other)
const T & at(SZ _i1) const
const T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8, SZ _i9, SZ _i10) const
T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8, SZ _i9, SZ _i10)
array_base< T, SZ, 5 > reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5) const
T::size_type operator-(const array_iterator< T > &_other) const
T::value_type & operator[](typename T::size_type _di) const
SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8) const
array_iterator< array_base< T, SZ, N > > end()
array_base< T, SZ, 2 > reshape(SZ _n1, SZ _n2) const
const T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7) const
void copy(const data_ptr< T, SZ > &_other)
array_base< T, SZ, N1 > reshape_n(const SZ(&_ns)[N1]) const
bool operator>(const const_array_iterator< T > &_other) const
array_iterator< T > & operator=(const array_iterator< T > &_other)
const T::value_type & operator[](typename T::size_type _di) const
array_iterator< T > operator++(int)
T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6)
T::value_type & operator*() const
array(const std::vector< T > &_vec)
T & operator[](SZ _index)
array & operator=(const std::string &_str)
array_iterator< T > & operator-=(typename T::size_type _subtract)
array(const Base &_other)
array_iterator< T > & operator--()
const T & at(SZ _i1, SZ _i2, SZ _i3) const
const T & at(SZ _i1, SZ _i2) const
static SZ compute(const SZ _size[], const SZ _indices[])
SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6) const
const T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8, SZ _i9) const
const_array_iterator< T > operator--(int)
bool operator>=(const const_array_iterator< T > &_other) const
array_base & operator=(const array_base &_other)
void set_size(SZ _n1, SZ _n2)
SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7) const
array(const char_T *_str)
array(const std::vector< char_T > &_vec)
array(const array< T, N > &_other)
array_iterator(const array_iterator< T > &other)
const T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5) const
void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7)
SZ index(SZ _n1, SZ _n2, SZ _n3) const
void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4)
array(const Base &_other)
T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8)
array_base< T, SZ, 3 > reshape(SZ _n1, SZ _n2, SZ _n3) const
T::size_type operator-(const const_array_iterator< T > &_other) const
void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9, SZ _n10)
const_array_iterator< T > & operator=(const const_array_iterator< T > &_other)
array(const array< T, 2 > &_other)
data_ptr(T *_data, SZ _sz)
T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7)
const complex< double > I
const T & operator[](SZ _index) const
void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6)
array & operator=(const std::vector< T > &_vec)
T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4)
data_ptr(const data_ptr &_other)
array_base< T, SZ, 1 > reshape(SZ _n1) const
const_array_iterator< T > operator+(typename T::size_type _add) const
void set_size(SZ _n1, SZ _n2, SZ _n3)
const T::value_type & operator*() const
const_array_iterator< T > & operator-=(typename T::size_type _subtract)
array_base< T, SZ, 4 > reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4) const
array_base< T, SZ, 7 > reshape(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7) const
array(const array< char_T, 2 > &_other)
T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8, SZ _i9)
T & operator[](SZ _index)
static SZ compute(SZ[], SZ[])
SZ index(SZ _n1, SZ _n2) const
void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5)
bool operator==(const array_iterator< T > &_other) const
SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9, SZ _n10) const
array(const Base &_other)
const_array_iterator< T > & operator+=(typename T::size_type _add)
T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5)
const_array_iterator(const T *_arr, typename T::size_type _i)
array & operator=(const char_T *_str)
void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8)
array(const array< T, 1 > &_other)
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
array_iterator< T > operator-(typename T::size_type _subtract) const
array_iterator< T > & operator++()
SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4) const
bool operator>=(const array_iterator< T > &_other) const
const T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4) const
bool operator!=(const const_array_iterator< T > &_other) const
array_iterator(T *_arr, typename T::size_type _i)
T & at(SZ _i1, SZ _i2, SZ _i3)
const_array_iterator< T > operator++(int)
const T & at(SZ _i1, SZ _i2, SZ _i3, SZ _i4, SZ _i5, SZ _i6, SZ _i7, SZ _i8) const
const_array_iterator< T > & operator++()
array_base(T *_data, const SZ *_sz)
static SZ compute(SZ _size[])
SZ index(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9) const
array(T *_data, const SizeType *_sz)
void set_size(SZ _n1, SZ _n2, SZ _n3, SZ _n4, SZ _n5, SZ _n6, SZ _n7, SZ _n8, SZ _n9)
bool operator!=(const array_iterator< T > &_other) const