You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
1.7 KiB
76 lines
1.7 KiB
// Copyright (c) 2014 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> |
|
|
|
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 size = vSorted.size(); |
|
assert(size > 0); |
|
if (size & 1) // Odd number of elements |
|
{ |
|
return vSorted[size / 2]; |
|
} else // Even number of elements |
|
{ |
|
return (vSorted[size / 2 - 1] + vSorted[size / 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
|
|
|