blob: f22f21052727a253eaefbc15a34a15811f7fa5ef [file] [log] [blame]
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/**
* A simple implementation of the [Stopwatch] interface.
*/
class StopwatchImplementation implements Stopwatch {
// The _start and _stop fields capture the time when [start] and [stop]
// are called respectively.
// If _start is null, then the [Stopwatch] has not been started yet.
// If _stop is null, then the [Stopwatch] has not been stopped yet,
// or is running.
int _start;
int _stop;
StopwatchImplementation() : _start = null, _stop = null {}
void start() {
if (_start === null) {
// This stopwatch has never been started.
_start = _now();
} else {
if (_stop === null) {
return;
}
// Restarting this stopwatch. Prepend the elapsed time to the current
// start time.
_start = _now() - (_stop - _start);
_stop = null;
}
}
void stop() {
if (_start === null || _stop !== null) {
return;
}
_stop = _now();
}
void reset() {
if (_start === null) return;
// If [_start] is not null, then the stopwatch had already been started. It
// may running right now.
_start = _now();
if (_stop !== null) {
// The watch is not running. So simply set the [_stop] to [_start] thus
// having an elapsed time of 0.
_stop = _start;
}
}
int elapsed() {
if (_start === null) {
return 0;
}
return (_stop === null) ? (_now() - _start) : (_stop - _start);
}
int elapsedInUs() {
return (elapsed() * 1000000) ~/ frequency();
}
int elapsedInMs() {
return (elapsed() * 1000) ~/ frequency();
}
int frequency() => _frequency();
external static int _frequency();
external static int _now();
}