text: /*
   * @Author       : mark
   * @Date         : 2020-06-17
   * @copyleft Apache 2.0
   */ 
  #ifndef HEAP_TIMER_H
  #define HEAP_TIMER_H
  
  #include <queue>
  #include <unordered_map>
  #include <time.h>
  #include <algorithm>
  #include <arpa/inet.h> 
  #include <functional> 
  #include <assert.h> 
  #include <chrono>
  #include "../log/log.h"
  
  typedef std::function<void()> TimeoutCallBack;
  // 可以考虑使用使用timerfd_*系列函数来处理定时任务。
  //timerfd_create 把时间变成了一个文件描述符，该“文件”在定时器超时的那一刻变得可读，
  //这样就能很方便地融入到 select/poll 框架中**，用统一的方式来处理 IO 事件和超时事件
  typedef std::chrono::high_resolution_clock Clock;
  typedef std::chrono::milliseconds MS;
  typedef Clock::time_point TimeStamp;
  
  struct TimerNode {
      int id;
      TimeStamp expires;
      TimeoutCallBack cb;
      bool operator<(const TimerNode& t) {
          return expires < t.expires;
      }
  };
  class HeapTimer {
  public:
      HeapTimer() { heap_.reserve(64); }
  
      ~HeapTimer() { clear(); }
      
      void adjust(int id, int newExpires);
  
      void add(int id, int timeOut, const TimeoutCallBack& cb);
  
      void doWork(int id);
  
      void clear();
  
      void tick();
  
      void pop();
  
      int GetNextTick();
  
  private:
      void del_(size_t i);
      
      void siftup_(size_t i);
  
      bool siftdown_(size_t index, size_t n);
  
      void SwapNode_(size_t i, size_t j);
  
      std::vector<TimerNode> heap_;
  
      std::unordered_map<int, size_t> ref_;
  };
  
  #endif //HEAP_TIMER_H