// 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; 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_