liuxiaolong
2021-07-20 13c503b73b4ecc8ce4a6e344f9ac15202985d686
src/timed_queue.h
@@ -1,7 +1,7 @@
/*
 * =====================================================================================
 *
 *       Filename:  failed_msg.h
 *       Filename:  timed_queue.h
 *
 *    Description:  
 *
@@ -24,52 +24,25 @@
#include <string>
template <class Data, class ClockType = std::chrono::steady_clock>
class TimedQueue
class TimedData
{
public:
   typedef ClockType Clock;
   typedef typename Clock::time_point TimePoint;
   typedef typename Clock::duration Duration;
   TimedData(const TimePoint &expire, const Data &data) :
       expire_(expire), data_(data) {}
   TimedData(const TimePoint &expire, Data &&data) :
       expire_(expire), data_(std::move(data)) {}
   bool Expired() const { return Clock::now() > expire_; }
   const TimePoint &expire() const { return expire_; }
   Data &data() { return data_; }
   Data const &data() const { return data_; }
private:
   struct Record {
      TimePoint expire_;
      Data data_;
      Record(const TimePoint &expire, const Data &data) :
          expire_(expire), data_(data) {}
      Record(const TimePoint &expire, Data &&data) :
          expire_(expire), data_(std::move(data)) {}
      bool Expired() { return Clock::now() > expire_; }
   };
   typedef std::list<Record> Queue;
   Synced<Queue> queue_;
public:
   void Push(Data &&data, const TimePoint &expire) { queue_->emplace_back(expire, std::move(data)); }
   void Push(Data const &data, const TimePoint &expire) { queue_->emplace_back(expire, data); }
   void Push(Data &&data, Duration const &timeout) { Push(std::move(data), Clock::now() + timeout); }
   void Push(Data const &data, Duration const &timeout) { Push(data, Clock::now() + timeout); }
   template <class Func>
   void CheckAll(Func const &func)
   {
      queue_.Apply([&](Queue &q) {
         if (q.empty()) {
            return;
         }
         auto it = q.begin();
         do {
            if (it->Expired()) {
               it = q.erase(it);
            } else if (func(it->data_)) {
               it = q.erase(it);
            } else {
               ++it;
            }
         } while (it != q.end());
      });
   }
   TimePoint expire_;
   Data data_;
};
#endif // end of include guard: TIMED_QUEUE_Y2YLRBS3