/* * Copyright 2016-17, OpenCensus Authors * * 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. */ package io.opencensus.stats; import com.google.auto.value.AutoValue; import io.opencensus.common.Function; import io.opencensus.stats.Measure.MeasureDouble; import io.opencensus.stats.Measure.MeasureLong; import javax.annotation.concurrent.Immutable; /** * Immutable representation of a Measurement. * * @since 0.8 */ @Immutable public abstract class Measurement { /** * Applies the given match function to the underlying data type. * * @since 0.8 */ public abstract T match( Function p0, Function p1, Function defaultFunction); /** * Extracts the measured {@link Measure}. * * @since 0.8 */ public abstract Measure getMeasure(); // Prevents this class from being subclassed anywhere else. private Measurement() {} /** * {@code Double} typed {@link Measurement}. * * @since 0.8 */ @Immutable @AutoValue public abstract static class MeasurementDouble extends Measurement { MeasurementDouble() {} /** * Constructs a new {@link MeasurementDouble}. * * @since 0.8 */ public static MeasurementDouble create(MeasureDouble measure, double value) { return new AutoValue_Measurement_MeasurementDouble(measure, value); } @Override public abstract MeasureDouble getMeasure(); /** * Returns the value for the measure. * * @return the value for the measure. * @since 0.8 */ public abstract double getValue(); @Override public T match( Function p0, Function p1, Function defaultFunction) { return p0.apply(this); } } /** * {@code Long} typed {@link Measurement}. * * @since 0.8 */ @Immutable @AutoValue public abstract static class MeasurementLong extends Measurement { MeasurementLong() {} /** * Constructs a new {@link MeasurementLong}. * * @since 0.8 */ public static MeasurementLong create(MeasureLong measure, long value) { return new AutoValue_Measurement_MeasurementLong(measure, value); } @Override public abstract MeasureLong getMeasure(); /** * Returns the value for the measure. * * @return the value for the measure. * @since 0.8 */ public abstract long getValue(); @Override public T match( Function p0, Function p1, Function defaultFunction) { return p1.apply(this); } } }