#![allow(non_snake_case)]
#![allow(dead_code)]
use std::cmp;
use std::fmt;
use std::mem::size_of as size_of;
use super::*;
#[repr(C)]
#[derive(Copy, Clone, Eq, Hash)]
pub struct VoidAddr(usize);
deriveAddrReqs!(VoidAddr);
impl Address for VoidAddr {
fn from_usize(val : usize) -> VoidAddr { VoidAddr(val) }
fn as_usize(&self) -> usize { self.0 }
fn verify(self) -> bool { true }
#[inline(always)] fn load<T: Copy> (&self) -> T {
panic!("Can't load() a VoidAddr!")
}
#[inline(always)] fn store<T> (&self, _value: T) {
panic!("Can't store() a VoidAddr!")
}
#[inline(always)] fn memset(&self, _char: u8, _length: usize) {
panic!("Can't memset() a VoidAddr!")
}
}
impl VoidAddr {
pub fn from_addr<A: Address>(ptr : A) -> Self {
VoidAddr(ptr.as_usize())
}
}
#[repr(C)]
#[derive(Copy, Clone, Eq, Hash)]
pub struct AddrAddr(usize);
deriveAddr!(AddrAddr, 1 << size_of::<usize>());
#[inline(always)]
pub fn test_nth_bit(value: u8, index: usize) -> bool {
value & (1 << index) != 0
}
#[inline(always)]
pub fn lower_bits(value: u8, len: usize) -> u8 {
value & ((1 << len) - 1)
}
#[repr(C)]
#[derive(Copy, Clone, Eq, Hash)]
pub struct Word(usize);
deriveAddrReqs!(Word);
fn trailing_zeros(x : usize) -> usize {
if x % 2 != 0 { 0 } else { trailing_zeros(x / 2) }
}
pub const BYTES_IN_WORD : usize = size_of::<usize>();
#[cfg(target_pointer_width = "32")]
pub const LOG_BYTES_IN_WORD : usize = 2;
#[cfg(target_pointer_width = "64")]
pub const LOG_BYTES_IN_WORD : usize = 3;
#[cfg(all(not(target_pointer_width = "64"), not(target_pointer_width = "32")))]
pub const LOG_BYTES_IN_WORD : usize =
panic!("Unsupported word size.");
#[repr(C)]
#[derive(Copy, Clone, Eq, Hash)]
pub struct WordAddr(usize);
impl Address for Word {
fn from_usize(val : usize) -> Word { Word(val) }
fn as_usize(&self) -> usize { self.0 }
fn verify(self) -> bool { true }
#[inline(always)] fn load<T: Copy> (&self) -> T {
panic!("Can't load() a Word!")
}
#[inline(always)] fn store<T> (&self, _value: T) {
panic!("Can't store() a Word!")
}
fn memset(&self, _char: u8, _length: usize) {
panic!("Can't memset() a Word!")
}
}
deriveAddrReqs!(WordAddr);
impl Address for WordAddr {
fn from_usize(val : usize) -> WordAddr { WordAddr(val) }
fn as_usize(&self) -> usize { self.0 }
fn verify(self) -> bool { true }
#[inline(always)] fn load<T: Copy> (&self) -> T { unsafe {
*(self.as_usize() as *mut T)
}}
#[inline(always)] fn store<T> (&self, value: T) { unsafe {
*(self.as_usize() as *mut T) = value;
}}
}
#[repr(C)]
#[derive(Copy, Clone, Eq, Hash)]
pub struct Byte(u8);
deriveAddrReqs!(Byte);
impl Address for Byte {
fn from_usize(val : usize) -> Byte { Byte(val as u8) }
fn as_usize(&self) -> usize { self.0 as usize }
fn verify(self) -> bool { true }
#[inline(always)] fn load<T: Copy> (&self) -> T {
panic!("Can't load() a Byte!")
}
#[inline(always)] fn store<T> (&self, _value: T) {
panic!("Can't store() a Byte!")
}
fn memset(&self, _char: u8, _length: usize) {
panic!("Can't memset() a Byte!")
}
}
#[repr(C)]
#[derive(Copy, Clone, Eq, Hash)]
pub struct ByteAddr(usize);
deriveAddrReqs!(ByteAddr);
impl Address for ByteAddr {
fn from_usize(val : usize) -> ByteAddr { ByteAddr(val) }
fn as_usize(&self) -> usize { self.0 }
fn verify(self) -> bool { true }
#[inline(always)] fn load<T: Copy> (&self) -> T { unsafe {
*(self.as_usize() as *mut T)
}}
#[inline(always)] fn store<T> (&self, value: T) { unsafe {
*(self.as_usize() as *mut T) = value;
}}
}
#[cfg(test)]
mod tests {
use super::*;
pub const VAL : u8 = 0b000011_11;
#[test] pub fn v0() { assert_eq!(test_nth_bit(VAL, 0), true); }
#[test] pub fn v1() { assert_eq!(test_nth_bit(VAL, 1), true); }
#[test] pub fn v2() { assert_eq!(test_nth_bit(VAL, 2), true); }
#[test] pub fn v3() { assert_eq!(test_nth_bit(VAL, 3), true); }
#[test] pub fn v4() { assert_eq!(test_nth_bit(VAL, 4), false); }
#[test] pub fn v5() { assert_eq!(test_nth_bit(VAL, 5), false); }
#[test] pub fn v6() { assert_eq!(test_nth_bit(VAL, 6), false); }
#[test] pub fn v7() { assert_eq!(test_nth_bit(VAL, 7), false); }
}