Changeset View
Changeset View
Standalone View
Standalone View
src/timedata.h
Show All 19 Lines | |||||
*/ | */ | ||||
template <typename T> class CMedianFilter { | template <typename T> class CMedianFilter { | ||||
private: | private: | ||||
std::vector<T> vValues; | std::vector<T> vValues; | ||||
std::vector<T> vSorted; | std::vector<T> vSorted; | ||||
unsigned int nSize; | unsigned int nSize; | ||||
public: | public: | ||||
CMedianFilter(unsigned int size, T initial_value) : nSize(size) { | CMedianFilter(unsigned int _size, T initial_value) : nSize(_size) { | ||||
vValues.reserve(size); | vValues.reserve(_size); | ||||
vValues.push_back(initial_value); | vValues.push_back(initial_value); | ||||
vSorted = vValues; | vSorted = vValues; | ||||
} | } | ||||
void input(T value) { | void input(T value) { | ||||
if (vValues.size() == nSize) { | if (vValues.size() == nSize) { | ||||
vValues.erase(vValues.begin()); | vValues.erase(vValues.begin()); | ||||
} | } | ||||
vValues.push_back(value); | vValues.push_back(value); | ||||
vSorted.resize(vValues.size()); | vSorted.resize(vValues.size()); | ||||
std::copy(vValues.begin(), vValues.end(), vSorted.begin()); | std::copy(vValues.begin(), vValues.end(), vSorted.begin()); | ||||
std::sort(vSorted.begin(), vSorted.end()); | std::sort(vSorted.begin(), vSorted.end()); | ||||
} | } | ||||
T median() const { | T median() const { | ||||
int size = vSorted.size(); | int vSortedSize = vSorted.size(); | ||||
assert(size > 0); | assert(vSortedSize > 0); | ||||
if (vSortedSize & 1) { | |||||
if (size & 1) { | |||||
// Odd number of elements | // Odd number of elements | ||||
return vSorted[size / 2]; | return vSorted[vSortedSize / 2]; | ||||
} else { | } else { | ||||
// Even number of elements | // Even number of elements | ||||
return (vSorted[size / 2 - 1] + vSorted[size / 2]) / 2; | return (vSorted[vSortedSize / 2 - 1] + vSorted[vSortedSize / 2]) / | ||||
2; | |||||
} | } | ||||
} | } | ||||
int size() const { return vValues.size(); } | int size() const { return vValues.size(); } | ||||
std::vector<T> sorted() const { return vSorted; } | std::vector<T> sorted() const { return vSorted; } | ||||
}; | }; | ||||
/** Functions to keep track of adjusted P2P time */ | /** Functions to keep track of adjusted P2P time */ | ||||
int64_t GetTimeOffset(); | int64_t GetTimeOffset(); | ||||
int64_t GetAdjustedTime(); | int64_t GetAdjustedTime(); | ||||
void AddTimeData(const CNetAddr &ip, int64_t nTime); | void AddTimeData(const CNetAddr &ip, int64_t nTime); | ||||
#endif // BITCOIN_TIMEDATA_H | #endif // BITCOIN_TIMEDATA_H |