use page::PAGE_SIZE;
use std::cmp::Ordering;
use std::fmt;
use std::ops;
const INVALID: u64 = 0xffffffffffff;
#[derive(Eq, PartialEq, Hash, Copy, Clone, Debug)]
pub struct PRef(u64);
impl Default for PRef {
fn default() -> Self {
PRef(INVALID)
}
}
impl Ord for PRef {
fn cmp(&self, other: &Self) -> Ordering {
self.0.cmp(&other.0)
}
}
impl PartialOrd for PRef {
fn partial_cmp(&self, other: &PRef) -> Option<Ordering> {
self.0.partial_cmp(&other.0)
}
}
impl From<u64> for PRef {
fn from(n: u64) -> Self {
PRef(n)
}
}
impl fmt::Display for PRef {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
write!(f, "{}", self.0)
}
}
impl ops::Add<u64> for PRef {
type Output = PRef;
fn add(self, rhs: u64) -> <Self as ops::Add<u64>>::Output {
PRef::from(self.as_u64() + rhs)
}
}
impl ops::AddAssign<u64> for PRef {
fn add_assign(&mut self, rhs: u64) {
#[cfg(debug_assertions)]
{
if self.0 + rhs >= INVALID {
panic!("Pref::from(INVALID)");
}
}
self.0 += rhs;
}
}
impl ops::Sub<u64> for PRef {
type Output = PRef;
fn sub(self, rhs: u64) -> <Self as ops::Sub<u64>>::Output {
PRef::from(self.as_u64() - rhs)
}
}
impl ops::SubAssign<u64> for PRef {
fn sub_assign(&mut self, rhs: u64) {
#[cfg(debug_assertions)]
{
if rhs > self.0 {
panic!("pref would become invalid through subtraction");
}
}
self.0 -= rhs;
}
}
impl PRef {
pub fn invalid () -> PRef {
PRef(INVALID)
}
pub fn is_valid (&self) -> bool {
self.0 < INVALID
}
pub fn as_u64 (&self) -> u64 {
return self.0;
}
pub fn this_page(&self) -> PRef {
PRef::from((self.0/ PAGE_SIZE as u64)* PAGE_SIZE as u64)
}
pub fn page_number(&self) -> u64 {
self.0/PAGE_SIZE as u64
}
pub fn in_page_pos(&self) -> usize {
(self.0 % PAGE_SIZE as u64) as usize
}
}