#ifndef CHROME_UPDATER_UTIL_PROGRESS_SAMPLER_H_
#define CHROME_UPDATER_UTIL_PROGRESS_SAMPLER_H_
#include <optional>
#include <queue>
#include "base/time/time.h"
namespace updater {
class ProgressSampler {
public:
ProgressSampler(base::TimeDelta sample_time_range,
base::TimeDelta minimum_range_required);
~ProgressSampler();
void AddSample(int64_t sample_value);
std::optional<base::TimeDelta> GetRemainingTime(int64_t total);
private:
void AddSample(base::Time timestamp, int64_t sample_value);
bool HasEnoughSamples() const;
std::optional<double> GetAverageSpeedPerMs() const;
void Reset();
const base::TimeDelta sample_time_range_;
const base::TimeDelta minimum_range_required_;
struct Sample {
Sample(base::Time local_timestamp, int64_t local_value)
: timestamp(local_timestamp), value(local_value) {}
const base::Time timestamp;
const int64_t value;
};
std::queue<Sample> samples_;
FRIEND_TEST_ALL_PREFIXES(ProgressSampler, Samples);
FRIEND_TEST_ALL_PREFIXES(ProgressSampler, PercentageRange);
};
}
#endif