aboutsummaryrefslogtreecommitdiff
path: root/src/timedata.h
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2014-08-20 13:53:42 +0200
committerWladimir J. van der Laan <laanwj@gmail.com>2014-08-26 13:25:20 +0200
commitd1e26d4e71460ffd50c3190385c759b48ab343e9 (patch)
treea2455079d68500e91c4c2cd70a0b4df8946b7193 /src/timedata.h
parent49f954f154e3576a6a8270e00ab95f52dd02c667 (diff)
downloadbitcoin-d1e26d4e71460ffd50c3190385c759b48ab343e9.tar.xz
Move CMedianFilter to timedata.cpp
Now that we no longer use the median filter to keep track of the number of blocks of peers, that's the only place it is used.
Diffstat (limited to 'src/timedata.h')
-rw-r--r--src/timedata.h59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/timedata.h b/src/timedata.h
index 0e7bdc2c1f..d0c84b3183 100644
--- a/src/timedata.h
+++ b/src/timedata.h
@@ -6,9 +6,68 @@
#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();