Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef HISTOGRAM_H_
00037 #define HISTOGRAM_H_
00038
00039 #include <functional>
00040 #include <algorithm>
00041 #include <vector>
00042 #include <structureColoring/histograms/OutOfRangeException.h>
00043
00049 template<class Key, class Value, class BinType = Value>
00050 class Histogram
00051 {
00052 public:
00053 typedef OutOfRangeException OutOfRange;
00054
00060 Histogram(const Key& min, const Key& max, const Key& binSize)
00061 : mMin(min), mMax(max), mBinSize(binSize), mBins(static_cast<size_t>((mMax - mMin)/mBinSize))
00062 {}
00063 BinType& bin(const Key& k) { return mBins[getIdx(k)];}
00064 const BinType& bin(const Key& k) const { return mBins[getIdx(k)];}
00065 void addToBin(const Key& k, const Value& v) { mBins[getIdx(k)] += v;}
00066 void getMaxBin(BinType& bin, Key& k) const { getMaxBin(bin, k, std::less<BinType>());}
00067 template<class Comp>
00068 void getMaxBin(BinType& bin, Key& k, Comp comp) const;
00069 protected:
00070 typedef std::vector<BinType> Bins;
00071 size_t getIdx(const Key& k) const;
00072 Key getKey(const size_t& idx) const;
00073 Key mMin, mMax, mBinSize;
00074 Bins mBins;
00075 };
00076
00077 template<class Key, class Value, class BinType>
00078 size_t Histogram<Key, Value, BinType>::getIdx(const Key& k) const
00079 {
00080 if ((k < mMin) || (k > mMax))
00081 throw OutOfRange("key is out of range");
00082 if (k == mMax)
00083 return mBins.size()-1;
00084 return static_cast<size_t>((k - mMin)/mBinSize);
00085 }
00086
00087 template<class Key, class Value, class BinType>
00088 Key Histogram<Key, Value, BinType>::getKey(const size_t& idx) const
00089 {
00090 return (Key(idx) * mBinSize) + mMin;
00091 }
00092
00093 template<class Key, class Value, class BinType>
00094 template<class Comp>
00095 void Histogram<Key, Value, BinType>::getMaxBin(BinType& bin, Key& k, Comp comp) const
00096 {
00097 typename Bins::const_iterator it = std::max_element(mBins.begin(), mBins.end(), comp);
00098 size_t idx = it - mBins.begin();
00099 k = getKey(idx);
00100 bin = *it;
00101
00102
00103 }
00104
00105 #endif