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}