9#ifndef CLASSDESC_MULTIARRAY_H
10#define CLASSDESC_MULTIARRAY_H
23 template <
class T,
int Rank>
32#if defined(__cplusplus) && __cplusplus>=201703L
33 void constructDim(
size_t& d,
size_t dd)
38 template <
class...
Args>
39 void constructDims(
size_t d,
Args... args)
42 (constructDim(d,args),...);
44 if (d>0) m_stride/=dim[d-1];
48 void constructDims(
size_t d,
size_t d1)
53 template <
class...
Args>
54 void constructDims(
size_t d,
size_t d1,
Args... args)
58 constructDims(d+1, args...);
64 typedef size_t size_type;
65 static const int rank=Rank;
68 template <
class...
Args>
71 constructDims(0, args...);
78 memcpy(dim, a_dim,
sizeof(dim));
81 size_t size()
const {
return dim[Rank-1];}
82 size_t stride()
const {
return m_stride;}
83 const MultiArray<T,Rank-1> operator[](
size_t i)
const {
84 return MultiArray<T,Rank-1>(m_data+i*m_stride, dim);
87 return MultiArray<T,Rank-1>(m_data+i*m_stride, dim);
95 using difference_type=std::ptrdiff_t;
99 using iterator_category=std::random_access_iterator_tag;
100 using underlying_type=
T;
101 static const int rank=Rank;
105 iterator(
const MultiArray& array): array(array.m_data,array.dim),
106 stride(array.stride()) {}
107 iterator operator++() {advance(array,stride);
return *
this;}
108 iterator operator++(
int)
109 {
auto tmp=*
this; advance(array,stride);
return tmp;}
110 iterator operator--() {advance(array,-stride);
return *
this;}
111 iterator operator--(
int)
112 {
auto tmp=*
this; advance(array,-stride);
return tmp;}
113 iterator operator+=(
size_t i) {advance(array,i*stride);
return *
this;}
115 bool operator==(
const iterator& x)
const {
return array.
same(x.array);}
116 bool operator!=(
const iterator& x)
const {
return !operator==(x);}
118 struct const_iterator:
public iterator
120 const_iterator(
const MultiArray& array): iterator(array) {}
121 const MultiArray<
T,Rank-1>& operator*() {
return iterator::operator*();}
125 iterator end() {
auto tmp=begin(); tmp+=dim[Rank-1];
return tmp;}
126 const_iterator begin()
const {
return MultiArray(*
this);}
127 const_iterator end()
const {
auto tmp=begin(); tmp+=dim[Rank-1];
return tmp;}
135 friend void advance<T,1>(MultiArray<T,1>&,std::ptrdiff_t);
138 typedef T value_type;
139 typedef size_t size_type;
140 static const int rank=1;
141 MultiArray(
T* data,
size_t size): m_data(data), m_size(size) {}
142 MultiArray(
T* data,
const size_t size[]): m_data(data), m_size(size[0]) {}
143 T& operator[](
size_t i) {
return m_data[i];}
144 const T& operator[](
size_t i)
const {
return m_data[i];}
146 typedef const T* const_iterator;
147 T* begin() {
return m_data;}
148 T* end() {
return m_data+m_size;}
149 const T* begin()
const {
return m_data;}
150 const T* end()
const {
return m_data+m_size;}
151 size_t size()
const {
return m_size;}
152 bool same(
const MultiArray& x)
const {
return m_data==x.m_data;}
159 template <
class T,
int R>
Definition multiArray.h:25
bool same(const MultiArray &x) const
return if this refers to the same memory location as x
Definition multiArray.h:91
MultiArray(T *data, const size_t a_dim[])
Definition multiArray.h:76
MultiArray(T *data, Args... args)
Definition multiArray.h:69
Contains definitions related to classdesc functionality.
void advance(MultiArray< T, R > &a, std::ptrdiff_t n)
friended advance function for use in iterators
Definition multiArray.h:160
Definition RESTProcess_epilogue.h:159
base classes for metaprogramming
Definition multiArray.h:19
Definition multiArray.h:20
Definition multiArray.h:119
Definition multiArray.h:94
determines if T is a standard sequence container
Definition classdesc.h:302