sel4_immutable_cell/
lib.rs

1//
2// Copyright 2023, Colias Group, LLC
3//
4// SPDX-License-Identifier: BSD-2-Clause
5//
6
7#![no_std]
8
9use core::cell::UnsafeCell;
10
11#[repr(transparent)]
12pub struct ImmutableCell<T: ?Sized> {
13    value: UnsafeCell<T>,
14}
15
16unsafe impl<T> Sync for ImmutableCell<T> {}
17
18impl<T: Default> Default for ImmutableCell<T> {
19    fn default() -> Self {
20        Self::new(Default::default())
21    }
22}
23
24impl<T> From<T> for ImmutableCell<T> {
25    fn from(t: T) -> Self {
26        Self::new(t)
27    }
28}
29
30impl<T> ImmutableCell<T> {
31    pub const fn new(value: T) -> Self {
32        Self {
33            value: UnsafeCell::new(value),
34        }
35    }
36}
37
38impl<T: ?Sized> ImmutableCell<T> {
39    pub fn get(&self) -> &T {
40        unsafe { self.value.get().as_ref().unwrap() }
41    }
42}