nightly_quirks/
utils.rs

1use parking_lot::lock_api::RawMutex;
2use parking_lot::{Mutex, MutexGuard};
3use std::mem::MaybeUninit;
4use std::ops::DerefMut;
5
6pub struct NightlyUtils(());
7
8impl NightlyUtils {
9    #[inline]
10    pub fn box_new_uninit_slice<T>(size: usize) -> Box<[MaybeUninit<T>]> {
11        #[cfg(not(feature = "nightly"))]
12        {
13            let mut vec = Vec::with_capacity(size);
14            unsafe {
15                vec.set_len(size);
16            }
17            vec.into_boxed_slice()
18        }
19        #[cfg(feature = "nightly")]
20        Box::new_uninit_slice(size)
21    }
22
23    #[inline(always)]
24    pub unsafe fn box_assume_init<T>(box_: Box<[MaybeUninit<T>]>) -> Box<[T]> {
25        #[cfg(not(feature = "nightly"))]
26        {
27            std::mem::transmute(box_)
28        }
29        #[cfg(feature = "nightly")]
30        {
31            box_.assume_init()
32        }
33    }
34
35    #[inline]
36    pub fn box_new_zeroed_slice<T>(size: usize) -> Box<[MaybeUninit<T>]> {
37        #[cfg(not(feature = "nightly"))]
38        {
39            let mut vec = Vec::with_capacity(size);
40            unsafe {
41                std::ptr::write_bytes(vec.as_mut_ptr(), 0, size);
42                vec.set_len(size);
43            }
44            vec.into_boxed_slice()
45        }
46        #[cfg(feature = "nightly")]
47        Box::new_zeroed_slice(size)
48    }
49
50    #[inline]
51    pub unsafe fn box_new_uninit_slice_assume_init<T: Copy>(size: usize) -> Box<[T]> {
52        #[cfg(not(feature = "nightly"))]
53        {
54            let mut vec = Vec::with_capacity(size);
55            vec.set_len(size);
56            vec.into_boxed_slice()
57        }
58        #[cfg(feature = "nightly")]
59        Box::new_uninit_slice(size).assume_init()
60    }
61
62    #[inline]
63    pub unsafe fn box_new_zeroed_slice_assume_init<T: Copy>(size: usize) -> Box<[T]> {
64        #[cfg(not(feature = "nightly"))]
65        {
66            let mut vec = Vec::with_capacity(size);
67            std::ptr::write_bytes(vec.as_mut_ptr(), 0, size);
68            vec.set_len(size);
69            vec.into_boxed_slice()
70        }
71        #[cfg(feature = "nightly")]
72        Box::new_zeroed_slice(size).assume_init()
73    }
74
75    pub fn mutex_get_or_init<'a, T>(
76        m: &'a mut MutexGuard<Option<T>>,
77        init_fn: fn() -> T,
78    ) -> &'a mut T {
79        if m.is_none() {
80            *m.deref_mut() = Some(init_fn());
81        }
82        m.as_mut().unwrap()
83    }
84
85    pub const fn new_mutex<T>(val: T) -> Mutex<T> {
86        Mutex::const_new(parking_lot::RawMutex::INIT, val)
87    }
88}