blob: 8680cb61645abd2981d6b9d03916ab63b5d5383a [file] [log] [blame]
// Copyright (c) 2019 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 QUICHE_QUIC_CORE_QUIC_TIME_ACCUMULATOR_H_
#define QUICHE_QUIC_CORE_QUIC_TIME_ACCUMULATOR_H_
#include "quic/core/quic_time.h"
#include "quic/platform/api/quic_export.h"
#include "quic/platform/api/quic_logging.h"
namespace quic {
// QuicTimeAccumulator accumulates elapsed times between Start(s) and Stop(s).
class QUIC_EXPORT_PRIVATE QuicTimeAccumulator {
// TODO(wub): Switch to a data member called kNotRunningSentinel after c++17.
static constexpr QuicTime NotRunningSentinel() {
return QuicTime::Infinite();
}
public:
// True if Started and not Stopped.
bool IsRunning() const { return last_start_time_ != NotRunningSentinel(); }
void Start(QuicTime now) {
QUICHE_DCHECK(!IsRunning());
last_start_time_ = now;
QUICHE_DCHECK(IsRunning());
}
void Stop(QuicTime now) {
QUICHE_DCHECK(IsRunning());
if (now > last_start_time_) {
total_elapsed_ = total_elapsed_ + (now - last_start_time_);
}
last_start_time_ = NotRunningSentinel();
QUICHE_DCHECK(!IsRunning());
}
// Get total elapsed time between COMPLETED Start/Stop pairs.
QuicTime::Delta GetTotalElapsedTime() const { return total_elapsed_; }
// Get total elapsed time between COMPLETED Start/Stop pairs, plus, if it is
// running, the elapsed time between |last_start_time_| and |now|.
QuicTime::Delta GetTotalElapsedTime(QuicTime now) const {
if (!IsRunning()) {
return total_elapsed_;
}
if (now <= last_start_time_) {
return total_elapsed_;
}
return total_elapsed_ + (now - last_start_time_);
}
private:
//
// |last_start_time_|
// |
// V
// Start => Stop => Start => Stop => Start
// | | | |
// |___________| + |___________| = |total_elapsed_|
QuicTime::Delta total_elapsed_ = QuicTime::Delta::Zero();
QuicTime last_start_time_ = NotRunningSentinel();
};
} // namespace quic
#endif // QUICHE_QUIC_CORE_QUIC_TIME_ACCUMULATOR_H_