source: XIOS/trunk/src/array_new.hpp @ 463

Last change on this file since 463 was 404, checked in by ymipsl, 11 years ago

Little syntaxic correction for llvm compiler used sometime on MAC-OS architecture

YM

File size: 12.1 KB
Line 
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
10using namespace blitz ;
11namespace xios
12{
13
14   
15template <typename T_numtype,int N_rank>
16class 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 CBaseType* 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    this->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) ;
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) ;
218    return msg ;
219  }
220
221 
222}
223
224#endif
Note: See TracBrowser for help on using the repository browser.