git / moonbite-core / src/timedata.h · raw
// Copyright (c) 2014-2018 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 <algorithm>#include <assert.h>#include <stdint.h>#include <vector>static const int64_t DEFAULT_MAX_TIME_ADJUSTMENT = 35 * 60;class CNetAddr;/** * Median filter over a stream of values. * Returns the median of the last N numbers */template <typename T>class CMedianFilter{private: std::vector<T> vValues; std::vector<T> 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<T> 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