sel4_async_block_io/
access.rs
1pub trait Access: AccessSealed {
8 type ReadWitness: Witness;
9 type WriteWitness: Witness;
10}
11
12#[derive(Copy, Clone)]
13pub enum Absurdity {}
14
15impl Absurdity {
16 pub(crate) fn absurd<T>(self) -> T {
17 match self {}
18 }
19}
20
21pub trait Witness: Sized + Copy + Unpin {
22 const TRY_WITNESS: Option<Self>;
23}
24
25impl Witness for () {
26 const TRY_WITNESS: Option<Self> = Some(());
27}
28
29impl Witness for Absurdity {
30 const TRY_WITNESS: Option<Self> = None;
31}
32
33pub trait ReadAccess: Access {
34 const READ_WITNESS: Self::ReadWitness;
35}
36
37pub trait WriteAccess: Access {
38 const WRITE_WITNESS: Self::WriteWitness;
39}
40
41use sealing::AccessSealed;
42
43mod sealing {
44 use super::{ReadOnly, ReadWrite, WriteOnly};
45
46 pub trait AccessSealed {}
47
48 impl AccessSealed for ReadOnly {}
49 impl AccessSealed for WriteOnly {}
50 impl AccessSealed for ReadWrite {}
51}
52
53pub enum ReadOnly {}
54
55impl Access for ReadOnly {
56 type ReadWitness = ();
57 type WriteWitness = Absurdity;
58}
59
60impl ReadAccess for ReadOnly {
61 const READ_WITNESS: Self::ReadWitness = ();
62}
63
64pub enum WriteOnly {}
65
66impl Access for WriteOnly {
67 type ReadWitness = Absurdity;
68 type WriteWitness = ();
69}
70
71impl WriteAccess for WriteOnly {
72 const WRITE_WITNESS: Self::WriteWitness = ();
73}
74
75pub enum ReadWrite {}
76
77impl Access for ReadWrite {
78 type ReadWitness = ();
79 type WriteWitness = ();
80}
81
82impl ReadAccess for ReadWrite {
83 const READ_WITNESS: Self::ReadWitness = ();
84}
85
86impl WriteAccess for ReadWrite {
87 const WRITE_WITNESS: Self::WriteWitness = ();
88}