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) { unsafe {
70 let val_mut = { self.get_unchecked_mut(index) };
72 *val_mut = value;
73 }}
74
75 #[inline]
76 fn replace_value(&mut self, index: usize, value: Self::Value) -> Self::Value {
77 core::mem::replace(&mut self[index], value)
78 }
79
80 #[inline]
81 unsafe fn replace_value_unchecked(&mut self, index: usize, value: Self::Value) -> Self::Value {
82 let val_mut = unsafe { self.get_unchecked_mut(index) };
84 core::mem::replace(val_mut, value)
85 }
86
87 type ChunksMut<'a>
88 = core::slice::ChunksMut<'a, T>
89 where
90 Self: 'a;
91
92 type ChunksMutError = core::convert::Infallible;
93
94 #[inline]
95 fn try_chunks_mut(
96 &mut self,
97 chunk_size: usize,
98 ) -> Result<Self::ChunksMut<'_>, Self::ChunksMutError> {
99 Ok(self.chunks_mut(chunk_size))
100 }
101}
102
103impl<'a, T: Clone> SliceByValueSubsliceGat<'a> for Vec<T> {
104 type Subslice = &'a [T];
105}
106impl<'a, T: Clone> SliceByValueSubsliceGatMut<'a> for Vec<T> {
107 type SubsliceMut = &'a mut [T];
108}
109
110macro_rules! impl_range_vecs {
111 ($range:ty) => {
112 impl<T: Clone> SliceByValueSubsliceRange<$range> for Vec<T> {
113 #[inline]
114 fn get_subslice(&self, index: $range) -> Option<Subslice<'_, Self>> {
115 (*self).get(index)
116 }
117
118 #[inline]
119 fn index_subslice(&self, index: $range) -> Subslice<'_, Self> {
120 &self[index]
121 }
122
123 #[inline]
124 unsafe fn get_subslice_unchecked(&self, index: $range) -> Subslice<'_, Self> {
125 unsafe { (*self).get_unchecked(index) }
126 }
127 }
128 impl<T: Clone> SliceByValueSubsliceRangeMut<$range> for Vec<T> {
129 #[inline]
130 fn get_subslice_mut(&mut self, index: $range) -> Option<SubsliceMut<'_, Self>> {
131 (*self).get_mut(index)
132 }
133
134 #[inline]
135 fn index_subslice_mut(&mut self, index: $range) -> SubsliceMut<'_, Self> {
136 &mut self[index]
137 }
138
139 #[inline]
140 unsafe fn get_subslice_unchecked_mut(
141 &mut self,
142 index: $range,
143 ) -> SubsliceMut<'_, Self> {
144 unsafe { (*self).get_unchecked_mut(index) }
145 }
146 }
147 };
148}
149
150impl_range_vecs!(RangeFull);
151impl_range_vecs!(RangeFrom<usize>);
152impl_range_vecs!(RangeTo<usize>);
153impl_range_vecs!(Range<usize>);
154impl_range_vecs!(RangeInclusive<usize>);
155impl_range_vecs!(RangeToInclusive<usize>);
156
157impl<'a, T: Clone> IterateByValueGat<'a> for Vec<T> {
158 type Item = T;
159 type Iter = Cloned<core::slice::Iter<'a, T>>;
160}
161
162impl<T: Clone> IterateByValue for Vec<T> {
163 fn iter_value(&self) -> Iter<'_, Self> {
164 self.iter().cloned()
165 }
166}
167
168impl<'a, T: Clone> IterateByValueFromGat<'a> for Vec<T> {
169 type Item = T;
170 type IterFrom = Cloned<Skip<core::slice::Iter<'a, T>>>;
171}
172
173impl<T: Clone> IterateByValueFrom for Vec<T> {
174 fn iter_value_from(&self, from: usize) -> IterFrom<'_, Self> {
175 self.iter().skip(from).cloned()
176 }
177}
178
179#[cfg(feature = "std")]
180mod vec_deque {
181 use super::*;
182 use std::collections::VecDeque;
183
184 impl<T: Clone> SliceByValue for VecDeque<T> {
185 type Value = T;
186
187 #[inline]
188 fn len(&self) -> usize {
189 self.len()
190 }
191 #[inline]
192 fn get_value(&self, index: usize) -> Option<Self::Value> {
193 (*self).get(index).cloned()
194 }
195
196 #[inline]
197 fn index_value(&self, index: usize) -> Self::Value {
198 self[index].clone()
199 }
200
201 #[inline]
202 unsafe fn get_value_unchecked(&self, index: usize) -> Self::Value {
203 let val_ref = unsafe { (*self).get(index).unwrap_unchecked() };
205 val_ref.clone()
206 }
207 }
208
209 impl<T: Clone> SliceByValueMut for VecDeque<T> {
210 #[inline]
211 fn set_value(&mut self, index: usize, value: Self::Value) {
212 self[index] = value;
213 }
214
215 #[inline]
216 unsafe fn set_value_unchecked(&mut self, index: usize, value: Self::Value) { unsafe {
217 let val_mut = { self.get_mut(index).unwrap_unchecked() };
219 *val_mut = value;
220 }}
221
222 #[inline]
223 fn replace_value(&mut self, index: usize, value: Self::Value) -> Self::Value {
224 core::mem::replace(&mut self[index], value)
225 }
226
227 #[inline]
228 unsafe fn replace_value_unchecked(
229 &mut self,
230 index: usize,
231 value: Self::Value,
232 ) -> Self::Value {
233 let val_mut = unsafe { self.get_mut(index).unwrap_unchecked() };
235 core::mem::replace(val_mut, value)
236 }
237
238 type ChunksMut<'a>
239 = core::slice::ChunksMut<'a, T>
240 where
241 Self: 'a;
242
243 type ChunksMutError = core::convert::Infallible;
244
245 #[inline]
246 fn try_chunks_mut(
247 &mut self,
248 chunk_size: usize,
249 ) -> Result<Self::ChunksMut<'_>, Self::ChunksMutError> {
250 Ok(self.make_contiguous().chunks_mut(chunk_size))
252 }
253 }
254
255 impl<'a, T: Clone> IterateByValueGat<'a> for VecDeque<T> {
256 type Item = T;
257 type Iter = Cloned<std::collections::vec_deque::Iter<'a, T>>;
258 }
259
260 impl<T: Clone> IterateByValue for VecDeque<T> {
261 fn iter_value(&self) -> Iter<'_, Self> {
262 self.iter().cloned()
263 }
264 }
265
266 impl<'a, T: Clone> IterateByValueFromGat<'a> for VecDeque<T> {
267 type Item = T;
268 type IterFrom = Cloned<Skip<std::collections::vec_deque::Iter<'a, T>>>;
269 }
270
271 impl<T: Clone> IterateByValueFrom for VecDeque<T> {
272 fn iter_value_from(&self, from: usize) -> IterFrom<'_, Self> {
273 self.iter().skip(from).cloned()
274 }
275 }
276}