mirror of
https://github.com/dashpay/dash.git
synced 2024-12-27 04:52:59 +01:00
093303a887
- ensures a consistent usage in header files - also add a blank line after the copyright header where missing - also remove orphan new-lines at the end of some files
77 lines
1.7 KiB
C++
77 lines
1.7 KiB
C++
// Copyright (c) 2014 The Bitcoin developers
|
|
// Distributed under the MIT/X11 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 <stdint.h>
|
|
#include <vector>
|
|
#include <algorithm>
|
|
#include <assert.h>
|
|
|
|
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
|