Token bucket limiter with burst capacity
C++
#include <algorithm>
#include <chrono>
class TokenBucket {
public:
TokenBucket(double ratePerSec, double burst)
: rate_(ratePerSec), burst_(burst), tokens_(burst), last_(std::chrono::steady_clock::now()) {}
bool tryAcquire(double cost = 1.0) {
auto now = std::chrono::steady_clock::now();
double secs = std::chrono::duration<double>(now - last_).count();
last_ = now;
tokens_ = std::min(burst_, tokens_ + secs * rate_);
if (tokens_ < cost) return false;
tokens_ -= cost;
return true;
}
private:
double rate_, burst_, tokens_;
std::chrono::steady_clock::time_point last_;
};