sel4_abstract_ptr/
access.rs
1pub trait RestrictAccess<To>: Access {
23 type Restricted: Access;
25}
26
27impl<To: Access> RestrictAccess<To> for ReadWrite {
28 type Restricted = To;
29}
30
31impl<To> RestrictAccess<To> for NoAccess {
32 type Restricted = Self;
33}
34
35macro_rules! restrict_impl {
37 ($SelfT:ty, $To:ty, $Restricted:ty) => {
38 impl RestrictAccess<$To> for $SelfT {
39 type Restricted = $Restricted;
40 }
41 };
42}
43
44restrict_impl!(ReadOnly, ReadWrite, ReadOnly);
45restrict_impl!(ReadOnly, ReadOnly, ReadOnly);
46restrict_impl!(ReadOnly, WriteOnly, NoAccess);
47restrict_impl!(ReadOnly, NoAccess, NoAccess);
48
49restrict_impl!(WriteOnly, ReadWrite, WriteOnly);
50restrict_impl!(WriteOnly, ReadOnly, NoAccess);
51restrict_impl!(WriteOnly, WriteOnly, WriteOnly);
52restrict_impl!(WriteOnly, NoAccess, NoAccess);
53
54pub trait Access: Copy + Default + private::Sealed {}
56
57pub trait Readable: Access {}
59impl<A: RestrictAccess<ReadOnly, Restricted = ReadOnly>> Readable for A {}
60
61pub trait Writable: Access {}
63impl<A: RestrictAccess<WriteOnly, Restricted = WriteOnly>> Writable for A {}
64
65pub trait Copyable: Access {}
67impl<A: RestrictAccess<ReadOnly, Restricted = Self>> Copyable for A {}
68
69#[derive(Debug, Default, Copy, Clone)]
71pub struct ReadWrite;
72impl Access for ReadWrite {}
73
74#[derive(Debug, Default, Copy, Clone)]
76pub struct ReadOnly;
77impl Access for ReadOnly {}
78
79#[derive(Debug, Default, Copy, Clone)]
81pub struct WriteOnly;
82impl Access for WriteOnly {}
83
84#[derive(Debug, Default, Copy, Clone)]
86pub struct NoAccess;
87impl Access for NoAccess {}
88
89mod private {
90 pub trait Sealed {}
91
92 impl Sealed for super::ReadWrite {}
93 impl Sealed for super::ReadOnly {}
94 impl Sealed for super::WriteOnly {}
95 impl Sealed for super::NoAccess {}
96}