text: // Copyright (c) 2014-2016 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 <cassert>
  #include <cstdint>
  #include <vector>
  
  static const int64_t DEFAULT_MAX_TIME_ADJUSTMENT = 70 * 60;
  
  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
  