#[cfg(test)]
use crate::observe::core::TapEvent;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub(crate) struct ScopeTrace {
pub range: u16,
pub nest: u16,
}
impl Default for ScopeTrace {
#[inline]
fn default() -> Self {
Self::new(0, 0)
}
}
impl ScopeTrace {
#[inline]
pub(crate) const fn new(range: u16, nest: u16) -> Self {
Self { range, nest }
}
#[inline]
pub(crate) const fn pack(self) -> u32 {
0x8000_0000 | ((self.range as u32) << 16) | (self.nest as u32)
}
#[inline]
#[cfg(test)]
pub(crate) const fn decode(packed: u32) -> Option<Self> {
if (packed & 0x8000_0000) == 0 {
None
} else {
let range = ((packed & 0x7FFF_0000) >> 16) as u16;
let nest = (packed & 0x0000_FFFF) as u16;
Some(Self::new(range, nest))
}
}
}
#[inline]
#[cfg(test)]
pub(crate) fn tap_scope(event: &TapEvent) -> Option<ScopeTrace> {
ScopeTrace::decode(event.arg2)
}