juggle/round/
mod.rs

1mod dyn_future;
2mod algorithm;
3mod wheel;
4mod handle;
5mod registry;
6
7pub use self::handle::{IdNum, SpawnParams, State, WheelHandle};
8pub use self::wheel::{LockedWheel, SuspendError, Wheel};
9
10use core::cell::*;
11use core::ops::{Deref, DerefMut};
12
13/// UnsafeCell wrapper.
14/// SAFETY: Intended only to use inside this crate.
15/// Provides runtime borrow checking in debug mode and only wraps UnsafeCell without any
16/// checks in release mode.
17pub(crate) struct Ucw<T>{
18    #[cfg(debug_assertions)]
19    inner: RefCell<T>,
20    #[cfg(not(debug_assertions))]
21    inner: UnsafeCell<T>,
22}
23
24pub(crate) struct UcwRef<'a,T>{
25    #[cfg(debug_assertions)]
26    inner: Ref<'a,T>,
27    #[cfg(not(debug_assertions))]
28    inner: &'a T,
29}
30pub(crate) struct UcwRefMut<'a,T>{
31    #[cfg(debug_assertions)]
32    inner: RefMut<'a,T>,
33    #[cfg(not(debug_assertions))]
34    inner: &'a mut T,
35}
36impl<T> Deref for UcwRef<'_,T>{
37    type Target = T;
38    #[inline(always)]
39    fn deref(&self) -> &Self::Target { self.inner.deref() }
40}
41impl<T> Deref for UcwRefMut<'_,T>{
42    type Target = T;
43    #[inline(always)]
44    fn deref(&self) -> &Self::Target { self.inner.deref() }
45}
46impl<T> DerefMut for UcwRefMut<'_,T>{
47    #[inline(always)]
48    fn deref_mut(&mut self) -> &mut Self::Target { self.inner.deref_mut() }
49}
50
51impl<T> Ucw<T>{
52    #[inline(always)]
53    pub(crate) fn new(value: T)->Self{
54        Self{
55            #[cfg(debug_assertions)]
56            inner: RefCell::new(value),
57            #[cfg(not(debug_assertions))]
58            inner: UnsafeCell::new(value),
59        }
60    }
61    #[inline(always)]
62    pub(crate) fn borrow(&self)->UcwRef<'_,T>{
63        UcwRef{
64            #[cfg(debug_assertions)]
65            inner: self.inner.borrow(),
66            #[cfg(not(debug_assertions))]
67            inner: unsafe{ &*self.inner.get() },
68        }
69    }
70    #[inline(always)]
71    pub(crate) fn borrow_mut(&self)->UcwRefMut<'_,T>{
72        UcwRefMut{
73            #[cfg(debug_assertions)]
74            inner: self.inner.borrow_mut(),
75            #[cfg(not(debug_assertions))]
76            inner: unsafe{ &mut *self.inner.get() },
77        }
78    }
79}
80
81