f28089f8074e8088c0f855344e0d7c362607ae82
[folly.git] / folly / stats / MultiLevelTimeSeries-defs.h
1 /*
2  * Copyright 2013 Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef FOLLY_STATS_MULTILEVELTIMESERIES_DEFS_H_
18 #define FOLLY_STATS_MULTILEVELTIMESERIES_DEFS_H_
19
20 #include <glog/logging.h>
21
22 namespace folly {
23
24 template <typename VT, typename TT>
25 MultiLevelTimeSeries<VT, TT>::MultiLevelTimeSeries(
26   size_t numBuckets,
27   size_t numLevels,
28   const TimeType levelDurations[])
29     : numBuckets_(numBuckets),
30       cachedTime_(0),
31       cachedSum_(0),
32       cachedCount_(0) {
33     CHECK_GT(numLevels, 0);
34     CHECK(levelDurations);
35
36     levels_.reserve(numLevels);
37     for (int i = 0; i < numLevels; ++i) {
38       if (levelDurations[i] == TT(0)) {
39         CHECK_EQ(i, numLevels - 1);
40       } else if (i > 0) {
41         CHECK(levelDurations[i-1] < levelDurations[i]);
42       }
43       levels_.emplace_back(numBuckets, levelDurations[i]);
44     }
45 }
46
47 template <typename VT, typename TT>
48 void MultiLevelTimeSeries<VT, TT>::addValue(TimeType now,
49                                             const ValueType& val) {
50   addValueAggregated(now, val, 1);
51 }
52
53 template <typename VT, typename TT>
54 void MultiLevelTimeSeries<VT, TT>::addValue(TimeType now,
55                                             const ValueType& val,
56                                             int64_t times) {
57   addValueAggregated(now, val * times, times);
58 }
59
60 template <typename VT, typename TT>
61 void MultiLevelTimeSeries<VT, TT>::addValueAggregated(TimeType now,
62                                                       const ValueType& sum,
63                                                       int64_t nsamples) {
64   if (cachedTime_ != now) {
65     flush();
66     cachedTime_ = now;
67   }
68   cachedSum_ += sum;
69   cachedCount_ += nsamples;
70 }
71
72 template <typename VT, typename TT>
73 void MultiLevelTimeSeries<VT, TT>::update(TimeType now) {
74   flush();
75   for (int i = 0; i < levels_.size(); ++i) {
76     levels_[i].update(now);
77   }
78 }
79
80 template <typename VT, typename TT>
81 void MultiLevelTimeSeries<VT, TT>::flush() {
82   // update all the underlying levels
83   if (cachedCount_ > 0) {
84     for (int i = 0; i < levels_.size(); ++i) {
85       levels_[i].addValueAggregated(cachedTime_, cachedSum_, cachedCount_);
86     }
87     cachedCount_ = 0;
88     cachedSum_ = 0;
89   }
90 }
91
92 template <typename VT, typename TT>
93 void MultiLevelTimeSeries<VT, TT>::clear() {
94   for (auto & level : levels_) {
95     level.clear();
96   }
97
98   cachedTime_ = TimeType(0);
99   cachedSum_ = 0;
100   cachedCount_ = 0;
101 }
102
103 }  // folly
104
105 #endif // FOLLY_STATS_MULTILEVELTIMESERIES_DEFS_H_