devela/data/dst/
buffer.rs1use crate::{Array, ConstDefault, Deref, DerefMut, MaybeUninit, MemPod};
4
5#[doc = crate::TAG_DATA_STRUCTURE!()]
6pub unsafe trait DstBuf {
17 type Inner: MemPod;
19
20 fn as_ref(&self) -> &[MaybeUninit<Self::Inner>];
22
23 fn as_mut(&mut self) -> &mut [MaybeUninit<Self::Inner>];
25
26 fn extend(&mut self, len: usize) -> Result<(), ()>;
28
29 fn round_to_words(bytes: usize) -> usize {
31 super::round_to_words::<Self::Inner>(bytes)
32 }
33}
34
35#[rustfmt::skip]
37unsafe impl<T, U> DstBuf for &mut T where U: MemPod, T: DstBuf<Inner = U> {
38 type Inner = T::Inner;
39
40 fn as_ref(&self) -> &[MaybeUninit<Self::Inner>] {
41 (**self).as_ref()
42 }
43 fn as_mut(&mut self) -> &mut [MaybeUninit<Self::Inner>] {
44 (**self).as_mut()
45 }
46 fn extend(&mut self, len: usize) -> Result<(), ()> {
47 (**self).extend(len)
48 }
49}
50
51unsafe impl<T: MemPod, const CAP: usize> DstBuf for [MaybeUninit<T>; CAP] {
53 type Inner = T;
54
55 fn as_ref(&self) -> &[MaybeUninit<Self::Inner>] {
56 self
57 }
58 fn as_mut(&mut self) -> &mut [MaybeUninit<Self::Inner>] {
59 self
60 }
61 fn extend(&mut self, len: usize) -> Result<(), ()> {
62 if len > CAP { Err(()) } else { Ok(()) }
63 }
64}
65
66#[cfg(feature = "alloc")]
80#[cfg_attr(nightly_doc, doc(cfg(feature = "alloc")))]
81unsafe impl<T: MemPod> DstBuf for crate::Vec<MaybeUninit<T>> {
82 type Inner = T;
83 fn as_ref(&self) -> &[MaybeUninit<Self::Inner>] {
84 self
85 }
86 fn as_mut(&mut self) -> &mut [MaybeUninit<Self::Inner>] {
87 self
88 }
89 fn extend(&mut self, len: usize) -> Result<(), ()> {
90 if len > self.len() {
91 self.resize(len, MaybeUninit::uninit());
92 let cap = self.capacity();
93 self.resize(cap, MaybeUninit::uninit());
94 }
95 Ok(())
96 }
97}
98
99#[doc = crate::TAG_DATA_STRUCTURE!()]
100pub struct DstArray<T, const CAP: usize> {
102 inner: Array<MaybeUninit<T>, CAP>,
103}
104impl<T, const CAP: usize> Deref for DstArray<T, CAP> {
105 type Target = Array<MaybeUninit<T>, CAP>;
106
107 fn deref(&self) -> &Self::Target {
108 &self.inner
109 }
110}
111impl<T, const CAP: usize> DerefMut for DstArray<T, CAP> {
112 fn deref_mut(&mut self) -> &mut Self::Target {
113 &mut self.inner
114 }
115}
116impl<T: MemPod, const CAP: usize> Default for DstArray<T, CAP> {
117 fn default() -> Self {
118 Self { inner: Array::new([MaybeUninit::uninit(); CAP]) }
119 }
120}
121impl<T: MemPod, const CAP: usize> ConstDefault for DstArray<T, CAP> {
122 const DEFAULT: Self = Self {
123 inner: Array::new_bare([MaybeUninit::uninit(); CAP]),
124 };
125}
126#[rustfmt::skip]
127unsafe impl<T: MemPod, const CAP: usize> DstBuf for DstArray<T, CAP> {
128 type Inner = T;
129 fn as_ref(&self) -> &[MaybeUninit<Self::Inner>] {
130 &self.inner
131 }
132 fn as_mut(&mut self) -> &mut [MaybeUninit<Self::Inner>] {
133 &mut self.inner
134 }
135 fn extend(&mut self, len: usize) -> Result<(), ()> {
136 if len > CAP { Err(()) } else { Ok(()) }
137 }
138}
139
140#[doc = crate::TAG_DATA_STRUCTURE!()]
141pub type DstArrayUsize<const CAP: usize> = DstArray<usize, CAP>;
144
145#[doc = crate::TAG_DATA_STRUCTURE!()]
146#[cfg(feature = "alloc")]
149#[cfg_attr(nightly_doc, doc(cfg(feature = "alloc")))]
150pub type DstVecUsize = crate::Vec<MaybeUninit<usize>>;
151
152