QDP++
qdp_arrays.h
Go to the documentation of this file.
1// -*- C++ -*-
5
6#ifndef __QDP_ARRAYS_H__
7#define __QDP_ARRAYS_H__
8
9#include <vector>
10
11namespace QDP
12{
13
14 //----------------------------------------------------------------------------------
15 //----------------------------------------------------------------------------------
17 template<typename T> class Array1dO
18 {
19 public:
21 explicit Array1dO(int n) {d.resize(n);} // initialize
23
25 Array1dO(const Array1dO& s): d(s.d) {}
26
28 Array1dO(const multi1d<T>& s) {
29 d.resize(s.size());
30 for(int i=0; i < s.size(); ++i)
31 d[i] = s[i];
32 }
33
35 Array1dO(const std::vector<T>& s) : d(s) {}
36
37 void resize(int n) {d.resize(n);}
38 int size() const {return d.size();}
39
40 Array1dO& operator=(const Array1dO& s) {d = s.d; return *this;}
41
43 T& operator[](int i) {return d[i-1];}
44
46 const T& operator[](int i) const {return d[i-1];}
47
49 void push_back(const T& s1) {d.push_back(s1);}
50
52 const std::vector<T>& ref() const {return d;}
53
55 std::vector<T>& ref() {return d;}
56
57 private:
58 std::vector<T> d;
59 };
60
61
62 //----------------------------------------------------------------------------------
64 template<typename T> class Array2dO
65 {
66 public:
68 explicit Array2dO(int n) {d.resize(n,n);} // initialize
69 explicit Array2dO(int n2, int n1) {d.resize(n2,n1);} // initialize
71
73 Array2dO(const Array2dO& s): d(s.d) {}
74
75 void resize(int n2, int n1) {d.resize(n2,n1);}
76 void resize(int n) {d.resize(n,n);}
77 int size() const {return d.size1();}
78 int size1() const {return d.size1();}
79 int size2() const {return d.size2();}
80
82 int nrows() const {return d.size2();}
83 int ncols() const {return d.size1();}
84
85 Array2dO& operator=(const Array2dO& s) {d = s.d; return *this;}
86
88 template<typename T1>
89 Array2dO<T>& operator=(const T1& s1) {d = s1; return *this;}
90
92 T& operator()(int i, int j) {return d(i-1,j-1);}
93
95 const T& operator()(int i, int j) const {return d(i-1,j-1);}
96
98 const multi2d<T>& ref() const {return d;}
99
101 multi2d<T>& ref() {return d;}
102
103 private:
104 multi2d<T> d;
105 };
106
107
108 //----------------------------------------------------------------------------------
110 template<typename T> class Array3dO
111 {
112 public:
114 explicit Array3dO(int n) {d.resize(n,n,n);} // initialize
115 explicit Array3dO(int n3, int n2, int n1) {d.resize(n3,n2,n1);} // initialize
117
119 Array3dO(const Array3dO& s): d(s.d) {}
120
121 void resize(int n3, int n2, int n1) {d.resize(n3,n2,n1);}
122 void resize(int n) {d.resize(n,n,n);}
123 int size() const {return d.size1();}
124 int size1() const {return d.size1();}
125 int size2() const {return d.size2();}
126 int size3() const {return d.size3();}
127
129 int leftSize() const {return d.size3();}
130 int middleSize() const {return d.size2();}
131 int rightSize() const {return d.size1();}
132
133 Array3dO& operator=(const Array3dO& s) {d = s.d; return *this;}
134
136 template<typename T1>
137 Array3dO<T>& operator=(const T1& s1) {d = s1; return *this;}
138
140 T& operator()(int i, int j, int k) {return d(i-1,j-1,k-1);}
141
143 const T& operator()(int i, int j, int k) const {return d(i-1,j-1,k-1);}
144
146 const multi3d<T>& ref() const {return d;}
147
149 multi3d<T>& ref() {return d;}
150
151
152 private:
153 multi3d<T> d;
154 };
155
156
157 //----------------------------------------------------------------------------------
159 template<typename T> class Array4dO
160 {
161 public:
163 explicit Array4dO(int n) {d.resize(n,n,n,n);} // initialize
164 explicit Array4dO(int n4, int n3, int n2, int n1) {d.resize(n4,n3,n2,n1);} // initialize
166
168 Array4dO(const Array4dO& s): d(s.d) {}
169
170 void resize(int n4, int n3, int n2, int n1) {d.resize(n4,n3,n2,n1);}
171 void resize(int n) {d.resize(n,n,n,n);}
172 int size() const {return d.size1();}
173 int size1() const {return d.size1();}
174 int size2() const {return d.size2();}
175 int size3() const {return d.size3();}
176 int size4() const {return d.size4();}
177
178 Array4dO& operator=(const Array4dO& s) {d = s.d; return *this;}
179
181 template<typename T1>
182 Array4dO<T>& operator=(const T1& s1) {d = s1; return *this;}
183
185 T& operator()(int i, int j, int k, int l) {return d(i-1,j-1,k-1,l-1);}
186
188 const T& operator()(int i, int j, int k, int l) const {return d(i-1,j-1,k-1,l-1);}
189
191 const multi4d<T>& ref() const {return d;}
192
194 multi4d<T>& ref() {return d;}
195
196
197 private:
198 multi4d<T> d;
199 };
200
201
202 //----------------------------------------------------------------------------------
204 template<typename T> class Array5dO
205 {
206 public:
208 explicit Array5dO(int n) {d.resize(n,n,n,n,n);} // initialize
209 explicit Array5dO(int n5,int n4, int n3, int n2, int n1) {d.resize(n5,n4,n3,n2,n1);} // initialize
211
213 Array5dO(const Array5dO& s): d(s.d) {}
214
215 void resize(int n5, int n4, int n3, int n2, int n1) {d.resize(n5,n4,n3,n2,n1);}
216 void resize(int n) {d.resize(n,n,n,n,n);}
217 int size() const {return d.size1();}
218 int size1() const {return d.size1();}
219 int size2() const {return d.size2();}
220 int size3() const {return d.size3();}
221 int size4() const {return d.size4();}
222 int size5() const {return d.size5();}
223
224 Array5dO& operator=(const Array5dO& s) {d = s.d; return *this;}
225
227 template<typename T1>
228 Array5dO<T>& operator=(const T1& s1) {d = s1; return *this;}
229
231 T& operator()(int i, int j, int k, int l, int m) {return d(i-1,j-1,k-1,l-1,m-1);}
232
234 const T& operator()(int i, int j, int k, int l, int m) const {return d(i-1,j-1,k-1,l-1,m-1);}
235
237 const multi5d<T>& ref() const {return d;}
238
240 multi5d<T>& ref() {return d;}
241
242
243 private:
244 multi5d<T> d;
245 };
246
247
248 //---------------------------------------------------------------
249 // Basic math support
250 //
252 template< typename T>
253 inline
255 {
256 Array1dO<T> d(a.size());
257 for(int i=0; i < d.size(); ++i)
258 d.ref()[i] = -a.ref()[i];
259 return d;
260 }
261
263 template< typename T>
264 inline
265 Array1dO<T> operator*(const T& s, const Array1dO<T>& a)
266 {
267 Array1dO<T> c(a.size());
268 for(int i=0; i < c.size(); ++i)
269 c.ref()[i] = s * a.ref()[i];
270 return c;
271 }
272
274 template< typename T>
275 inline
276 Array1dO<T> operator/(const Array1dO<T>& a, const T& s)
277 {
278 Array1dO<T> c(a.size());
279 for(int i=0; i < c.size(); ++i)
280 c.ref()[i] = a.ref()[i] / s;
281 return c;
282 }
283
284
285#if 0
286 //------------------------------------------------
288 template< typename T>
289 inline
290 Array3dO<T> operator-(const Array3dO<T>& a)
291 {
292 Array3dO<T> d;
293 d.ref() = -a.ref();
294 return d;
295 }
296
298 template< typename T>
299 inline
300 Array3dO<T> operator*(const T& s, const Array3dO<T>& a)
301 {
302 Array3dO<T> c;
303 c = s * a.ref();
304 return c;
305 }
306
308 template< typename T>
309 inline
310 Array3dO<T> operator/(const Array3dO<T>& a, const T& s)
311 {
312 Array3dO<T> c;
313 c = a.ref() / s;
314 return c;
315 }
316#endif
317
318
319} // end namespace QDP
320
321#endif
1d array, with 1-based indices
Definition qdp_arrays.h:18
const std::vector< T > & ref() const
Return ref to underlying array.
Definition qdp_arrays.h:52
Array1dO & operator=(const Array1dO &s)
Definition qdp_arrays.h:40
T & operator[](int i)
Return ref to an element.
Definition qdp_arrays.h:43
int size() const
Definition qdp_arrays.h:38
Array1dO(const Array1dO &s)
Copy constructor.
Definition qdp_arrays.h:25
void resize(int n)
Definition qdp_arrays.h:37
Array1dO(const multi1d< T > &s)
Copy constructor from a zero-based array.
Definition qdp_arrays.h:28
Array1dO(const std::vector< T > &s)
Copy constructor from a zero-based array.
Definition qdp_arrays.h:35
void push_back(const T &s1)
Append to a vector - it will grow.
Definition qdp_arrays.h:49
const T & operator[](int i) const
Return const ref to an element.
Definition qdp_arrays.h:46
Array1dO(int n)
Definition qdp_arrays.h:21
std::vector< T > & ref()
Return ref to underlying array.
Definition qdp_arrays.h:55
Array2dO(int n)
Definition qdp_arrays.h:68
Array2dO< T > & operator=(const T1 &s1)
Equal operator uses underlying = of T.
Definition qdp_arrays.h:89
const multi2d< T > & ref() const
Return ref to underlying array.
Definition qdp_arrays.h:98
multi2d< T > & ref()
Return ref to underlying array.
Definition qdp_arrays.h:101
int size1() const
Definition qdp_arrays.h:78
Array2dO(int n2, int n1)
Definition qdp_arrays.h:69
int size() const
Definition qdp_arrays.h:77
int size2() const
Definition qdp_arrays.h:79
void resize(int n2, int n1)
Definition qdp_arrays.h:75
void resize(int n)
Definition qdp_arrays.h:76
const T & operator()(int i, int j) const
Return const ref to an element.
Definition qdp_arrays.h:95
int ncols() const
Definition qdp_arrays.h:83
int nrows() const
Another variant on the size of the 2d array.
Definition qdp_arrays.h:82
Array2dO & operator=(const Array2dO &s)
Definition qdp_arrays.h:85
T & operator()(int i, int j)
Return ref to an element.
Definition qdp_arrays.h:92
Array2dO(const Array2dO &s)
Copy constructor.
Definition qdp_arrays.h:73
3d array, with 1-based indices
Definition qdp_arrays.h:111
int leftSize() const
Another variant on the size of the 3d array.
Definition qdp_arrays.h:129
int size1() const
Definition qdp_arrays.h:124
const multi3d< T > & ref() const
Return ref to underlying array.
Definition qdp_arrays.h:146
void resize(int n3, int n2, int n1)
Definition qdp_arrays.h:121
Array3dO(const Array3dO &s)
Copy constructor.
Definition qdp_arrays.h:119
Array3dO(int n3, int n2, int n1)
Definition qdp_arrays.h:115
int middleSize() const
Definition qdp_arrays.h:130
int size3() const
Definition qdp_arrays.h:126
const T & operator()(int i, int j, int k) const
Return const ref to an element.
Definition qdp_arrays.h:143
T & operator()(int i, int j, int k)
Return ref to an element.
Definition qdp_arrays.h:140
int rightSize() const
Definition qdp_arrays.h:131
int size2() const
Definition qdp_arrays.h:125
int size() const
Definition qdp_arrays.h:123
void resize(int n)
Definition qdp_arrays.h:122
Array3dO< T > & operator=(const T1 &s1)
Equal operator uses underlying = of T.
Definition qdp_arrays.h:137
Array3dO(int n)
Definition qdp_arrays.h:114
multi3d< T > & ref()
Return ref to underlying array.
Definition qdp_arrays.h:149
Array3dO & operator=(const Array3dO &s)
Definition qdp_arrays.h:133
Array4dO & operator=(const Array4dO &s)
Definition qdp_arrays.h:178
multi4d< T > & ref()
Return ref to underlying array.
Definition qdp_arrays.h:194
const T & operator()(int i, int j, int k, int l) const
Return const ref to an element.
Definition qdp_arrays.h:188
int size4() const
Definition qdp_arrays.h:176
void resize(int n4, int n3, int n2, int n1)
Definition qdp_arrays.h:170
Array4dO(int n4, int n3, int n2, int n1)
Definition qdp_arrays.h:164
int size3() const
Definition qdp_arrays.h:175
Array4dO(const Array4dO &s)
Copy constructor.
Definition qdp_arrays.h:168
Array4dO(int n)
Definition qdp_arrays.h:163
T & operator()(int i, int j, int k, int l)
Return ref to an element.
Definition qdp_arrays.h:185
Array4dO< T > & operator=(const T1 &s1)
Equal operator uses underlying = of T.
Definition qdp_arrays.h:182
int size2() const
Definition qdp_arrays.h:174
int size1() const
Definition qdp_arrays.h:173
const multi4d< T > & ref() const
Return ref to underlying array.
Definition qdp_arrays.h:191
void resize(int n)
Definition qdp_arrays.h:171
int size() const
Definition qdp_arrays.h:172
const multi5d< T > & ref() const
Return ref to underlying array.
Definition qdp_arrays.h:237
void resize(int n)
Definition qdp_arrays.h:216
int size() const
Definition qdp_arrays.h:217
Array5dO & operator=(const Array5dO &s)
Definition qdp_arrays.h:224
int size4() const
Definition qdp_arrays.h:221
int size5() const
Definition qdp_arrays.h:222
Array5dO(int n5, int n4, int n3, int n2, int n1)
Definition qdp_arrays.h:209
const T & operator()(int i, int j, int k, int l, int m) const
Return const ref to an element.
Definition qdp_arrays.h:234
int size2() const
Definition qdp_arrays.h:219
multi5d< T > & ref()
Return ref to underlying array.
Definition qdp_arrays.h:240
Array5dO(int n)
Definition qdp_arrays.h:208
int size1() const
Definition qdp_arrays.h:218
void resize(int n5, int n4, int n3, int n2, int n1)
Definition qdp_arrays.h:215
T & operator()(int i, int j, int k, int l, int m)
Return ref to an element.
Definition qdp_arrays.h:231
int size3() const
Definition qdp_arrays.h:220
Array5dO(const Array5dO &s)
Copy constructor.
Definition qdp_arrays.h:213
Array5dO< T > & operator=(const T1 &s1)
Equal operator uses underlying = of T.
Definition qdp_arrays.h:228
Container for a multi-dimensional 1D array.
Definition qdp_multi.h:25
int size() const
Size of array.
Definition qdp_multi.h:60
Container for a multi-dimensional 2D array.
Definition qdp_multi.h:640
Container for a multi-dimensional 3D array.
Definition qdp_multi.h:733
Container for a multi-dimensional 4D array.
Definition qdp_multi.h:832
Container for a multi-dimensional 5D array.
Definition qdp_multi.h:928
Yet another random number generator.
MakeReturn< BinaryNode< OpMultiply, typenameCreateLeaf< QDPType< T1, C1 > >::Leaf_t, typenameCreateLeaf< QDPExpr< T2, C2 > >::Leaf_t >, typenameBinaryReturn< C1, C2, OpMultiply >::Type_t >::Expression_t operator*(const QDPType< T1, C1 > &l, const QDPExpr< T2, C2 > &r)
Definition qdp.h:2588
MakeReturn< BinaryNode< OpSubtract, typenameCreateLeaf< QDPType< T1, C1 > >::Leaf_t, typenameCreateLeaf< QDPExpr< T2, C2 > >::Leaf_t >, typenameBinaryReturn< C1, C2, OpSubtract >::Type_t >::Expression_t operator-(const QDPType< T1, C1 > &l, const QDPExpr< T2, C2 > &r)
Definition qdp.h:2572
MakeReturn< BinaryNode< OpDivide, typenameCreateLeaf< QDPType< T1, C1 > >::Leaf_t, typenameCreateLeaf< QDPExpr< T2, C2 > >::Leaf_t >, typenameBinaryReturn< C1, C2, OpDivide >::Type_t >::Expression_t operator/(const QDPType< T1, C1 > &l, const QDPExpr< T2, C2 > &r)
Definition qdp.h:2604