1#![cfg(feature = "alloc")]
17
18#[cfg(all(feature = "alloc", not(feature = "std")))]
19use alloc::vec::Vec;
20
21use core::{
22 iter::{Cloned, Skip},
23 ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive},
24};
25
26use crate::{
27 iter::{
28 Iter, IterFrom, IterateByValue, IterateByValueFrom, IterateByValueFromGat,
29 IterateByValueGat,
30 },
31 slices::{
32 SliceByValue, SliceByValueMut, SliceByValueSubsliceGat, SliceByValueSubsliceGatMut,
33 SliceByValueSubsliceRange, SliceByValueSubsliceRangeMut, Subslice, SubsliceMut,
34 },
35};
36
37impl<T: Clone> SliceByValue for Vec<T> {
38 type Value = T;
39
40 #[inline]
41 fn len(&self) -> usize {
42 <[T]>::len(self)
43 }
44 #[inline]
45 fn get_value(&self, index: usize) -> Option<Self::Value> {
46 (*self).get(index).cloned()
47 }
48
49 #[inline]
50 fn index_value(&self, index: usize) -> Self::Value {
51 self[index].clone()
52 }
53
54 #[inline]
55 unsafe fn get_value_unchecked(&self, index: usize) -> Self::Value {
56 let val_ref = unsafe { (*self).get_unchecked(index) };
58 val_ref.clone()
59 }
60}
61
62impl<T: Clone> SliceByValueMut for Vec<T> {
63 #[inline]
64 fn set_value(&mut self, index: usize, value: Self::Value) {
65 self[index] = value;
66 }
67
68 #[inline]
69 unsafe fn set_value_unchecked(&mut self, index: usize, value: Self::Value) {
70 unsafe {
71 let val_mut = { self.get_unchecked_mut(index) };
73 *val_mut = value;
74 }
75 }
76
77 #[inline]
78 fn replace_value(&mut self, index: usize, value: Self::Value) -> Self::Value {
79 core::mem::replace(&mut self[index], value)
80 }
81
82 #[inline]
83 unsafe fn replace_value_unchecked(&mut self, index: usize, value: Self::Value) -> Self::Value {
84 let val_mut = unsafe { self.get_unchecked_mut(index) };
86 core::mem::replace(val_mut, value)
87 }
88
89 type ChunksMut<'a>
90 = core::slice::ChunksMut<'a, T>
91 where
92 Self: 'a;
93
94 type ChunksMutError = core::convert::Infallible;
95
96 #[inline]
97 fn try_chunks_mut(
98 &mut self,
99 chunk_size: usize,
100 ) -> Result<Self::ChunksMut<'_>, Self::ChunksMutError> {
101 Ok(self.chunks_mut(chunk_size))
102 }
103}
104
105impl<'a, T: Clone> SliceByValueSubsliceGat<'a> for Vec<T> {
106 type Subslice = &'a [T];
107}
108impl<'a, T: Clone> SliceByValueSubsliceGatMut<'a> for Vec<T> {
109 type SubsliceMut = &'a mut [T];
110}
111
112macro_rules! impl_range_vecs {
113 ($range:ty) => {
114 impl<T: Clone> SliceByValueSubsliceRange<$range> for Vec<T> {
115 #[inline]
116 fn get_subslice(&self, index: $range) -> Option<Subslice<'_, Self>> {
117 (*self).get(index)
118 }
119
120 #[inline]
121 fn index_subslice(&self, index: $range) -> Subslice<'_, Self> {
122 &self[index]
123 }
124
125 #[inline]
126 unsafe fn get_subslice_unchecked(&self, index: $range) -> Subslice<'_, Self> {
127 unsafe { (*self).get_unchecked(index) }
128 }
129 }
130 impl<T: Clone> SliceByValueSubsliceRangeMut<$range> for Vec<T> {
131 #[inline]
132 fn get_subslice_mut(&mut self, index: $range) -> Option<SubsliceMut<'_, Self>> {
133 (*self).get_mut(index)
134 }
135
136 #[inline]
137 fn index_subslice_mut(&mut self, index: $range) -> SubsliceMut<'_, Self> {
138 &mut self[index]
139 }
140
141 #[inline]
142 unsafe fn get_subslice_unchecked_mut(
143 &mut self,
144 index: $range,
145 ) -> SubsliceMut<'_, Self> {
146 unsafe { (*self).get_unchecked_mut(index) }
147 }
148 }
149 };
150}
151
152impl_range_vecs!(RangeFull);
153impl_range_vecs!(RangeFrom<usize>);
154impl_range_vecs!(RangeTo<usize>);
155impl_range_vecs!(Range<usize>);
156impl_range_vecs!(RangeInclusive<usize>);
157impl_range_vecs!(RangeToInclusive<usize>);
158
159impl<'a, T: Clone> IterateByValueGat<'a> for Vec<T> {
160 type Item = T;
161 type Iter = Cloned<core::slice::Iter<'a, T>>;
162}
163
164impl<T: Clone> IterateByValue for Vec<T> {
165 fn iter_value(&self) -> Iter<'_, Self> {
166 self.iter().cloned()
167 }
168}
169
170impl<'a, T: Clone> IterateByValueFromGat<'a> for Vec<T> {
171 type Item = T;
172 type IterFrom = Cloned<Skip<core::slice::Iter<'a, T>>>;
173}
174
175impl<T: Clone> IterateByValueFrom for Vec<T> {
176 fn iter_value_from(&self, from: usize) -> IterFrom<'_, Self> {
177 self.iter().skip(from).cloned()
178 }
179}
180
181#[cfg(feature = "std")]
182mod vec_deque {
183 use super::*;
184 use std::collections::VecDeque;
185
186 impl<T: Clone> SliceByValue for VecDeque<T> {
187 type Value = T;
188
189 #[inline]
190 fn len(&self) -> usize {
191 self.len()
192 }
193 #[inline]
194 fn get_value(&self, index: usize) -> Option<Self::Value> {
195 (*self).get(index).cloned()
196 }
197
198 #[inline]
199 fn index_value(&self, index: usize) -> Self::Value {
200 self[index].clone()
201 }
202
203 #[inline]
204 unsafe fn get_value_unchecked(&self, index: usize) -> Self::Value {
205 let val_ref = unsafe { (*self).get(index).unwrap_unchecked() };
207 val_ref.clone()
208 }
209 }
210
211 impl<T: Clone> SliceByValueMut for VecDeque<T> {
212 #[inline]
213 fn set_value(&mut self, index: usize, value: Self::Value) {
214 self[index] = value;
215 }
216
217 #[inline]
218 unsafe fn set_value_unchecked(&mut self, index: usize, value: Self::Value) {
219 unsafe {
220 let val_mut = { self.get_mut(index).unwrap_unchecked() };
222 *val_mut = value;
223 }
224 }
225
226 #[inline]
227 fn replace_value(&mut self, index: usize, value: Self::Value) -> Self::Value {
228 core::mem::replace(&mut self[index], value)
229 }
230
231 #[inline]
232 unsafe fn replace_value_unchecked(
233 &mut self,
234 index: usize,
235 value: Self::Value,
236 ) -> Self::Value {
237 let val_mut = unsafe { self.get_mut(index).unwrap_unchecked() };
239 core::mem::replace(val_mut, value)
240 }
241
242 type ChunksMut<'a>
243 = core::slice::ChunksMut<'a, T>
244 where
245 Self: 'a;
246
247 type ChunksMutError = core::convert::Infallible;
248
249 #[inline]
250 fn try_chunks_mut(
251 &mut self,
252 chunk_size: usize,
253 ) -> Result<Self::ChunksMut<'_>, Self::ChunksMutError> {
254 Ok(self.make_contiguous().chunks_mut(chunk_size))
256 }
257 }
258
259 impl<'a, T: Clone> IterateByValueGat<'a> for VecDeque<T> {
260 type Item = T;
261 type Iter = Cloned<std::collections::vec_deque::Iter<'a, T>>;
262 }
263
264 impl<T: Clone> IterateByValue for VecDeque<T> {
265 fn iter_value(&self) -> Iter<'_, Self> {
266 self.iter().cloned()
267 }
268 }
269
270 impl<'a, T: Clone> IterateByValueFromGat<'a> for VecDeque<T> {
271 type Item = T;
272 type IterFrom = Cloned<Skip<std::collections::vec_deque::Iter<'a, T>>>;
273 }
274
275 impl<T: Clone> IterateByValueFrom for VecDeque<T> {
276 fn iter_value_from(&self, from: usize) -> IterFrom<'_, Self> {
277 self.iter().skip(from).cloned()
278 }
279 }
280}