LCOV - code coverage report
Current view: top level - src - timedata.h (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 27 27 100.0 %
Date: 2020-09-26 01:30:44 Functions: 14 14 100.0 %

          Line data    Source code
       1             : // Copyright (c) 2014-2018 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.
       4             : 
       5             : #ifndef BITCOIN_TIMEDATA_H
       6             : #define BITCOIN_TIMEDATA_H
       7             : 
       8             : #include <algorithm>
       9             : #include <assert.h>
      10             : #include <stdint.h>
      11             : #include <vector>
      12             : 
      13             : static const int64_t DEFAULT_MAX_TIME_ADJUSTMENT = 70 * 60;
      14             : 
      15             : class CNetAddr;
      16             : 
      17             : /**
      18             :  * Median filter over a stream of values.
      19             :  * Returns the median of the last N numbers
      20             :  */
      21             : template <typename T>
      22         604 : class CMedianFilter
      23             : {
      24             : private:
      25             :     std::vector<T> vValues;
      26             :     std::vector<T> vSorted;
      27             :     unsigned int nSize;
      28             : 
      29             : public:
      30         604 :     CMedianFilter(unsigned int _size, T initial_value) : nSize(_size)
      31         302 :     {
      32         302 :         vValues.reserve(_size);
      33         302 :         vValues.push_back(initial_value);
      34         302 :         vSorted = vValues;
      35         604 :     }
      36             : 
      37         506 :     void input(T value)
      38             :     {
      39         506 :         if (vValues.size() == nSize) {
      40           3 :             vValues.erase(vValues.begin());
      41           3 :         }
      42         506 :         vValues.push_back(value);
      43             : 
      44         506 :         vSorted.resize(vValues.size());
      45         506 :         std::copy(vValues.begin(), vValues.end(), vSorted.begin());
      46         506 :         std::sort(vSorted.begin(), vSorted.end());
      47         506 :     }
      48             : 
      49         105 :     T median() const
      50             :     {
      51         105 :         int vSortedSize = vSorted.size();
      52         105 :         assert(vSortedSize > 0);
      53         105 :         if (vSortedSize & 1) // Odd number of elements
      54             :         {
      55         103 :             return vSorted[vSortedSize / 2];
      56             :         } else // Even number of elements
      57             :         {
      58           2 :             return (vSorted[vSortedSize / 2 - 1] + vSorted[vSortedSize / 2]) / 2;
      59             :         }
      60         105 :     }
      61             : 
      62        1197 :     int size() const
      63             :     {
      64        1197 :         return vValues.size();
      65             :     }
      66             : 
      67          98 :     std::vector<T> sorted() const
      68             :     {
      69          98 :         return vSorted;
      70             :     }
      71             : };
      72             : 
      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);
      77             : 
      78             : #endif // BITCOIN_TIMEDATA_H

Generated by: LCOV version 1.15