Index: net/base/percentile_estimator.h |
diff --git a/net/base/percentile_estimator.h b/net/base/percentile_estimator.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0ff7b8176e273411fd4314c84b96e95d159ca567 |
--- /dev/null |
+++ b/net/base/percentile_estimator.h |
@@ -0,0 +1,59 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef NET_BASE_PERCENTILE_ESTIMATOR_H_ |
+#define NET_BASE_PERCENTILE_ESTIMATOR_H_ |
+ |
+#include "base/callback.h" |
+#include "base/macros.h" |
+#include "net/base/net_export.h" |
+ |
+namespace net { |
+ |
+// This class estimates statistical percentiles (e.g. 10%l, 50%l) for |
+// integer distributions presented in stream form. These estimates |
+// adjust automatically when the stream distribution changes. |
+// TODO(rdsmith): Expand the class to maintain floating point |
+// estimates rather than integer estimates, when there's a use case |
+// for that that deserves the extra complexity and pitfalls of |
+// floating point arithmetic. |
+class NET_EXPORT PercentileEstimator { |
+ public: |
+ using RandomNumberCallback = base::Callback<int(void)>; |
+ |
+ static const int kMedianPercentile = 50; |
+ |
+ // |percentile| is a number between 0 and 100 indicating what percentile |
+ // should be estimated (e.g. 50 would be a median estimate). |
+ // |initial_estimate| is the value the class is seeded with; in other |
+ // words, if AddSample() is never called, |
+ // |CurrentEstimate() == initial_estimate|. |
+ PercentileEstimator(int percentile, int initial_estimate); |
+ |
+ ~PercentileEstimator(); |
+ |
+ int current_estimate() const { return current_estimate_; } |
+ void AddSample(int sample); |
+ |
+ // Specify a callback that will generate a "random" number |
+ // in the range [0,99] on each call. Used so that tests can |
+ // rely on reproducible behavior. |
+ void SetRandomNumberGeneratorForTesting( |
+ RandomNumberCallback generator_callback); |
+ |
+ private: |
+ const int percentile_; |
+ |
+ bool sign_positive_; |
+ int current_estimate_; |
+ int current_step_; |
+ |
+ RandomNumberCallback generator_callback_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(PercentileEstimator); |
+}; |
+ |
+} // namespace net |
+ |
+#endif // NET_BASE_PERCENTILE_ESTIMATOR_H_ |