quic/s2n-quic-core/src/event/metrics/aggregate/metric.rs (137 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
use super::info::Str;
use core::time::Duration;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[non_exhaustive]
pub enum Units {
None,
Bytes,
Duration,
Percent,
}
impl Units {
pub const fn as_str(&self) -> &'static Str {
match self {
Units::None => Str::new("\0"),
Units::Bytes => Str::new("bytes\0"),
Units::Duration => Str::new("duration\0"),
Units::Percent => Str::new("percent\0"),
}
}
}
pub trait Metric: 'static + Send + Sync + Copy + core::fmt::Debug {
#[inline]
fn is_f32(&self) -> bool {
false
}
fn as_f32(&self) -> f32;
#[inline]
fn is_f64(&self) -> bool {
false
}
fn as_f64(&self) -> f64;
#[inline]
fn is_u64(&self) -> bool {
false
}
fn as_u64(&self) -> u64;
#[inline]
fn is_duration(&self) -> bool {
false
}
fn as_duration(&self) -> Duration;
}
impl Metric for f32 {
#[inline]
fn as_f32(&self) -> f32 {
*self
}
#[inline]
fn is_f32(&self) -> bool {
true
}
#[inline]
fn as_f64(&self) -> f64 {
*self as _
}
#[inline]
fn as_u64(&self) -> u64 {
*self as _
}
#[inline]
fn as_duration(&self) -> Duration {
Duration::from_secs_f32(*self)
}
}
impl Metric for f64 {
#[inline]
fn as_f32(&self) -> f32 {
*self as _
}
#[inline]
fn as_f64(&self) -> f64 {
*self
}
#[inline]
fn is_f64(&self) -> bool {
true
}
#[inline]
fn as_u64(&self) -> u64 {
*self as _
}
#[inline]
fn as_duration(&self) -> Duration {
Duration::from_secs_f64(*self)
}
}
impl Metric for Duration {
#[inline]
fn as_f32(&self) -> f32 {
self.as_secs_f32()
}
#[inline]
fn as_f64(&self) -> f64 {
self.as_secs_f64()
}
#[inline]
fn as_u64(&self) -> u64 {
self.as_micros() as _
}
#[inline]
fn is_duration(&self) -> bool {
true
}
#[inline]
fn as_duration(&self) -> Duration {
*self
}
}
macro_rules! impl_metric_number {
($($ty:ty),* $(,)?) => {
$(
impl Metric for $ty {
#[inline]
fn as_f32(&self) -> f32 {
*self as _
}
#[inline]
fn as_f64(&self) -> f64 {
*self as _
}
#[inline]
fn is_u64(&self) -> bool {
true
}
#[inline]
fn as_u64(&self) -> u64 {
*self as _
}
#[inline]
fn as_duration(&self) -> Duration {
Duration::from_micros(*self as _)
}
}
)*
}
}
impl_metric_number!(u8, u16, u32, u64, usize);