16#ifndef TOOLBOX_NET_RATELIMIT_HPP
17#define TOOLBOX_NET_RATELIMIT_HPP
22#include <boost/container/small_vector.hpp>
31 template <
typename intervalT = Seconds>
32 constexpr RateLimit(std::size_t limit, intervalT interval) noexcept
34 , interval_{std::chrono::duration_cast<Decis>(interval)}
36 assert(interval_.count());
48 constexpr auto limit() const noexcept {
return limit_; }
49 constexpr auto interval() const noexcept {
return interval_; }
59template <
typename StreamT>
63 os <<
rl.limit() <<
'/' <<
rl.interval().count();
70 template <
typename intervalT = Seconds>
72 : buckets_(
std::chrono::duration_cast<
Decis>(interval).count())
74 assert(buckets_.size());
86 std::
size_t count() const noexcept {
return count_; }
89 void add(
MonoTime time, std::size_t count = 1) noexcept;
92 std::
size_t& at(
std::time_t t) noexcept {
return buckets_[t % buckets_.size()]; }
95 boost::container::small_vector<std::size_t, 10> buckets_;
99inline namespace util {
101struct TypeTraits<net::RateLimit> {
ostream & operator<<(ostream &os, const pair< T, U > &p)