1 // Copyright (c) 2014-2018 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 <algorithm>
9 #include <assert.h>
10 #include <stdint.h>
11 #include <vector>
12 
13 static const int64_t DEFAULT_MAX_TIME_ADJUSTMENT = 70 * 60;
14 
15 class CNetAddr;
16 
17 /**
18  * Median filter over a stream of values.
19  * Returns the median of the last N numbers
20  */
21 template <typename T>
22 class CMedianFilter
23 {
24 private:
25     std::vector<T> vValues;
26     std::vector<T> vSorted;
27     unsigned int nSize;
28 
29 public:
CMedianFilter(unsigned int _size,T initial_value)30     CMedianFilter(unsigned int _size, T initial_value) : nSize(_size)
31     {
32         vValues.reserve(_size);
33         vValues.push_back(initial_value);
34         vSorted = vValues;
35     }
36 
input(T value)37     void input(T value)
38     {
39         if (vValues.size() == nSize) {
40             vValues.erase(vValues.begin());
41         }
42         vValues.push_back(value);
43 
44         vSorted.resize(vValues.size());
45         std::copy(vValues.begin(), vValues.end(), vSorted.begin());
46         std::sort(vSorted.begin(), vSorted.end());
47     }
48 
median()49     T median() const
50     {
51         int vSortedSize = vSorted.size();
52         assert(vSortedSize > 0);
53         if (vSortedSize & 1) // Odd number of elements
54         {
55             return vSorted[vSortedSize / 2];
56         } else // Even number of elements
57         {
58             return (vSorted[vSortedSize / 2 - 1] + vSorted[vSortedSize / 2]) / 2;
59         }
60     }
61 
size()62     int size() const
63     {
64         return vValues.size();
65     }
66 
sorted()67     std::vector<T> sorted() const
68     {
69         return vSorted;
70     }
71 };
72 
73 /** Functions to keep track of adjusted P2P time */
74 int64_t GetTimeOffset();
75 int64_t GetAdjustedTime();
76 void AddTimeData(const CNetAddr& ip, int64_t nTime);
77 
78 #endif // BITCOIN_TIMEDATA_H
79