blob: 930cb814e900d7b3c1430546e3a3f67a89662f54 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
part of 'inspect.dart';
/// A VMO-backed key-value pair with a [String] key and num value.
abstract class _Metric<T extends num> {
/// The VMO index for this metric.
/// @nodoc
@visibleForTesting
final int index;
/// The writer for the underlying VMO.
///
/// Will be set to null if the metric has been deleted or could not be
/// created in the VMO.
/// If so, all actions on this metric should be no-ops and not throw.
VmoWriter _writer;
/// Creates a [_Metric] with [name] and [value] under the [parentIndex].
_Metric(String name, int parentIndex, this._writer, T value)
: index = _writer.createMetric(parentIndex, name, value) {
if (index == invalidIndex) {
_writer = null;
}
}
/// Creates a [_Metric] that never does anything.
///
/// These are returned when calling create__Metric on a deleted [Node].
_Metric.deleted()
: _writer = null,
index = invalidIndex;
bool get _isDeleted => _writer == null;
/// Sets the value of this [_Metric].
void setValue(T value) {
_writer?.setMetric(index, value);
}
/// Adds [delta] to the value of this metric in the VMO.
void add(T delta) {
_writer?.addMetric(index, delta);
}
/// Subtracts [delta] from the value of this metric in the VMO.
void subtract(T delta) {
_writer?.subMetric(index, delta);
}
/// Delete this metric from the VMO.
///
/// After a metric has been deleted, it should no longer be used, so callers
/// should clear their references to this metric after calling delete.
/// Any calls on an already deleted metric will be no-ops.
void delete() {
_writer?.deleteMetric(index);
_writer = null;
}
}
/// A VMO-backed key-value pair with a [String] key and [int] value.
class IntMetric extends _Metric<int> {
IntMetric._(String name, int parentIndex, VmoWriter writer)
: super(name, parentIndex, writer, 0);
IntMetric._deleted() : super.deleted();
}
/// A VMO-backed key-value pair with a [String] key and [double] value.
class DoubleMetric extends _Metric<double> {
DoubleMetric._(String name, int parentIndex, VmoWriter writer)
: super(name, parentIndex, writer, 0.0);
DoubleMetric._deleted() : super.deleted();
}