sel4_shared_ring_buffer/
roles.rs

1//
2// Copyright 2023, Colias Group, LLC
3//
4// SPDX-License-Identifier: BSD-2-Clause
5//
6
7use crate::InitializationStrategy;
8
9pub enum Provide {}
10pub enum Use {}
11
12pub trait RingBuffersRole: RingBuffersRoleSealed {
13    type FreeRole: RingBufferRole;
14    type UsedRole: RingBufferRole;
15
16    const ROLE: RingBuffersRoleValue;
17
18    fn default_initialization_strategy() -> InitializationStrategy;
19}
20
21impl RingBuffersRole for Provide {
22    type FreeRole = Write;
23    type UsedRole = Read;
24
25    const ROLE: RingBuffersRoleValue = RingBuffersRoleValue::Provide;
26
27    fn default_initialization_strategy() -> InitializationStrategy {
28        InitializationStrategy::UseAndWriteState(Default::default())
29    }
30}
31
32impl RingBuffersRole for Use {
33    type FreeRole = Read;
34    type UsedRole = Write;
35
36    const ROLE: RingBuffersRoleValue = RingBuffersRoleValue::Use;
37
38    fn default_initialization_strategy() -> InitializationStrategy {
39        InitializationStrategy::ReadState
40    }
41}
42
43#[derive(Debug, Copy, Clone, PartialOrd, Ord, PartialEq, Eq, Hash)]
44pub enum RingBuffersRoleValue {
45    Provide,
46    Use,
47}
48
49impl RingBuffersRoleValue {
50    pub fn is_provide(self) -> bool {
51        self == Self::Provide
52    }
53
54    pub fn is_use(self) -> bool {
55        self == Self::Use
56    }
57}
58
59pub enum Write {}
60pub enum Read {}
61
62pub trait RingBufferRole: RingBufferRoleSealed {
63    const ROLE: RingBufferRoleValue;
64}
65
66impl RingBufferRole for Write {
67    const ROLE: RingBufferRoleValue = RingBufferRoleValue::Write;
68}
69
70impl RingBufferRole for Read {
71    const ROLE: RingBufferRoleValue = RingBufferRoleValue::Read;
72}
73
74#[derive(Debug, Copy, Clone, PartialOrd, Ord, PartialEq, Eq, Hash)]
75pub enum RingBufferRoleValue {
76    Write,
77    Read,
78}
79
80impl RingBufferRoleValue {
81    pub fn is_write(self) -> bool {
82        self == Self::Write
83    }
84
85    pub fn is_read(self) -> bool {
86        self == Self::Read
87    }
88}
89
90use sealing::{RingBufferRoleSealed, RingBuffersRoleSealed};
91
92mod sealing {
93    use super::*;
94
95    pub trait RingBuffersRoleSealed {}
96
97    impl RingBuffersRoleSealed for Provide {}
98    impl RingBuffersRoleSealed for Use {}
99
100    pub trait RingBufferRoleSealed {}
101
102    impl RingBufferRoleSealed for Write {}
103    impl RingBufferRoleSealed for Read {}
104}