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