// Copyright (c) 2014 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef NOVACOIN_TIMEDATA_H #define NOVACOIN_TIMEDATA_H #include #include #include 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 { size_t size = vSorted.size(); assert(size>0); if(size & 1) // Odd number of elements { return vSorted[size/2]; } else // Even number of elements { return (vSorted[size/2-1] + vSorted[size/2]) / 2; } } int size() const { return static_cast(vValues.size()); } std::vector sorted () const { return vSorted; } }; // Functions to keep track of adjusted P2P time int64_t GetAdjustedTime(); int64_t GetTimeOffset(); int64_t GetNodesOffset(); void AddTimeData(const CNetAddr& ip, int64_t nTime); #endif // NOVACOIN_TIMEDATA_H