PIVX Core  5.6.99
P2P Digital Currency
timedata.h
Go to the documentation of this file.
1 // Copyright (c) 2014 The Bitcoin developers
2 // Copyright (c) 2019-2020 The PIVX Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #ifndef PIVX_TIMEDATA_H
7 #define PIVX_TIMEDATA_H
8 
9 #include <algorithm>
10 #include <assert.h>
11 #include <stdint.h>
12 #include <vector>
13 
14 class CNetAddr;
15 
20 template <typename T>
22 {
23 private:
24  std::vector<T> vValues;
25  std::vector<T> vSorted;
26  unsigned int nSize;
27 
28 public:
29  CMedianFilter(unsigned int size, T initial_value) : nSize(size)
30  {
31  vValues.reserve(size);
32  vValues.push_back(initial_value);
33  vSorted = vValues;
34  }
35 
36  void input(T value)
37  {
38  if (vValues.size() == nSize) {
39  vValues.erase(vValues.begin());
40  }
41  vValues.push_back(value);
42 
43  vSorted.resize(vValues.size());
44  std::copy(vValues.begin(), vValues.end(), vSorted.begin());
45  std::sort(vSorted.begin(), vSorted.end());
46  }
47 
48  T median() const
49  {
50  int size = vSorted.size();
51  assert(size > 0);
52  if (size & 1) // Odd number of elements
53  {
54  return vSorted[size / 2];
55  } else // Even number of elements
56  {
57  return (vSorted[size / 2 - 1] + vSorted[size / 2]) / 2;
58  }
59  }
60 
61  int size() const
62  {
63  return vValues.size();
64  }
65 
66  std::vector<T> sorted() const
67  {
68  return vSorted;
69  }
70 };
71 
73 inline int64_t abs64(int64_t n) { return (n >= 0 ? n : -n); }
74 int64_t GetTimeOffset();
75 int64_t GetAdjustedTime();
76 void AddTimeData(const CNetAddr& ip, int64_t nTime, int nOffsetLimit);
77 
78 // Time Protocol V2
79 int64_t GetTimeSlot(const int64_t nTime);
80 int64_t GetCurrentTimeSlot();
81 
82 #endif // PIVX_TIMEDATA_H
CService ip(uint32_t i)
Definition: DoS_tests.cpp:39
Median filter over a stream of values.
Definition: timedata.h:22
CMedianFilter(unsigned int size, T initial_value)
Definition: timedata.h:29
std::vector< T > sorted() const
Definition: timedata.h:66
int size() const
Definition: timedata.h:61
unsigned int nSize
Definition: timedata.h:26
std::vector< T > vSorted
Definition: timedata.h:25
T median() const
Definition: timedata.h:48
void input(T value)
Definition: timedata.h:36
std::vector< T > vValues
Definition: timedata.h:24
Network address.
Definition: netaddress.h:120
#define T(expected, seed, data)
int64_t GetAdjustedTime()
Definition: timedata.cpp:36
void AddTimeData(const CNetAddr &ip, int64_t nTime, int nOffsetLimit)
Definition: timedata.cpp:43
int64_t GetCurrentTimeSlot()
Definition: timedata.cpp:106
int64_t abs64(int64_t n)
Functions to keep track of adjusted P2P time.
Definition: timedata.h:73
int64_t GetTimeOffset()
"Never go to sea with two chronometers; take one or three." Our three time sources are:
Definition: timedata.cpp:30
int64_t GetTimeSlot(const int64_t nTime)
Definition: timedata.cpp:100