Merge #12079: Improve prioritisetransaction test coverage
[bitcoinplatinum.git] / src / timedata.h
blob23584f67e52aff65997a6cee9da509a2ab9664ad
1 // Copyright (c) 2014-2017 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.
5 #ifndef BITCOIN_TIMEDATA_H
6 #define BITCOIN_TIMEDATA_H
8 #include <algorithm>
9 #include <assert.h>
10 #include <stdint.h>
11 #include <vector>
13 static const int64_t DEFAULT_MAX_TIME_ADJUSTMENT = 70 * 60;
15 class CNetAddr;
17 /**
18 * Median filter over a stream of values.
19 * Returns the median of the last N numbers
21 template <typename T>
22 class CMedianFilter
24 private:
25 std::vector<T> vValues;
26 std::vector<T> vSorted;
27 unsigned int nSize;
29 public:
30 CMedianFilter(unsigned int _size, T initial_value) : nSize(_size)
32 vValues.reserve(_size);
33 vValues.push_back(initial_value);
34 vSorted = vValues;
37 void input(T value)
39 if (vValues.size() == nSize) {
40 vValues.erase(vValues.begin());
42 vValues.push_back(value);
44 vSorted.resize(vValues.size());
45 std::copy(vValues.begin(), vValues.end(), vSorted.begin());
46 std::sort(vSorted.begin(), vSorted.end());
49 T median() const
51 int vSortedSize = vSorted.size();
52 assert(vSortedSize > 0);
53 if (vSortedSize & 1) // Odd number of elements
55 return vSorted[vSortedSize / 2];
56 } else // Even number of elements
58 return (vSorted[vSortedSize / 2 - 1] + vSorted[vSortedSize / 2]) / 2;
62 int size() const
64 return vValues.size();
67 std::vector<T> sorted() const
69 return vSorted;
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);
78 #endif // BITCOIN_TIMEDATA_H