1 /*
2  * Copyright (C) 1996-2021 The Squid Software Foundation and contributors
3  *
4  * Squid software is distributed under GPLv2+ license and includes
5  * contributions from numerous individuals and organizations.
6  * Please see the COPYING and CONTRIBUTORS files for details.
7  */
8 
9 #ifndef SQUID_FADING_COUNTER_H
10 #define SQUID_FADING_COUNTER_H
11 
12 #include <vector>
13 
14 /// Counts events, forgetting old ones. Usefull for "3 errors/minute" limits.
15 class FadingCounter
16 {
17 public:
18     FadingCounter();
19 
20     /// 0=remember nothing; -1=forget nothing; new value triggers clear()
21     void configure(double horizonSeconds);
22 
23     void clear(); ///< forgets all events
24 
25     int count(int howMany); ///< count fresh, return #events remembered
remembered()26     int remembered() const { return total; } ///< possibly stale #events
27 
28     /// read-only memory horizon in seconds; older events are forgotten
29     double horizon;
30 
31 private:
32     const int precision; ///< #counting slots, controls measur. occuracy
33     double delta; ///< sub-interval duration = horizon/precision
34 
35     double lastTime; ///< time of the last update
36     std::vector<int> counters; ///< events per delta (possibly stale)
37     int total; ///< number of remembered events (possibly stale)
38 };
39 
40 #endif /* SQUID_FADING_COUNTER_H */
41 
42