00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef HxNgbPercentile2d_h
00011 #define HxNgbPercentile2d_h
00012
00013 #include "HxClassName.h"
00014 #include "HxSizes.h"
00015 #include "HxCategories.h"
00016 #include "HxTagList.h"
00017
00018
00021 template<class ArithT>
00022 class HxNgbPercentile2d
00023 {
00024 public:
00025
00027 typedef HxTagLoop IteratorCategory;
00028
00030 typedef HxTag1Phase PhaseCategory;
00031
00032
00037 HxNgbPercentile2d(HxTagList& tags);
00038
00040 ~HxNgbPercentile2d();
00041
00043 HxSizes size();
00044
00046 void init(int, int, ArithT);
00047
00049 void next(int x, int y, ArithT value);
00050
00052 ArithT result() const;
00053
00055 static HxString className();
00056
00057 private:
00058 int _pctIdx;
00059 int _size;
00060
00061 ArithT* _values;
00062 int _i;
00063 };
00064
00065 template<class ArithT>
00066 ostream&
00067 operator<<(ostream& os, const HxNgbPercentile2d<ArithT>& pct)
00068 {
00069 return pct.put(os);
00070 }
00071
00072 template<class ArithT>
00073 inline HxString
00074 HxNgbPercentile2d<ArithT>::className()
00075 {
00076 static HxString s("percentile");
00077 return s;
00078 }
00079
00080 template<class ArithT>
00081 inline void
00082 HxNgbPercentile2d<ArithT>::init(int, int, ArithT)
00083 {
00084 _i = 0;
00085 }
00086
00087 template<class ArithT>
00088 inline void
00089 HxNgbPercentile2d<ArithT>::next(int, int, ArithT value)
00090 {
00091 _values[_i++] = value;
00092 }
00093
00094 template<class ArithT>
00095 inline HxSizes
00096 HxNgbPercentile2d<ArithT>::size()
00097 {
00098 return HxSizes(_size, _size, 1);
00099 }
00100
00101 template<class ArithT>
00102 inline ArithT
00103 HxNgbPercentile2d<ArithT>::result() const
00104 {
00105 std::sort(&_values[0], &_values[_size*_size]);
00106 return _values[_pctIdx];
00107 }
00108
00109 #ifdef INC_TEMPLATE_SRC
00110 #include "HxNgbPercentile2d.c"
00111 #endif
00112
00113 #endif