hmbdc
simplify-high-performance-messaging-programming
Rater.hpp
1 #include "hmbdc/Copyright.hpp"
2 #pragma once
3 
4 #include "hmbdc/Exception.hpp"
5 #include "hmbdc/time/Time.hpp"
6 
7 #include <iostream>
8 #include <stdexcept>
9 
10 namespace hmbdc { namespace time {
11 struct Rater {
12  Rater()
13  : drop_()
14  , bucket_()
15  , currentLevel_()
16  , previousCheck_()
17  , enabled_(false)
18  {}
19 
20  Rater(Duration duration, size_t times, size_t burst, bool enabled = true)
21  : drop_(duration / (times?times:1ul))
22  , bucket_(drop_ * burst)
23  , currentLevel_(bucket_)
24  , previousCheck_()
25  , enabled_(enabled?times != 0:false)
26  {}
27 
28  bool check(size_t n = 1u) {
29  if (!enabled_) return true;
30  n_ = n;
31  auto now = SysTime::now();
32  currentLevel_ += now - previousCheck_;
33  previousCheck_ = now;
34  if (currentLevel_ > bucket_) currentLevel_ = bucket_;
35  return currentLevel_ >= drop_ * n;
36  }
37 
38  void commit() {
39  currentLevel_ -= drop_ * n_;
40  }
41 
42  bool enabled() const {
43  return enabled_;
44  }
45 
46 private:
47  Duration drop_;
48  Duration bucket_;
49  Duration currentLevel_;
50  SysTime previousCheck_;
51  bool enabled_;
52  size_t n_;
53 };
54 }}
Definition: Time.hpp:14
Definition: Time.hpp:134
Definition: Rater.hpp:11
Definition: Base.hpp:12