00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef HxNgbMean_h
00010 #define HxNgbMean_h
00011
00012 #include "HxClassName.h"
00013 #include "HxSizes.h"
00014 #include "HxNgbOpCategory.h"
00015 #include "HxTagList.h"
00016
00017
00018 template<class ResultT, class ArithT>
00019 class HxNgbMean
00020 {
00021 public:
00022
00023 typedef HxNgbLoopTag IteratorCategory;
00024 typedef HxNgb1PhaseTag PhaseCategory;
00025 typedef HxNgbTransInVarTag TransVarianceCategory;
00026
00027
00028 HxNgbMean(HxTagList& tags);
00029
00030 HxSizes size();
00031 void init();
00032
00033 void next(int, int, ArithT value);
00034 void next(int, int, int, ArithT value);
00035 ArithT result() const;
00036
00037 static HxString className();
00038
00039 private:
00040 ResultT _sum;
00041 int _cnt;
00042 HxSizes _size;
00043 };
00044
00045 template<class ResultT, class ArithT>
00046 inline HxString
00047 HxNgbMean<ResultT, ArithT>::className()
00048 {
00049 static HxString s("mean");
00050 return s;
00051 }
00052
00053 template<class ResultT, class ArithT>
00054 inline void
00055 HxNgbMean<ResultT, ArithT>::init()
00056 {
00057 _cnt = 0;
00058 _sum = HxScalarInt(0);
00059 }
00060
00061 template<class ResultT, class ArithT>
00062 inline void
00063 HxNgbMean<ResultT, ArithT>::next(int, int, ArithT value)
00064 {
00065 _cnt++;
00066 _sum += ResultT(value);
00067 }
00068
00069 template<class ResultT, class ArithT>
00070 inline void
00071 HxNgbMean<ResultT, ArithT>::next(int, int, int, ArithT value)
00072 {
00073 _cnt++;
00074 _sum += ResultT(value);
00075 }
00076
00077 template<class ResultT, class ArithT>
00078 inline HxSizes
00079 HxNgbMean<ResultT, ArithT>::size()
00080 {
00081 return _size;
00082 }
00083
00084 template<class ResultT, class ArithT>
00085 inline ArithT
00086 HxNgbMean<ResultT, ArithT>::result() const
00087 {
00088 return _sum / ResultT(HxScalarInt(_cnt));
00089 }
00090
00091 #ifdef INC_TEMPLATE_SRC
00092 #include "HxNgbMean.c"
00093 #endif
00094
00095 #endif