// PAB #ifndef _GSUM64_EXT_H_ #define _GSUM64_EXT_H_ #include #include #include CPS_START_NAMESPACE enum GsumReduceType { SumReduce, MinReduce, MaxReduce }; template class TypeSafeReducer { // always assume sizeof(Tp) < sizeof(double) = 8 public: Tp result; inline void convert(double * tgt, Tp * src) { *(Tp*)tgt = *src; } inline void convert(Tp * tgt, const double * src) { *tgt = *(const Tp*)src; } inline Tp Reduce(double ** buf, int size, GsumReduceType type) { switch(type) { case SumReduce: Sum(buf,size); break; case MinReduce: Min(buf,size); break; case MaxReduce: Max(buf,size); break; } return result; } inline Tp Sum(double ** buf, int size) { Tp res, dat; convert(&res, buf[0]); for(int i=1;idat?res:dat); } return (result = res); } inline Tp Min(double ** buf, int size) { Tp res, dat; convert(&res,buf[0]); for(int i=1;i