use std::fmt::Display;
#[derive(Clone, PartialEq, Eq, Hash)]
pub enum Offset {
Immediate(u32),
PointerScaled(u32),
}
impl Offset {
pub fn zero() -> Self {
Offset::Immediate(0)
}
}
pub trait ResolveOffset {
fn resolve(&self, ptr_size: u32) -> u32;
}
impl ResolveOffset for Offset {
fn resolve(&self, ptr_size: u32) -> u32 {
match self {
Offset::Immediate(n) => *n,
Offset::PointerScaled(n) => *n * ptr_size,
}
}
}
impl Display for Offset {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Offset::Immediate(offset) => write!(f, "{}", offset),
Offset::PointerScaled(scale) => write!(f, "ptr*{}", scale),
}
}
}