vmi_core/core/
address_context.rsuse serde::{Deserialize, Serialize};
use super::{Pa, Va};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub struct AddressContext {
pub va: Va,
pub root: Pa,
}
impl AddressContext {
pub fn new(va: impl Into<Va>, root: impl Into<Pa>) -> Self {
Self {
va: va.into(),
root: root.into(),
}
}
}
impl From<(Va, Pa)> for AddressContext {
fn from(value: (Va, Pa)) -> Self {
Self::new(value.0, value.1)
}
}
impl ::std::ops::Add<u64> for AddressContext {
type Output = AddressContext;
fn add(self, rhs: u64) -> Self::Output {
Self {
va: self.va + rhs,
..self
}
}
}
impl ::std::ops::Add<AddressContext> for AddressContext {
type Output = AddressContext;
fn add(self, rhs: AddressContext) -> Self::Output {
Self {
va: self.va + rhs.va,
..self
}
}
}
impl ::std::ops::AddAssign<u64> for AddressContext {
fn add_assign(&mut self, rhs: u64) {
self.va += rhs;
}
}
impl ::std::ops::AddAssign<AddressContext> for AddressContext {
fn add_assign(&mut self, rhs: AddressContext) {
self.va += rhs.va;
}
}
impl ::std::ops::Sub<u64> for AddressContext {
type Output = AddressContext;
fn sub(self, rhs: u64) -> Self::Output {
Self {
va: self.va - rhs,
..self
}
}
}
impl ::std::ops::Sub<AddressContext> for AddressContext {
type Output = AddressContext;
fn sub(self, rhs: AddressContext) -> Self::Output {
Self {
va: self.va - rhs.va,
..self
}
}
}
impl ::std::ops::SubAssign<u64> for AddressContext {
fn sub_assign(&mut self, rhs: u64) {
self.va -= rhs;
}
}
impl ::std::ops::SubAssign<AddressContext> for AddressContext {
fn sub_assign(&mut self, rhs: AddressContext) {
self.va -= rhs.va;
}
}
impl ::std::ops::Mul<u64> for AddressContext {
type Output = AddressContext;
fn mul(self, rhs: u64) -> Self::Output {
Self {
va: self.va * rhs,
..self
}
}
}
impl ::std::ops::Mul<AddressContext> for AddressContext {
type Output = AddressContext;
fn mul(self, rhs: AddressContext) -> Self::Output {
Self {
va: self.va * rhs.va,
..self
}
}
}
impl ::std::ops::MulAssign<u64> for AddressContext {
fn mul_assign(&mut self, rhs: u64) {
self.va *= rhs;
}
}
impl ::std::ops::MulAssign<AddressContext> for AddressContext {
fn mul_assign(&mut self, rhs: AddressContext) {
self.va *= rhs.va;
}
}
impl ::std::ops::Div<u64> for AddressContext {
type Output = AddressContext;
fn div(self, rhs: u64) -> Self::Output {
Self {
va: self.va / rhs,
..self
}
}
}
impl ::std::ops::Div<AddressContext> for AddressContext {
type Output = AddressContext;
fn div(self, rhs: AddressContext) -> Self::Output {
Self {
va: self.va / rhs.va,
..self
}
}
}
impl ::std::ops::DivAssign<u64> for AddressContext {
fn div_assign(&mut self, rhs: u64) {
self.va /= rhs;
}
}
impl ::std::ops::DivAssign<AddressContext> for AddressContext {
fn div_assign(&mut self, rhs: AddressContext) {
self.va /= rhs.va;
}
}
impl ::std::ops::BitAnd<u64> for AddressContext {
type Output = AddressContext;
fn bitand(self, rhs: u64) -> Self::Output {
Self {
va: self.va & rhs,
..self
}
}
}
impl ::std::ops::BitAndAssign<u64> for AddressContext {
fn bitand_assign(&mut self, rhs: u64) {
self.va &= rhs;
}
}
impl ::std::ops::BitOr<u64> for AddressContext {
type Output = AddressContext;
fn bitor(self, rhs: u64) -> Self::Output {
Self {
va: self.va | rhs,
..self
}
}
}
impl ::std::ops::BitOrAssign<u64> for AddressContext {
fn bitor_assign(&mut self, rhs: u64) {
self.va |= rhs;
}
}
impl ::std::fmt::Display for AddressContext {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
write!(f, "{} @ {}", self.va, self.root)
}
}