Refer to nullptr not NULL
[folly.git] / folly / stats / MultiLevelTimeSeries-defs.h
index 686dafa6d965cc48a9681487831a30b7a43f0ef7..11b2afd5f9795b255b41c60aea5f7ade9b968872 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 #pragma once
 
+#include <folly/stats/MultiLevelTimeSeries.h>
 #include <glog/logging.h>
 
 namespace folly {
 
-template <typename VT, typename TT>
-MultiLevelTimeSeries<VT, TT>::MultiLevelTimeSeries(
-  size_t nBuckets,
-  size_t nLevels,
-  const TimeType levelDurations[])
-    : cachedTime_(0),
-      cachedSum_(0),
-      cachedCount_(0) {
-    CHECK_GT(nLevels, 0);
-    CHECK(levelDurations);
+template <typename VT, typename CT>
+MultiLevelTimeSeries<VT, CT>::MultiLevelTimeSeries(
+    size_t nBuckets,
+    size_t nLevels,
+    const Duration levelDurations[])
+    : cachedTime_(), cachedSum_(0), cachedCount_(0) {
+  CHECK_GT(nLevels, 0u);
+  CHECK(levelDurations);
 
-    levels_.reserve(nLevels);
-    for (size_t i = 0; i < nLevels; ++i) {
-      if (levelDurations[i] == TT(0)) {
-        CHECK_EQ(i, nLevels - 1);
-      } else if (i > 0) {
-        CHECK(levelDurations[i-1] < levelDurations[i]);
-      }
-      levels_.emplace_back(nBuckets, levelDurations[i]);
+  levels_.reserve(nLevels);
+  for (size_t i = 0; i < nLevels; ++i) {
+    if (levelDurations[i] == Duration(0)) {
+      CHECK_EQ(i, nLevels - 1);
+    } else if (i > 0) {
+      CHECK(levelDurations[i - 1] < levelDurations[i]);
     }
+    levels_.emplace_back(nBuckets, levelDurations[i]);
+  }
+}
+
+template <typename VT, typename CT>
+MultiLevelTimeSeries<VT, CT>::MultiLevelTimeSeries(
+    size_t nBuckets,
+    std::initializer_list<Duration> durations)
+    : cachedTime_(), cachedSum_(0), cachedCount_(0) {
+  CHECK_GT(durations.size(), 0u);
+
+  levels_.reserve(durations.size());
+  size_t i = 0;
+  Duration prev{0};
+  for (auto dur : durations) {
+    if (dur == Duration(0)) {
+      CHECK_EQ(i, durations.size() - 1);
+    } else if (i > 0) {
+      CHECK(prev < dur);
+    }
+    levels_.emplace_back(nBuckets, dur);
+    prev = dur;
+    i++;
+  }
 }
 
-template <typename VT, typename TT>
-void MultiLevelTimeSeries<VT, TT>::addValue(TimeType now,
-                                            const ValueType& val) {
+template <typename VT, typename CT>
+void MultiLevelTimeSeries<VT, CT>::addValue(
+    TimePoint now,
+    const ValueType& val) {
   addValueAggregated(now, val, 1);
 }
 
-template <typename VT, typename TT>
-void MultiLevelTimeSeries<VT, TT>::addValue(TimeType now,
-                                            const ValueType& val,
-                                            int64_t times) {
-  addValueAggregated(now, val * times, times);
+template <typename VT, typename CT>
+void MultiLevelTimeSeries<VT, CT>::addValue(
+    TimePoint now,
+    const ValueType& val,
+    uint64_t times) {
+  addValueAggregated(now, val * ValueType(times), times);
 }
 
-template <typename VT, typename TT>
-void MultiLevelTimeSeries<VT, TT>::addValueAggregated(TimeType now,
-                                                      const ValueType& total,
-                                                      int64_t nsamples) {
+template <typename VT, typename CT>
+void MultiLevelTimeSeries<VT, CT>::addValueAggregated(
+    TimePoint now,
+    const ValueType& total,
+    uint64_t nsamples) {
   if (cachedTime_ != now) {
     flush();
     cachedTime_ = now;
@@ -67,16 +91,16 @@ void MultiLevelTimeSeries<VT, TT>::addValueAggregated(TimeType now,
   cachedCount_ += nsamples;
 }
 
-template <typename VT, typename TT>
-void MultiLevelTimeSeries<VT, TT>::update(TimeType now) {
+template <typename VT, typename CT>
+void MultiLevelTimeSeries<VT, CT>::update(TimePoint now) {
   flush();
   for (size_t i = 0; i < levels_.size(); ++i) {
     levels_[i].update(now);
   }
 }
 
-template <typename VT, typename TT>
-void MultiLevelTimeSeries<VT, TT>::flush() {
+template <typename VT, typename CT>
+void MultiLevelTimeSeries<VT, CT>::flush() {
   // update all the underlying levels
   if (cachedCount_ > 0) {
     for (size_t i = 0; i < levels_.size(); ++i) {
@@ -87,13 +111,13 @@ void MultiLevelTimeSeries<VT, TT>::flush() {
   }
 }
 
-template <typename VT, typename TT>
-void MultiLevelTimeSeries<VT, TT>::clear() {
+template <typename VT, typename CT>
+void MultiLevelTimeSeries<VT, CT>::clear() {
   for (auto & level : levels_) {
     level.clear();
   }
 
-  cachedTime_ = TimeType(0);
+  cachedTime_ = TimePoint();
   cachedSum_ = 0;
   cachedCount_ = 0;
 }