blob: 93fe1abc4bffc21ef8aa415fcc0540ff8056d780 [file] [log] [blame]
// Copyright 2018 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import 'clock.dart';
/// The system's timer frequency in Hz.
///
/// We can't really know how frequently the clock is updated, and that may not
/// even make sense for some implementations, so we just pretend we follow the
/// system's frequency.
final _frequency = Stopwatch().frequency;
/// A stopwatch that gets its notion of the current time from a [Clock].
class ClockStopwatch implements Stopwatch {
/// The provider for this stopwatch's notion of the current time.
final Clock _clock;
/// The number of elapsed microseconds that have been recorded from previous
/// runs of this stopwatch.
///
/// This doesn't include the time between [_start] and the current time.
var _elapsed = 0;
/// The point at which [start] was called most recently, or `null` if this
/// isn't active.
DateTime? _start;
ClockStopwatch(this._clock);
@override
int get frequency => _frequency;
@override
int get elapsedTicks => (elapsedMicroseconds * frequency) ~/ 1000000;
@override
Duration get elapsed => Duration(microseconds: elapsedMicroseconds);
@override
int get elapsedMilliseconds => elapsedMicroseconds ~/ 1000;
@override
bool get isRunning => _start != null;
@override
int get elapsedMicroseconds =>
_elapsed +
(_start == null ? 0 : _clock.now().difference(_start!).inMicroseconds);
@override
void start() {
_start ??= _clock.now();
}
@override
void stop() {
_elapsed = elapsedMicroseconds;
_start = null;
}
@override
void reset() {
_elapsed = 0;
if (_start != null) _start = _clock.now();
}
}