1use alloc::{boxed::Box, rc::Rc, sync::Arc};
6use core::ops::Range;
7
8use super::Paddr;
9use crate::mm::Daddr;
10
11pub trait HasPaddr {
13 fn paddr(&self) -> Paddr;
15}
16
17pub trait HasDaddr {
19 fn daddr(&self) -> Daddr;
21}
22
23pub trait HasSize {
25 fn size(&self) -> usize;
27}
28
29pub trait HasPaddrRange: HasPaddr + HasSize {
31 fn end_paddr(&self) -> Paddr;
33
34 fn paddr_range(&self) -> Range<Paddr>;
36}
37
38impl<T: HasPaddr + HasSize> HasPaddrRange for T {
39 fn end_paddr(&self) -> Paddr {
40 self.paddr() + self.size()
41 }
42
43 fn paddr_range(&self) -> Range<Paddr> {
44 self.paddr()..self.end_paddr()
45 }
46}
47
48macro_rules! impl_has_traits_for_ref_type {
49 ($t:ty, $([$trait_name:ident, $fn_name:ident]),*) => {
50 $(
51 impl<T: $trait_name> $trait_name for $t {
52 fn $fn_name(&self) -> usize {
53 (**self).$fn_name()
54 }
55 }
56 )*
57 };
58 ($($t:ty),*) => {
59 $(
60 impl_has_traits_for_ref_type!($t, [HasPaddr, paddr], [HasDaddr, daddr], [HasSize, size]);
61 )*
62 };
63}
64
65impl_has_traits_for_ref_type!(&T, &mut T, Rc<T>, Arc<T>, Box<T>);