Branch data Line data Source code
1 : : // Copyright (c) 2014-2022 The Bitcoin Core developers 2 : : // Distributed under the MIT software license, see the accompanying 3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 : : 5 : : #ifndef BITCOIN_TIMEDATA_H 6 : : #define BITCOIN_TIMEDATA_H 7 : : 8 : : #include <util/time.h> 9 : : 10 : : #include <algorithm> 11 : : #include <cassert> 12 : : #include <chrono> 13 : : #include <cstdint> 14 : : #include <vector> 15 : : 16 : : static const int64_t DEFAULT_MAX_TIME_ADJUSTMENT = 70 * 60; 17 : : 18 : : class CNetAddr; 19 : : 20 : : /** 21 : : * Median filter over a stream of values. 22 : : * Returns the median of the last N numbers 23 : : */ 24 : : template <typename T> 25 : : class CMedianFilter 26 : : { 27 : : private: 28 : : std::vector<T> vValues; 29 : : std::vector<T> vSorted; 30 : : unsigned int nSize; 31 : : 32 : : public: 33 : 2 : CMedianFilter(unsigned int _size, T initial_value) : nSize(_size) 34 : : { 35 [ + - ]: 2 : vValues.reserve(_size); 36 [ + - ]: 2 : vValues.push_back(initial_value); 37 [ + - ]: 2 : vSorted = vValues; 38 : 2 : } 39 : : 40 : 0 : void input(T value) 41 : : { 42 [ # # ]: 0 : if (vValues.size() == nSize) { 43 : 0 : vValues.erase(vValues.begin()); 44 : 0 : } 45 : 0 : vValues.push_back(value); 46 : : 47 : 0 : vSorted.resize(vValues.size()); 48 : 0 : std::copy(vValues.begin(), vValues.end(), vSorted.begin()); 49 : 0 : std::sort(vSorted.begin(), vSorted.end()); 50 : 0 : } 51 : : 52 : 0 : T median() const 53 : : { 54 : 0 : int vSortedSize = vSorted.size(); 55 [ # # ]: 0 : assert(vSortedSize > 0); 56 [ # # ]: 0 : if (vSortedSize & 1) // Odd number of elements 57 : : { 58 : 0 : return vSorted[vSortedSize / 2]; 59 : : } else // Even number of elements 60 : : { 61 : 0 : return (vSorted[vSortedSize / 2 - 1] + vSorted[vSortedSize / 2]) / 2; 62 : : } 63 : 0 : } 64 : : 65 : 0 : int size() const 66 : : { 67 : 0 : return vValues.size(); 68 : : } 69 : : 70 : 0 : std::vector<T> sorted() const 71 : : { 72 : 0 : return vSorted; 73 : : } 74 : : }; 75 : : 76 : : /** Functions to keep track of adjusted P2P time */ 77 : : int64_t GetTimeOffset(); 78 : : NodeClock::time_point GetAdjustedTime(); 79 : : void AddTimeData(const CNetAddr& ip, int64_t nTime); 80 : : 81 : : /** 82 : : * Reset the internal state of GetTimeOffset(), GetAdjustedTime() and AddTimeData(). 83 : : */ 84 : : void TestOnlyResetTimeData(); 85 : : 86 : : #endif // BITCOIN_TIMEDATA_H