#ifndef __REDUCE_TRANSFORM_CONNECTOR_HPP__ #define __REDUCE_TRANSFORM_CONNECTOR_HPP__ #include "xios_spl.hpp" #include "array_new.hpp" #include "local_view.hpp" #include "reduction_types.hpp" #include namespace xios { class CReduceTransformConnector { private: CLocalView* srcView_; CLocalView* dstView_; vector connector_; // sizeof sum(nWeights_) vector nSrc_ ; // sizeof dstSize_ int srcSize_ ; int dstSize_ ; bool detectMissingValue_ ; EReduction type_ ; typedef void (CReduceTransformConnector::* transferPtr)(int, int, const CArray& , CArray&) ; transferPtr transfer_ ; void computeConnector(unordered_map>& indexMap) ; public: CReduceTransformConnector(CLocalView* srcView, CLocalView* dstView, EReduction op, unordered_map>& indexMap, bool detectMissingValue=true) ; void transfer(const CArray& dataIn, CArray& dataOut) { transfer(1,1,dataIn, dataOut) ; } void transfer(int sizeT, const CArray& dataIn, CArray& dataOut) { transfer(1,sizeT, dataIn, dataOut) ; } void transfer(int repeat, int sizeT, const CArray& dataIn, CArray& dataOut) { (this->*transfer_)(repeat, sizeT, dataIn, dataOut) ; } private : void transferSum(int repeat, int sizeT, const CArray& dataIn, CArray& dataOut) { double defaultValue = std::numeric_limits::quiet_NaN(); int dstSlice = dstSize_*sizeT ; int srcSlice = srcSize_*sizeT ; dataOut.resize(repeat* dstSlice) ; dataOut=0 ; const double* input = dataIn.dataFirst() ; double* output = dataOut.dataFirst() ; if (detectMissingValue_) { vector touched(repeat* dstSlice, false) ; int pos=0 ; for(int r=0;r& dataIn, CArray& dataOut) { double defaultValue = std::numeric_limits::quiet_NaN(); int dstSlice = dstSize_*sizeT ; int srcSlice = srcSize_*sizeT ; dataOut.resize(repeat* dstSlice) ; dataOut=0 ; const double* input = dataIn.dataFirst() ; double* output = dataOut.dataFirst() ; if (detectMissingValue_) { vector touched(repeat* dstSlice, false) ; int pos=0 ; for(int r=0;r& dataIn, CArray& dataOut) { double defaultValue = std::numeric_limits::quiet_NaN(); int dstSlice = dstSize_*sizeT ; int srcSlice = srcSize_*sizeT ; dataOut.resize(repeat* dstSlice) ; dataOut=0 ; const double* input = dataIn.dataFirst() ; double* output = dataOut.dataFirst() ; if (detectMissingValue_) { vector touched(repeat* dstSlice, false) ; int pos=0 ; for(int r=0;r& dataIn, CArray& dataOut) { double defaultValue = std::numeric_limits::quiet_NaN(); int dstSlice = dstSize_*sizeT ; int srcSlice = srcSize_*sizeT ; dataOut.resize(repeat* dstSlice) ; dataOut=0 ; const double* input = dataIn.dataFirst() ; double* output = dataOut.dataFirst() ; if (detectMissingValue_) { vector touched(repeat* dstSlice, 0) ; int pos=0 ; for(int r=0;r