#ifndef CRUCIBLE_TIME_H #define CRUCIBLE_TIME_H #include "crucible/error.h" #include #include #include namespace crucible { double nanosleep(double secs); class Timer { chrono::high_resolution_clock::time_point m_start; public: Timer(); double age() const; double report(int precision = 1000) const; void reset(); void set(const chrono::high_resolution_clock::time_point &start); void set(double delta); double lap(); bool operator<(double d) const; bool operator>(double d) const; }; ostream &operator<<(ostream &os, const Timer &t); class RateLimiter { Timer m_timer; double m_rate; double m_burst; double m_tokens; mutex m_mutex; void update_tokens(); public: RateLimiter(double rate, double burst); RateLimiter(double rate); void sleep_for(double cost = 1.0); bool is_ready(); void borrow(double cost = 1.0); }; } #endif // CRUCIBLE_TIME_H