| | |
| | | #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() { return Clock::now() > 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_; } |
| | | }; |
| | | TimePoint expire_; |
| | | Data data_; |
| | | }; |
| | | |
| | | template <class Data, class ClockType = std::chrono::steady_clock> |
| | | class TimedQueue |
| | | { |
| | | typedef TimedData<Data, ClockType> Record; |
| | | |
| | | public: |
| | | typedef typename Record::Clock Clock; |
| | | typedef typename Record::TimePoint TimePoint; |
| | | typedef typename Record::Duration Duration; |
| | | |
| | | private: |
| | | typedef std::list<Record> Queue; |
| | | Synced<Queue> queue_; |
| | | |
| | |
| | | do { |
| | | if (it->Expired()) { |
| | | it = q.erase(it); |
| | | } else if (func(it->data_)) { |
| | | } else if (func(it->data())) { |
| | | it = q.erase(it); |
| | | } else { |
| | | ++it; |