1#![no_std]
81#![deny(unsafe_code)]
82#![deny(missing_docs)]
83#![deny(missing_debug_implementations)]
84
85extern crate alloc;
86
87mod arc;
88mod rc;
89
90use alloc::{boxed::Box, vec::Vec};
91use core::ops::Range;
92
93pub use arc::ArcSlice;
94pub use rc::RcSlice;
95
96pub trait RcSliceContainer {
99 type Item;
101
102 const IS_SHRINKABLE: bool;
106
107 fn len(&self) -> usize;
109
110 fn get(&self, range: Range<usize>) -> Option<&[Self::Item]>;
112
113 fn get_mut(&mut self, range: Range<usize>) -> Option<&mut [Self::Item]>;
115
116 fn shrink_container_to_range(&mut self, keep_range: Range<usize>) -> Option<Range<usize>>;
130}
131
132impl<T> RcSliceContainer for [T] {
133 type Item = T;
134 const IS_SHRINKABLE: bool = false;
135
136 fn len(&self) -> usize {
137 self.len()
138 }
139
140 fn get(&self, range: Range<usize>) -> Option<&[T]> {
141 Self::get(self, range)
142 }
143
144 fn get_mut(&mut self, range: Range<usize>) -> Option<&mut [T]> {
145 Self::get_mut(self, range)
146 }
147
148 fn shrink_container_to_range(&mut self, _keep_range: Range<usize>) -> Option<Range<usize>> {
149 unimplemented!()
150 }
151}
152
153#[test]
154fn test_slice_container_raw_array() {
155 use alloc::rc::Rc;
156 use RcSlice as Rcs;
157
158 let buffer: Rc<[u8]> = Rc::new([2, 4, 6, 8, 10]);
159
160 assert_eq!(*Rcs::new(&buffer, 1..4), [4, 6, 8]);
161 assert_eq!(*Rcs::new(&buffer, ..), [2, 4, 6, 8, 10]);
162 assert_eq!(*Rcs::new(&buffer, 0..=2), [2, 4, 6]);
163 assert_eq!(*Rcs::new(&buffer, 10..), []);
164}
165
166impl<T> RcSliceContainer for Box<[T]> {
167 type Item = T;
168 const IS_SHRINKABLE: bool = false;
169
170 fn len(&self) -> usize {
171 self.as_ref().len()
172 }
173
174 fn get(&self, range: Range<usize>) -> Option<&[Self::Item]> {
175 self.as_ref().get(range)
176 }
177
178 fn get_mut(&mut self, range: Range<usize>) -> Option<&mut [Self::Item]> {
179 self.as_mut().get_mut(range)
180 }
181
182 fn shrink_container_to_range(&mut self, _keep_range: Range<usize>) -> Option<Range<usize>> {
183 unimplemented!()
184 }
185}
186
187#[test]
188fn test_slice_container_boxed_array() {
189 use alloc::rc::Rc;
190 use RcSlice as Rcs;
191
192 let buffer: Rc<Box<[u8]>> = Rc::new(Box::new([2, 4, 6, 8, 10]));
193
194 assert_eq!(*Rcs::new(&buffer, 1..4), [4, 6, 8]);
195 assert_eq!(*Rcs::new(&buffer, ..), [2, 4, 6, 8, 10]);
196 assert_eq!(*Rcs::new(&buffer, 0..=2), [2, 4, 6]);
197 assert_eq!(*Rcs::new(&buffer, 10..), []);
198}
199
200impl<T> RcSliceContainer for Vec<T> {
201 type Item = T;
202 const IS_SHRINKABLE: bool = true;
203
204 fn len(&self) -> usize {
205 self.len()
206 }
207
208 fn get(&self, range: Range<usize>) -> Option<&[T]> {
209 self.as_slice().get(range)
210 }
211
212 fn get_mut(&mut self, range: Range<usize>) -> Option<&mut [T]> {
213 self.as_mut_slice().get_mut(range)
214 }
215
216 fn shrink_container_to_range(&mut self, keep_range: Range<usize>) -> Option<Range<usize>> {
217 self.truncate(keep_range.end);
219
220 let mut cur_index = 0;
221 self.retain(|_| {
222 let ret = keep_range.contains(&cur_index);
223 cur_index += 1;
224 ret
225 });
226 self.shrink_to_fit();
227 Some(0..Self::len(self))
228 }
229}
230
231#[test]
232fn test_slice_container_vec() {
233 use alloc::rc::Rc;
234 use alloc::vec;
235 use RcSlice as Rcs;
236
237 let buffer: Rc<Vec<u8>> = Rc::new(vec![2, 4, 6, 8, 10]);
238
239 assert_eq!(*Rcs::new(&buffer, 1..4), [4, 6, 8]);
240 assert_eq!(*Rcs::new(&buffer, ..), [2, 4, 6, 8, 10]);
241 assert_eq!(*Rcs::new(&buffer, 0..=2), [2, 4, 6]);
242 assert_eq!(*Rcs::new(&buffer, 10..), []);
243
244 let mut slice = Rcs::new(&buffer, 1..4);
245 core::mem::drop(buffer);
246 assert_eq!(Rc::strong_count(RcSlice::inner(&slice)), 1);
247 assert_eq!(*slice, [4, 6, 8]);
248 assert_eq!(**RcSlice::inner(&slice), [2, 4, 6, 8, 10]);
249 assert_eq!(RcSlice::shrink(&mut slice), true);
250 assert_eq!(*slice, [4, 6, 8]);
251 assert_eq!(**RcSlice::inner(&slice), [4, 6, 8]);
252}
253
254#[cfg(feature = "smallvec")]
255impl<T: smallvec::Array> RcSliceContainer for smallvec::SmallVec<T> {
256 type Item = T::Item;
257 const IS_SHRINKABLE: bool = true;
258
259 fn len(&self) -> usize {
260 self.len()
261 }
262
263 fn get(&self, range: Range<usize>) -> Option<&[Self::Item]> {
264 self.as_slice().get(range)
265 }
266
267 fn get_mut(&mut self, range: Range<usize>) -> Option<&mut [Self::Item]> {
268 self.as_mut_slice().get_mut(range)
269 }
270
271 fn shrink_container_to_range(&mut self, keep_range: Range<usize>) -> Option<Range<usize>> {
272 if !self.spilled() {
273 return None;
275 }
276
277 self.truncate(keep_range.end);
279
280 let mut cur_index = 0;
281 self.retain(|_| {
282 let ret = keep_range.contains(&cur_index);
283 cur_index += 1;
284 ret
285 });
286 self.shrink_to_fit();
287 Some(0..Self::len(self))
288 }
289}
290
291#[cfg(feature = "smallvec")]
294#[test]
295fn test_slice_container_smallvec() {
296 use alloc::rc::Rc;
297 use alloc::vec;
298 use smallvec::SmallVec;
299 use RcSlice as Rcs;
300
301 let buffer: Rc<SmallVec<[u8; 4]>> = Rc::new(SmallVec::from_vec(vec![2, 4, 6, 8, 10]));
302
303 assert_eq!(*Rcs::new(&buffer, 1..4), [4, 6, 8]);
304 assert_eq!(*Rcs::new(&buffer, ..), [2, 4, 6, 8, 10]);
305 assert_eq!(*Rcs::new(&buffer, 0..=2), [2, 4, 6]);
306 assert_eq!(*Rcs::new(&buffer, 10..), []);
307
308 let mut slice = Rcs::new(&buffer, 1..4);
309 core::mem::drop(buffer);
310 assert_eq!(Rc::strong_count(RcSlice::inner(&slice)), 1);
311 assert_eq!(*slice, [4, 6, 8]);
312 assert_eq!(RcSlice::inner(&slice).as_ref().as_ref(), [2, 4, 6, 8, 10]);
313 assert_eq!(RcSlice::inner(&slice).spilled(), true);
314
315 assert_eq!(RcSlice::shrink(&mut slice), true);
316
317 assert_eq!(*slice, [4, 6, 8]);
318 assert_eq!(RcSlice::inner(&slice).as_ref().as_ref(), [4, 6, 8]);
319 assert_eq!(RcSlice::inner(&slice).spilled(), false);
320}
321
322#[deprecated(since = "0.4.0")]
324pub type RcBytes = RcSlice<[u8]>;
325
326#[deprecated(since = "0.4.0")]
328pub type ArcBytes = ArcSlice<[u8]>;