pub(crate) trait Align4 {
fn align_forward(self) -> Self;
fn align_backward(self) -> Self;
}
impl<T> Align4 for *const T {
#[inline]
fn align_forward(self) -> Self {
unsafe { self.byte_add((4 - (self as usize % 4)) % 4) }
}
#[inline]
fn align_backward(self) -> Self {
unsafe { self.byte_sub(self as usize % 4) }
}
}
impl<T> Align4 for *mut T {
#[inline]
fn align_forward(self) -> Self {
unsafe { self.byte_add((4 - (self as usize % 4)) % 4) }
}
#[inline]
fn align_backward(self) -> Self {
unsafe { self.byte_sub(self as usize % 4) }
}
}
#[cfg(test)]
mod tests {
use super::Align4;
use gba_test::test;
#[test]
fn align_forward_aligned() {
assert_eq!(
(0x0200_0000 as *const u8).align_forward(),
0x0200_0000 as *const u8
);
}
#[test]
fn align_forward_unaligned() {
assert_eq!(
(0x0200_0001 as *const u8).align_forward(),
0x0200_0004 as *const u8
);
}
#[test]
fn align_backward_aligned() {
assert_eq!(
(0x0200_0000 as *const u8).align_backward(),
0x0200_0000 as *const u8
);
}
#[test]
fn align_backward_unaligned() {
assert_eq!(
(0x0200_0002 as *const u8).align_backward(),
0x0200_0000 as *const u8
);
}
#[test]
fn align_backward_null() {
assert_eq!((0 as *const u8).align_backward(), 0 as *const u8);
}
}