#ifndef __XIOS_ARRAY_HPP__ #define __XIOS_ARRAY_HPP__ #define BZ_COLUMN_MAJOR_ARRAY #include #include "buffer_in.hpp" #include "buffer_out.hpp" #include "message.hpp" using namespace blitz ; namespace xios { template class CArray : public Array, public virtual CBaseType { public : using Array::operator = ; typedef typename Array::T_default_storage T_default_storage; template explicit CArray(_bz_ArrayExpr expr) : Array(expr) {} CArray(GeneralArrayStorage storage=T_default_storage()) : Array(storage) {} explicit CArray(int length0,GeneralArrayStorage storage=T_default_storage() ) : Array(length0,storage ) {} CArray(int length0, int length1, GeneralArrayStorage storage=T_default_storage() ) : Array(length0, length1, storage ) {} CArray(int length0, int length1, int length2, GeneralArrayStorage storage=T_default_storage() ) : Array(length0, length1, length2, storage ) {} CArray(int length0, int length1, int length2, int length3, GeneralArrayStorage storage=T_default_storage() ) : Array(length0, length1, length2, length3, storage ) {} CArray(int length0, int length1, int length2, int length3, int length4, GeneralArrayStorage storage=T_default_storage() ) : Array(length0,length1, length2, length3, length4, storage ) {} CArray(int length0, int length1, int length2, int length3, int length4, int length5, GeneralArrayStorage storage=T_default_storage() ) : Array(length0, length1, length2, length3, length4, length5, storage ) {} CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, GeneralArrayStorage storage=T_default_storage() ) : Array(length0, length1, length2, length3, length4, length5, length6, storage ) {} CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, int length7, GeneralArrayStorage storage=T_default_storage() ) : Array(length0, length1, length2, length3, length4, length5, length6, length7, storage ) {} CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, int length7, int length8, GeneralArrayStorage storage=T_default_storage() ) : Array(length0, length1, length2, length3, length4, length5, length6, length7, length8, storage ) {} CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, int length7, int length8, int length9, GeneralArrayStorage storage=T_default_storage() ) : Array(length0, length1, length2, length3, length4, length5, length6, length7, length8, length9, storage ) {} CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, int length7, int length8, int length9, int length10, GeneralArrayStorage storage=T_default_storage() ) : Array(length0, length1, length2, length3, length4, length5, length6, length7, length8, length9, length10, storage ) {} CArray(T_numtype* restrict dataFirst, TinyVector shape, GeneralArrayStorage storage=T_default_storage() ) : Array(dataFirst, shape, storage ) {} CArray(T_numtype* restrict dataFirst, TinyVector shape, TinyVector stride, GeneralArrayStorage storage=T_default_storage()) : Array(dataFirst, shape, stride, storage ) {} CArray(T_numtype* restrict dataFirst, TinyVector shape, preexistingMemoryPolicy deletionPolicy, GeneralArrayStorage storage=T_default_storage()) : Array(dataFirst, shape, deletionPolicy, storage) {} CArray(T_numtype* restrict dataFirst, TinyVector shape, TinyVector stride, preexistingMemoryPolicy deletionPolicy, GeneralArrayStorage storage=T_default_storage()) : Array(dataFirst, shape, stride, deletionPolicy, storage) {} CArray(const TinyVector& extent, GeneralArrayStorage storage=T_default_storage()) : Array(extent, storage) {} CArray(const TinyVector& lbounds, const TinyVector& extent, const GeneralArrayStorage& storage ) : Array(lbounds, extent, storage ) {} CArray(Range r0, GeneralArrayStorage storage=T_default_storage() ) : CArray(r0, storage ) {} CArray(Range r0, Range r1, GeneralArrayStorage storage=T_default_storage() ) : Array(r0, r1, storage ) {} CArray(Range r0, Range r1, Range r2, GeneralArrayStorage storage=T_default_storage() ) : Array(r0, r1, r2, storage ) {} CArray(Range r0, Range r1, Range r2, Range r3, GeneralArrayStorage storage=T_default_storage() ) : Array(r0, r1, r2, r3, storage ) {} CArray(Range r0, Range r1, Range r2, Range r3, Range r4, GeneralArrayStorage storage=T_default_storage() ) : Array(r0, r1, r2, r3, r4, storage ) {} CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, GeneralArrayStorage storage=T_default_storage() ) : Array(r0, r1, r2, r3, r4, r5, storage ) {} CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, GeneralArrayStorage storage=T_default_storage() ) : Array(r0, r1, r2, r3, r4, r5, r6, storage ) {} CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, Range r7, GeneralArrayStorage storage=T_default_storage() ) : Array(r0, r1, r2, r3, r4, r5, r6, r7, storage ) {} CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, Range r7, Range r8, GeneralArrayStorage storage=T_default_storage() ) : Array(r0, r1, r2, r3, r4, r5, r6, r7, r8, storage ) {} CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, Range r7, Range r8, Range r9, GeneralArrayStorage storage=T_default_storage() ) : Array(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, storage ) {} CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, Range r7, Range r8, Range r9, Range r10, GeneralArrayStorage storage=T_default_storage() ) : Array(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, storage ) {} CArray(const Array& array) : Array(array) {} CArray(const TinyVector& shape, int lastExtent, const GeneralArrayStorage& storage) : Array(shape, lastExtent, storage) {} CArray(Array& array, Range r0) : Array(array, r0) {} CArray(Array& array, Range r0, Range r1) : Array(array, r0, r1) {} CArray(Array& array, Range r0, Range r1, Range r2) : Array( array, r0, r1, r2) {} CArray(Array& array, Range r0, Range r1, Range r2, Range r3) : Array(array, r0, r1, r2, r3) {} CArray(Array& array, Range r0, Range r1, Range r2, Range r3, Range r4) : Array(array, r0, r1, r2, r3, r4) {} CArray(Array& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5) : Array( array, r0, r1, r2, r3, r4, r5) {} CArray(Array& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6) : Array( array, r0, r1, r2, r3, r4, r5, r6) {} CArray(Array& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, Range r7) : Array(array, r0, r1, r2, r3, r4, r5, r6, r7) {} CArray(Array& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, Range r7, Range r8) : Array(array, r0, r1, r2, r3, r4, r5, r6, r7, r8) {} CArray(Array& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, Range r7, Range r8, Range r9) : Array(array, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) {} CArray(Array& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, Range r7, Range r8, Range r9, Range r10) : Array(array, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10) {} CArray(Array& array, const RectDomain& subdomain) : Array(array, subdomain) {} CArray(Array& array, const StridedDomain& subdomain) : Array(array, subdomain) {} template CArray(Array& array, R0 r0, R1 r1, R2 r2, R3 r3, R4 r4, R5 r5, R6 r6, R7 r7, R8 r8, R9 r9, R10 r10) : Array(array, r0,r1, r2, r3, r4, r5, r6, r7, r8, r9, r10) {} virtual ~CArray() {} virtual void fromString(const string& str) { istringstream iss(str) ; iss>>*this ; } virtual string toString(void) const { ostringstream oss ; oss<<*this ; return oss.str() ; } virtual void reset(void) { this->free(); } virtual bool isEmpty(void) const { if (this->numElements()==0) return true; else return false; } virtual size_t size(void) const { return (this->dimensions()+1)*sizeof(int)+sizeof(size_t) + this->numElements()*sizeof(T_numtype) ;} virtual CBaseType* clone(void) const { return new CArray(*this); } virtual bool toBuffer(CBufferOut& buffer) const { bool ret ; ret=buffer.put(this->dimensions()) ; ret&=buffer.put(this->shape().data(),this->dimensions()) ; ret&=buffer.put(this->numElements()) ; ret&=buffer.put(this->dataFirst(),this->numElements()) ; return ret ; } virtual bool fromBuffer(CBufferIn& buffer) { bool ret ; int numDim ; TinyVector vect; size_t ne; ret=buffer.get(numDim) ; ret&=buffer.get(vect.data(),N_rank) ; this->resize(vect) ; ret&=buffer.get(ne) ; ret&=buffer.get(this->dataFirst(),ne) ; return ret ; } } ; template inline CBufferOut& operator<<(CBufferOut& buffer, const CArray& array) { if (!array.toBuffer(buffer)) ERROR(" template inline CBufferOut& operator<<(CBufferOut& buffer, const CArray& array)", << "Buffer remain size is to low for size type") ; return buffer ; } template inline CBufferIn& operator>>(CBufferIn& buffer, CArray& array) { if (!array.fromBuffer(buffer)) ERROR("template inline CBufferIn& operator>>(CBufferIn& buffer, CArray& array)", <<"Buffer remain size is to low for size type"); return buffer ; } template inline CMessage& operator<<(CMessage& msg, const CArray& array) { msg.push(array) ; return msg ; } template inline CMessage& operator<<(CMessage& msg, CArray& array) { msg.push(array) ; return msg ; } } #endif