1use super::{LocalRb, SharedRb};
2use crate::utils::uninit_array;
3use core::mem::MaybeUninit;
4
5#[cfg(feature = "alloc")]
6use alloc::{collections::TryReserveError, vec::Vec};
7
8impl<T, const N: usize> Default for LocalRb<T, [MaybeUninit<T>; N]> {
9 fn default() -> Self {
10 unsafe { Self::from_raw_parts(container:uninit_array(), head:0, tail:0) }
11 }
12}
13impl<T, const N: usize> Default for SharedRb<T, [MaybeUninit<T>; N]> {
14 fn default() -> Self {
15 unsafe { Self::from_raw_parts(container:uninit_array(), head:0, tail:0) }
16 }
17}
18
19#[cfg(feature = "alloc")]
20impl<T> LocalRb<T, Vec<MaybeUninit<T>>> {
21 /// Creates a new instance of a ring buffer.
22 ///
23 /// *Panics if `capacity` is zero.*
24 pub fn new(capacity: usize) -> Self {
25 let mut data: Vec> = Vec::new();
26 data.resize_with(new_len:capacity, f:MaybeUninit::uninit);
27 unsafe { Self::from_raw_parts(container:data, head:0, tail:0) }
28 }
29}
30#[cfg(feature = "alloc")]
31impl<T> SharedRb<T, Vec<MaybeUninit<T>>> {
32 /// Creates a new instance of a ring buffer.
33 ///
34 /// *Panics if allocation failed or `capacity` is zero.*
35 pub fn new(capacity: usize) -> Self {
36 Self::try_new(capacity).unwrap()
37 }
38
39 /// Creates a new instance of a ring buffer returning an error if allocation failed.
40 ///
41 /// *Panics if `capacity` is zero.*
42 pub fn try_new(capacity: usize) -> Result<Self, TryReserveError> {
43 let mut data: Vec> = Vec::new();
44 data.try_reserve_exact(additional:capacity)?;
45 data.resize_with(new_len:capacity, f:MaybeUninit::uninit);
46 Ok(unsafe { Self::from_raw_parts(container:data, head:0, tail:0) })
47 }
48}
49