use serde::{Deserialize, Serialize};
use tracing::error;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub(super) struct Addr(Vec<u32>);
impl Default for Addr {
fn default() -> Self {
Self(vec![0])
}
}
impl Addr {
pub(super) fn enter_scope(&mut self) {
self.0.push(1);
}
pub(super) fn leave_scope(&mut self) {
if self.0.len() > 1 {
self.0.pop();
} else {
error!("Profiler error: attempted to leave root address scope");
}
}
pub(super) fn advance(&mut self, steps: u32) -> Vec<Addr> {
(0..steps).map(|_| self.advance_one()).collect()
}
fn advance_one(&mut self) -> Addr {
let prev = self.clone();
if let Some(last) = self.0.last_mut() {
*last += 1;
}
prev
}
}