#![doc(html_root_url = "https://docs.rs/mju-bits/0.3.0")]
#![no_std]
pub mod bitfield;
pub mod storage;
pub use bitfield::*;
pub use storage::*;
#[cfg(test)]
mod test {
use super::*;
use typenum::{
U0, U3, U4, U7, U8, U15, U16, U31, U32, U63,
};
macro_rules! test {
($name:ident, $type:ident, $lo0:ident, $lo1:ident, $hi0:ident, $hi1:ident, $lo:expr, $hi:expr, $all:expr) => {
#[test]
fn $name() {
struct RegisterMarker;
type Register = Storage<RegisterMarker, $type>;
type RegisterAll = BitField<Register, $lo0, $hi1>;
type RegisterFieldLo = BitField<Register, $lo0, $lo1>;
type RegisterFieldHi = BitField<Register, $hi0, $hi1>;
let mut reg = Register::new();
assert_eq!(reg.get::<RegisterFieldLo>(), 0);
assert_eq!(reg.get::<RegisterFieldHi>(), 0);
reg.set::<RegisterFieldLo>($lo);
assert_eq!(reg.get::<RegisterFieldLo>(), $lo);
assert_eq!(reg.get::<RegisterFieldHi>(), 0);
reg.set::<RegisterFieldHi>($hi);
assert_eq!(reg.get::<RegisterFieldLo>(), $lo);
assert_eq!(reg.get::<RegisterFieldHi>(), $hi);
assert_eq!(reg.get::<RegisterAll>(), $all);
}
};
}
test!(
test_u8, u8,
U0, U3,
U4, U7,
0b1100, 0b1010,
0b10101100
);
test!(
test_u16, u16,
U0, U7,
U8, U15,
0b11110000, 0b10101010,
0b10101010_11110000
);
test!(
test_u32, u32,
U0, U15,
U16, U31,
0b11111111_00000000, 0b10101010_10101010,
0b10101010_10101010_11111111_00000000
);
#[cfg(target_pointer_width="64")]
test!(
test_u64, u64,
U0, U31,
U32, U63,
0b11111111_11111111_00000000_00000000, 0b10101010_10101010_10101010_10101010,
0b10101010_10101010_10101010_10101010_11111111_11111111_00000000_00000000
);
}