sel4_async_block_io/
access.rs

1//
2// Copyright 2023, Colias Group, LLC
3//
4// SPDX-License-Identifier: BSD-2-Clause
5//
6
7pub 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}