1/*
2 *  Copyright 2012 The WebRTC Project Authors. All rights reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_BASE_RATELIMITER_H_
12#define WEBRTC_BASE_RATELIMITER_H_
13
14#include <stdlib.h>
15#include "webrtc/base/basictypes.h"
16
17namespace rtc {
18
19// Limits the rate of use to a certain maximum quantity per period of
20// time.  Use, for example, for simple bandwidth throttling.
21//
22// It's implemented like a diet plan: You have so many calories per
23// day.  If you hit the limit, you can't eat any more until the next
24// day.
25class RateLimiter {
26 public:
27  // For example, 100kb per second.
28  RateLimiter(size_t max, double period)
29      : max_per_period_(max),
30        period_length_(period),
31        used_in_period_(0),
32        period_start_(0.0),
33        period_end_(period) {
34  }
35  virtual ~RateLimiter() {}
36
37  // Returns true if if the desired quantity is available in the
38  // current period (< (max - used)).  Once the given time passes the
39  // end of the period, used is set to zero and more use is available.
40  bool CanUse(size_t desired, double time);
41  // Increment the quantity used this period.  If past the end of a
42  // period, a new period is started.
43  void Use(size_t used, double time);
44
45  size_t used_in_period() const {
46    return used_in_period_;
47  }
48
49  size_t max_per_period() const {
50    return max_per_period_;
51  }
52
53 private:
54  size_t max_per_period_;
55  double period_length_;
56  size_t used_in_period_;
57  double period_start_;
58  double period_end_;
59};
60
61}  // namespace rtc
62
63#endif  // WEBRTC_BASE_RATELIMITER_H_
64