// Copyright (c) 2014 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; } } 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); /** * Reset the internal state of GetTimeOffset(), GetAdjustedTime() and AddTimeData(). */ void TestOnlyResetTimeData(); #endif // BITCOIN_TIMEDATA_H