diff --git a/src/timedata.h b/src/timedata.h index 91aac47e84..5de2072c0d 100644 --- a/src/timedata.h +++ b/src/timedata.h @@ -1,68 +1,69 @@ // Copyright (c) 2014-2016 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_TIMEDATA_H #define BITCOIN_TIMEDATA_H #include #include #include #include static const int64_t DEFAULT_MAX_TIME_ADJUSTMENT = 70 * 60; class CNetAddr; /** * Median filter over a stream of values. * Returns the median of the last N numbers */ template class CMedianFilter { private: std::vector vValues; std::vector vSorted; unsigned int nSize; public: CMedianFilter(unsigned int _size, T initial_value) : nSize(_size) { vValues.reserve(_size); vValues.push_back(initial_value); vSorted = vValues; } void input(T value) { if (vValues.size() == nSize) { vValues.erase(vValues.begin()); } vValues.push_back(value); vSorted.resize(vValues.size()); std::copy(vValues.begin(), vValues.end(), vSorted.begin()); std::sort(vSorted.begin(), vSorted.end()); } T median() const { int vSortedSize = vSorted.size(); assert(vSortedSize > 0); if (vSortedSize & 1) { // Odd number of elements return vSorted[vSortedSize / 2]; } else { // Even number of elements - return (vSorted[vSortedSize / 2 - 1] + vSorted[vSortedSize / 2]) / - 2; + auto left = vSorted[vSortedSize / 2 - 1]; + auto right = vSorted[vSortedSize / 2]; + return left / 2 + right / 2 + (left & right & 1); } } int size() const { return vValues.size(); } std::vector sorted() const { return vSorted; } }; /** Functions to keep track of adjusted P2P time */ int64_t GetTimeOffset(); int64_t GetAdjustedTime(); void AddTimeData(const CNetAddr &ip, int64_t nTime); #endif // BITCOIN_TIMEDATA_H