1 | #ifndef __XIOS_ARRAY_HPP__ |
---|
2 | #define __XIOS_ARRAY_HPP__ |
---|
3 | |
---|
4 | #define BZ_COLUMN_MAJOR_ARRAY |
---|
5 | #include <blitz/array.h> |
---|
6 | #include "buffer_in.hpp" |
---|
7 | #include "buffer_out.hpp" |
---|
8 | #include "message.hpp" |
---|
9 | |
---|
10 | using namespace blitz ; |
---|
11 | namespace xios |
---|
12 | { |
---|
13 | |
---|
14 | |
---|
15 | template <typename T_numtype,int N_rank> |
---|
16 | class CArray : public Array<T_numtype,N_rank>, public virtual CBaseType |
---|
17 | { |
---|
18 | public : |
---|
19 | using Array<T_numtype,N_rank>::operator = ; |
---|
20 | typedef typename Array<T_numtype,N_rank>::T_default_storage T_default_storage; |
---|
21 | |
---|
22 | template<typename T_expr> explicit CArray(_bz_ArrayExpr<T_expr> expr) : Array<T_numtype,N_rank>(expr) {} |
---|
23 | |
---|
24 | CArray(GeneralArrayStorage<N_rank> storage=T_default_storage()) : Array<T_numtype,N_rank>(storage) {} |
---|
25 | |
---|
26 | explicit CArray(int length0,GeneralArrayStorage<N_rank> storage=T_default_storage() ) : Array<T_numtype,N_rank>(length0,storage ) {} |
---|
27 | |
---|
28 | CArray(int length0, int length1, GeneralArrayStorage<N_rank> storage=T_default_storage() ) : Array<T_numtype,N_rank>(length0, length1, storage ) {} |
---|
29 | |
---|
30 | CArray(int length0, int length1, int length2, GeneralArrayStorage<N_rank> storage=T_default_storage() ) : Array<T_numtype,N_rank>(length0, length1, length2, storage ) {} |
---|
31 | |
---|
32 | CArray(int length0, int length1, int length2, int length3, GeneralArrayStorage<N_rank> storage=T_default_storage() ) |
---|
33 | : Array<T_numtype,N_rank>(length0, length1, length2, length3, storage ) {} |
---|
34 | |
---|
35 | CArray(int length0, int length1, int length2, int length3, int length4, GeneralArrayStorage<N_rank> storage=T_default_storage() ) |
---|
36 | : Array<T_numtype,N_rank>(length0,length1, length2, length3, length4, storage ) {} |
---|
37 | |
---|
38 | CArray(int length0, int length1, int length2, int length3, int length4, int length5, GeneralArrayStorage<N_rank> storage=T_default_storage() ) |
---|
39 | : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, storage ) {} |
---|
40 | |
---|
41 | CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, GeneralArrayStorage<N_rank> storage=T_default_storage() ) |
---|
42 | : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, length6, storage ) {} |
---|
43 | |
---|
44 | CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, int length7, |
---|
45 | GeneralArrayStorage<N_rank> storage=T_default_storage() ) : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, length6, length7, storage ) {} |
---|
46 | |
---|
47 | CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, |
---|
48 | int length7, int length8, GeneralArrayStorage<N_rank> storage=T_default_storage() ) |
---|
49 | : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, length6, length7, length8, storage ) {} |
---|
50 | |
---|
51 | CArray(int length0, int length1, int length2, int length3, int length4, |
---|
52 | int length5, int length6, int length7, int length8, int length9, GeneralArrayStorage<N_rank> storage=T_default_storage() ) |
---|
53 | : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, length6, length7, length8, length9, storage ) {} |
---|
54 | |
---|
55 | CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, |
---|
56 | int length7, int length8, int length9, int length10, GeneralArrayStorage<N_rank> storage=T_default_storage() ) |
---|
57 | : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, length6, length7, length8, |
---|
58 | length9, length10, storage ) {} |
---|
59 | |
---|
60 | |
---|
61 | CArray(T_numtype* restrict dataFirst, TinyVector<int, N_rank> shape, GeneralArrayStorage<N_rank> storage=T_default_storage() ) |
---|
62 | : Array<T_numtype,N_rank>(dataFirst, shape, storage ) {} |
---|
63 | |
---|
64 | CArray(T_numtype* restrict dataFirst, TinyVector<int, N_rank> shape, TinyVector<diffType, N_rank> stride, |
---|
65 | GeneralArrayStorage<N_rank> storage=T_default_storage()) : Array<T_numtype,N_rank>(dataFirst, shape, stride, storage ) {} |
---|
66 | |
---|
67 | CArray(T_numtype* restrict dataFirst, TinyVector<int, N_rank> shape, preexistingMemoryPolicy deletionPolicy, |
---|
68 | GeneralArrayStorage<N_rank> storage=T_default_storage()) : Array<T_numtype,N_rank>(dataFirst, shape, deletionPolicy, storage) {} |
---|
69 | |
---|
70 | CArray(T_numtype* restrict dataFirst, TinyVector<int, N_rank> shape, TinyVector<diffType, N_rank> stride, |
---|
71 | preexistingMemoryPolicy deletionPolicy, GeneralArrayStorage<N_rank> storage=T_default_storage()) |
---|
72 | : Array<T_numtype,N_rank>(dataFirst, shape, stride, deletionPolicy, storage) {} |
---|
73 | |
---|
74 | CArray(const TinyVector<int, N_rank>& extent, GeneralArrayStorage<N_rank> storage=T_default_storage()) |
---|
75 | : Array<T_numtype,N_rank>(extent, storage) {} |
---|
76 | |
---|
77 | CArray(const TinyVector<int, N_rank>& lbounds, const TinyVector<int, N_rank>& extent, |
---|
78 | const GeneralArrayStorage<N_rank>& storage ) : Array<T_numtype,N_rank>(lbounds, extent, storage ) {} |
---|
79 | |
---|
80 | CArray(Range r0, GeneralArrayStorage<N_rank> storage=T_default_storage() ) : CArray(r0, storage ) {} |
---|
81 | |
---|
82 | CArray(Range r0, Range r1, GeneralArrayStorage<N_rank> storage=T_default_storage() ) : Array<T_numtype,N_rank>(r0, r1, storage ) {} |
---|
83 | |
---|
84 | CArray(Range r0, Range r1, Range r2, GeneralArrayStorage<N_rank> storage=T_default_storage() ) |
---|
85 | : Array<T_numtype,N_rank>(r0, r1, r2, storage ) {} |
---|
86 | |
---|
87 | CArray(Range r0, Range r1, Range r2, Range r3, GeneralArrayStorage<N_rank> storage=T_default_storage() ) |
---|
88 | : Array<T_numtype,N_rank>(r0, r1, r2, r3, storage ) {} |
---|
89 | |
---|
90 | CArray(Range r0, Range r1, Range r2, Range r3, Range r4, GeneralArrayStorage<N_rank> storage=T_default_storage() ) |
---|
91 | : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, storage ) {} |
---|
92 | |
---|
93 | CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, GeneralArrayStorage<N_rank> storage=T_default_storage() ) |
---|
94 | : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, storage ) {} |
---|
95 | |
---|
96 | CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, |
---|
97 | GeneralArrayStorage<N_rank> storage=T_default_storage() ) : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, r6, storage ) {} |
---|
98 | |
---|
99 | CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, Range r7, |
---|
100 | GeneralArrayStorage<N_rank> storage=T_default_storage() ) : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, r6, r7, storage ) {} |
---|
101 | |
---|
102 | CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, |
---|
103 | Range r6, Range r7, Range r8, GeneralArrayStorage<N_rank> storage=T_default_storage() ) |
---|
104 | : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, r6, r7, r8, storage ) {} |
---|
105 | |
---|
106 | CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, |
---|
107 | Range r6, Range r7, Range r8, Range r9, GeneralArrayStorage<N_rank> storage=T_default_storage() ) |
---|
108 | : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, storage ) {} |
---|
109 | |
---|
110 | CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, Range r7, |
---|
111 | Range r8, Range r9, Range r10, GeneralArrayStorage<N_rank> storage=T_default_storage() ) |
---|
112 | : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, storage ) {} |
---|
113 | |
---|
114 | CArray(const Array<T_numtype, N_rank>& array) : Array<T_numtype,N_rank>(array) {} |
---|
115 | |
---|
116 | CArray(const TinyVector<int,N_rank-1>& shape, int lastExtent, const GeneralArrayStorage<N_rank>& storage) |
---|
117 | : Array<T_numtype,N_rank>(shape, lastExtent, storage) {} |
---|
118 | |
---|
119 | CArray(Array<T_numtype, N_rank>& array, Range r0) : Array<T_numtype,N_rank>(array, r0) {} |
---|
120 | |
---|
121 | CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1) : Array<T_numtype,N_rank>(array, r0, r1) {} |
---|
122 | |
---|
123 | CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2) : Array<T_numtype,N_rank>( array, r0, r1, r2) {} |
---|
124 | |
---|
125 | CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3) : Array<T_numtype,N_rank>(array, r0, r1, r2, r3) {} |
---|
126 | |
---|
127 | CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, |
---|
128 | Range r3, Range r4) : Array<T_numtype,N_rank>(array, r0, r1, r2, r3, r4) {} |
---|
129 | |
---|
130 | CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, |
---|
131 | Range r3, Range r4, Range r5) : Array<T_numtype,N_rank>( array, r0, r1, r2, r3, r4, r5) {} |
---|
132 | |
---|
133 | CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3, |
---|
134 | Range r4, Range r5, Range r6) : Array<T_numtype,N_rank>( array, r0, r1, r2, r3, r4, r5, r6) {} |
---|
135 | |
---|
136 | CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3, Range r4, |
---|
137 | Range r5, Range r6, Range r7) : Array<T_numtype,N_rank>(array, r0, r1, r2, r3, r4, r5, r6, r7) {} |
---|
138 | |
---|
139 | CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, |
---|
140 | Range r6, Range r7, Range r8) : Array<T_numtype,N_rank>(array, r0, r1, r2, r3, r4, r5, r6, r7, r8) {} |
---|
141 | |
---|
142 | CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, |
---|
143 | Range r6, Range r7, Range r8, Range r9) : Array<T_numtype,N_rank>(array, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) {} |
---|
144 | |
---|
145 | CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, |
---|
146 | Range r7, Range r8, Range r9, Range r10) : Array<T_numtype,N_rank>(array, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10) {} |
---|
147 | |
---|
148 | CArray(Array<T_numtype, N_rank>& array, const RectDomain<N_rank>& subdomain) : Array<T_numtype,N_rank>(array, subdomain) {} |
---|
149 | |
---|
150 | CArray(Array<T_numtype, N_rank>& array, const StridedDomain<N_rank>& subdomain) : Array<T_numtype,N_rank>(array, subdomain) {} |
---|
151 | |
---|
152 | template<int N_rank2, typename R0, typename R1, typename R2, typename R3, typename R4, typename R5, |
---|
153 | typename R6, typename R7, typename R8, typename R9, typename R10> |
---|
154 | CArray(Array<T_numtype,N_rank2>& array, R0 r0, R1 r1, R2 r2, R3 r3, R4 r4, R5 r5, R6 r6, R7 r7, R8 r8, R9 r9, R10 r10) |
---|
155 | : Array<T_numtype,N_rank>(array, r0,r1, r2, r3, r4, r5, r6, r7, r8, r9, r10) {} |
---|
156 | |
---|
157 | virtual ~CArray() {} |
---|
158 | virtual void fromString(const string& str) { istringstream iss(str) ; iss>>*this ; } |
---|
159 | virtual string toString(void) const { ostringstream oss ; oss<<*this ; return oss.str() ; } |
---|
160 | virtual void reset(void) { this->free(); } |
---|
161 | virtual bool isEmpty(void) const { if (this->numElements()==0) return true; else return false; } |
---|
162 | virtual size_t size(void) const { return (this->dimensions()+1)*sizeof(int)+sizeof(size_t) + this->numElements()*sizeof(T_numtype) ;} |
---|
163 | |
---|
164 | virtual CArray* clone(void) const { return new CArray(*this); } |
---|
165 | |
---|
166 | virtual bool toBuffer(CBufferOut& buffer) const |
---|
167 | { |
---|
168 | bool ret ; |
---|
169 | ret=buffer.put(this->dimensions()) ; |
---|
170 | ret&=buffer.put(this->shape().data(),this->dimensions()) ; |
---|
171 | ret&=buffer.put(this->numElements()) ; |
---|
172 | ret&=buffer.put(this->dataFirst(),this->numElements()) ; |
---|
173 | return ret ; |
---|
174 | } |
---|
175 | |
---|
176 | |
---|
177 | virtual bool fromBuffer(CBufferIn& buffer) |
---|
178 | { |
---|
179 | |
---|
180 | bool ret ; |
---|
181 | int numDim ; |
---|
182 | TinyVector<int,N_rank> vect; |
---|
183 | size_t ne; |
---|
184 | |
---|
185 | ret=buffer.get(numDim) ; |
---|
186 | ret&=buffer.get(vect.data(),N_rank) ; |
---|
187 | resize(vect) ; |
---|
188 | ret&=buffer.get(ne) ; |
---|
189 | ret&=buffer.get(this->dataFirst(),ne) ; |
---|
190 | return ret ; |
---|
191 | } |
---|
192 | |
---|
193 | } ; |
---|
194 | |
---|
195 | template <typename T_numtype,int N_rank> inline CBufferOut& operator<<(CBufferOut& buffer, const CArray<T_numtype,N_rank>& array) |
---|
196 | { |
---|
197 | if (!array.toBuffer(buffer)) ERROR(" template <typename T_numtype,int N_rank> inline CBufferOut& operator<<(CBufferOut& buffer, const CArray& array)", |
---|
198 | << "Buffer remain size is to low for size type") ; |
---|
199 | return buffer ; |
---|
200 | } |
---|
201 | |
---|
202 | template <typename T_numtype,int N_rank> inline CBufferIn& operator>>(CBufferIn& buffer, CArray<T_numtype, N_rank>& array) |
---|
203 | { |
---|
204 | if (!array.fromBuffer(buffer)) ERROR("template <typename T_numtype,int N_rank> inline CBufferIn& operator>>(CBufferIn& buffer, CArray& array)", |
---|
205 | <<"Buffer remain size is to low for size type"); |
---|
206 | return buffer ; |
---|
207 | } |
---|
208 | |
---|
209 | template <typename T_numtype,int N_rank> inline CMessage& operator<<(CMessage& msg, const CArray<T_numtype, N_rank>& array) |
---|
210 | { |
---|
211 | msg.push(*array.clone()) ; |
---|
212 | return msg ; |
---|
213 | } |
---|
214 | |
---|
215 | template <typename T_numtype,int N_rank> inline CMessage& operator<<(CMessage& msg, CArray<T_numtype, N_rank>& array) |
---|
216 | { |
---|
217 | msg.push(*array.clone()) ; |
---|
218 | return msg ; |
---|
219 | } |
---|
220 | |
---|
221 | |
---|
222 | } |
---|
223 | |
---|
224 | #endif |
---|