1mod drain_filter;
71
72pub use drain_filter::DrainFilter;
73
74use std::collections::VecDeque;
75use std::ops::{Deref, DerefMut};
76use std::slice;
77
78#[derive(Debug, Clone, Eq, Hash, Default)]
83pub struct FixedSliceDeque<T> {
84 pub(crate) buffer: VecDeque<T>,
85 capacity: usize,
86}
87
88#[macro_export]
139macro_rules! fsdeq {
140 ($elem:expr; $n:expr) => (
141 {
142 let mut deq = $crate::FixedSliceDeque::new($n);
143 deq.resize($n, $elem);
144 deq
145 }
146 );
147 ($($x:expr),*) => (
148 {
149 let vdeq = std::collections::VecDeque::from(vec![$($x),*]);
150 let deq = $crate::FixedSliceDeque::from_vec_deque(vdeq);
151 deq
152 }
153 );
154 ($($x:expr,)*) => (fsdeq![$($x),*])
155}
156
157impl<T> FixedSliceDeque<T> {
158 #[inline]
168 pub fn new(size: usize) -> Self {
169 Self {
170 buffer: VecDeque::with_capacity(size),
171 capacity: size,
172 }
173 }
174
175 pub fn from_vec_deque(mut deque: VecDeque<T>) -> Self {
186 deque.make_contiguous();
187 Self {
188 capacity: deque.len(),
189 buffer: deque,
190 }
191 }
192
193 #[inline]
204 pub fn is_full(&self) -> bool {
205 self.buffer.len() == self.capacity
206 }
207
208 #[inline]
220 pub fn is_empty(&self) -> bool {
221 self.buffer.is_empty()
222 }
223
224 #[inline]
226 pub fn len(&self) -> usize {
227 self.buffer.len()
228 }
229
230 #[inline]
232 pub fn capacity(&self) -> usize {
233 self.capacity
234 }
235
236 #[inline]
238 pub fn as_slice(&self) -> &[T] {
239 let (front, back) = self.buffer.as_slices();
242 debug_assert!(back.is_empty(), "buffer should always be contiguous");
243 front
244 }
245
246 #[inline]
248 pub fn as_mut_slice(&mut self) -> &mut [T] {
249 self.buffer.make_contiguous()
250 }
251
252 #[inline]
270 pub fn append(&mut self, other: &mut Self) {
271 if other.len() + self.len() <= self.capacity {
272 self.buffer.append(&mut other.buffer);
273 } else {
274 let total = self.len() + other.len();
276 let to_keep = self.capacity;
277 let to_skip = total - to_keep;
278
279 self.buffer.append(&mut other.buffer);
281 for _ in 0..to_skip {
282 self.buffer.pop_front();
283 }
284 }
285 other.buffer.clear();
286 self.buffer.make_contiguous();
287 }
288
289 #[inline]
306 pub fn front(&self) -> Option<&T> {
307 self.buffer.front()
308 }
309
310 #[inline]
327 pub fn front_mut(&mut self) -> Option<&mut T> {
328 self.buffer.front_mut()
329 }
330
331 #[inline]
348 pub fn back(&self) -> Option<&T> {
349 self.buffer.back()
350 }
351
352 #[inline]
369 pub fn back_mut(&mut self) -> Option<&mut T> {
370 self.buffer.back_mut()
371 }
372
373 #[inline]
387 pub fn push_front(&mut self, value: T) -> Option<T> {
388 let ret = self.is_full().then(|| self.buffer.pop_back()).flatten();
389 self.buffer.push_front(value);
390 self.buffer.make_contiguous();
391 ret
392 }
393
394 #[inline]
408 pub fn push_back(&mut self, value: T) -> Option<T> {
409 let ret = self.is_full().then(|| self.buffer.pop_front()).flatten();
410 self.buffer.push_back(value);
411 if ret.is_some() {
412 self.buffer.make_contiguous();
413 }
414 ret
415 }
416
417 #[inline]
429 pub fn try_push_front(&mut self, value: T) -> Result<(), T> {
430 if self.is_full() {
431 return Err(value);
432 }
433 self.push_front(value);
434 Ok(())
435 }
436
437 #[inline]
449 pub fn try_push_back(&mut self, value: T) -> Result<(), T> {
450 if self.is_full() {
451 return Err(value);
452 }
453 self.push_back(value);
454 Ok(())
455 }
456
457 #[inline]
475 pub fn pop_front(&mut self) -> Option<T> {
476 let ret = self.buffer.pop_front();
477 if ret.is_some() {
478 self.buffer.make_contiguous();
479 }
480 ret
481 }
482
483 #[inline]
501 pub fn pop_back(&mut self) -> Option<T> {
502 self.buffer.pop_back()
503 }
504
505 #[inline]
522 pub fn truncate_front(&mut self, len: usize) {
523 let target_len = len.min(self.capacity);
524 while self.buffer.len() > target_len {
525 self.buffer.pop_front();
526 }
527 self.buffer.make_contiguous();
528 }
529
530 #[inline]
547 pub fn truncate_back(&mut self, len: usize) {
548 self.buffer.truncate(len.min(self.capacity));
549 }
550
551 #[inline]
564 pub fn clear(&mut self) {
565 self.buffer.clear()
566 }
567
568 #[inline]
598 #[allow(mismatched_lifetime_syntaxes)]
599 pub fn drain<R>(&mut self, range: R) -> std::collections::vec_deque::Drain<T>
600 where
601 R: std::ops::RangeBounds<usize>,
602 {
603 self.buffer.drain(range)
604 }
605
606 #[inline]
608 pub fn into_inner(self) -> VecDeque<T> {
609 self.buffer
610 }
611
612 #[inline]
636 pub fn insert(&mut self, index: usize, element: T) -> Option<T> {
637 let is_full = self.is_full();
638 if index == 0 && is_full {
639 return Some(element);
640 }
641 let ret = is_full.then(|| self.pop_back()).flatten();
642 self.buffer.insert(index, element);
643 self.buffer.make_contiguous();
644 ret
645 }
646
647 #[inline]
664 pub fn remove(&mut self, index: usize) -> T {
665 self.buffer.remove(index).expect("index out of bounds")
666 }
667
668 #[inline]
685 pub fn retain<F>(&mut self, f: F)
686 where
687 F: FnMut(&T) -> bool,
688 {
689 self.buffer.retain(f);
690 }
691
692 #[inline]
709 pub fn dedup_by_key<F, K>(&mut self, mut key: F)
710 where
711 F: FnMut(&mut T) -> K,
712 K: PartialEq,
713 {
714 self.dedup_by(|a, b| key(a) == key(b));
715 }
716
717 #[inline]
741 pub fn dedup_by<F>(&mut self, mut same_bucket: F)
742 where
743 F: FnMut(&mut T, &mut T) -> bool,
744 {
745 let len = self.buffer.len();
746 if len < 2 {
747 return;
748 }
749 self.buffer.make_contiguous();
751 let mut i = 0;
752 while i + 1 < self.buffer.len() {
753 let should_remove = {
754 let slice = self.buffer.make_contiguous();
755 let (left, right) = slice.split_at_mut(i + 1);
756 same_bucket(&mut right[0], &mut left[i])
757 };
758 if should_remove {
759 self.buffer.remove(i + 1);
760 } else {
761 i += 1;
762 }
763 }
764 }
765
766 #[inline]
826 #[allow(mismatched_lifetime_syntaxes)]
827 pub fn drain_filter<F>(&mut self, filter: F) -> DrainFilter<T, F>
828 where
829 F: FnMut(&mut T) -> bool,
830 {
831 let old_len = self.len();
832 DrainFilter {
833 deque: self,
834 filter,
835 old_len,
836 idx: 0,
837 del: 0,
838 }
839 }
840}
841
842impl<T: PartialEq> FixedSliceDeque<T> {
843 #[inline]
865 pub fn dedup(&mut self) {
866 self.dedup_by(|a, b| a == b);
867 }
868
869 #[inline]
885 pub fn remove_item(&mut self, item: &T) -> Option<T> {
886 let pos = self.buffer.iter().position(|x| x == item)?;
887 self.buffer.remove(pos)
888 }
889}
890
891impl<T: Clone> FixedSliceDeque<T> {
892 #[inline]
914 pub fn extend_from_slice(&mut self, other: &[T]) {
915 self.capacity = self.len() + other.len();
916 self.buffer.extend(other.iter().cloned());
917 }
918
919 #[inline]
942 pub fn resize(&mut self, new_capacity: usize, value: T) {
943 self.capacity = new_capacity;
944 self.buffer.resize(new_capacity, value);
945 }
946}
947
948impl<T: Default> FixedSliceDeque<T> {
949 #[inline]
977 pub fn resize_default(&mut self, new_capacity: usize) {
978 self.capacity = new_capacity;
979 if new_capacity < self.buffer.len() {
980 self.buffer.truncate(new_capacity);
981 } else {
982 while self.buffer.len() < new_capacity {
983 self.buffer.push_back(Default::default());
984 }
985 }
986 }
987}
988
989impl<T> Deref for FixedSliceDeque<T> {
990 type Target = [T];
991
992 fn deref(&self) -> &Self::Target {
993 self.as_slice()
994 }
995}
996
997impl<T> DerefMut for FixedSliceDeque<T> {
998 fn deref_mut(&mut self) -> &mut Self::Target {
999 self.buffer.make_contiguous()
1000 }
1001}
1002
1003impl<T> From<VecDeque<T>> for FixedSliceDeque<T> {
1004 fn from(deque: VecDeque<T>) -> Self {
1005 Self::from_vec_deque(deque)
1006 }
1007}
1008
1009impl<'a, T: Clone> From<&'a [T]> for FixedSliceDeque<T> {
1010 fn from(slice: &'a [T]) -> Self {
1011 Self {
1012 capacity: slice.len(),
1013 buffer: VecDeque::from(slice.to_vec()),
1014 }
1015 }
1016}
1017
1018impl<'a, T: Clone> From<&'a mut [T]> for FixedSliceDeque<T> {
1019 fn from(slice: &'a mut [T]) -> Self {
1020 Self {
1021 capacity: slice.len(),
1022 buffer: VecDeque::from(slice.to_vec()),
1023 }
1024 }
1025}
1026
1027pub struct IntoIter<T> {
1029 inner: VecDeque<T>,
1030}
1031
1032impl<T: Clone> Clone for IntoIter<T> {
1033 fn clone(&self) -> Self {
1034 IntoIter {
1035 inner: self.inner.clone(),
1036 }
1037 }
1038}
1039
1040impl<T> IntoIter<T> {
1041 pub fn as_slice(&self) -> &[T] {
1043 self.inner.as_slices().0
1044 }
1045
1046 pub fn as_mut_slice(&mut self) -> &mut [T] {
1048 self.inner.as_mut_slices().0
1049 }
1050}
1051
1052impl<T> Iterator for IntoIter<T> {
1053 type Item = T;
1054
1055 fn next(&mut self) -> Option<T> {
1056 self.inner.pop_front()
1057 }
1058
1059 fn size_hint(&self) -> (usize, Option<usize>) {
1060 let len = self.inner.len();
1061 (len, Some(len))
1062 }
1063}
1064
1065impl<T> ExactSizeIterator for IntoIter<T> {}
1066
1067impl<T> DoubleEndedIterator for IntoIter<T> {
1068 fn next_back(&mut self) -> Option<T> {
1069 self.inner.pop_back()
1070 }
1071}
1072
1073impl<T: std::fmt::Debug> std::fmt::Debug for IntoIter<T> {
1074 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1075 f.debug_tuple("IntoIter").field(&self.as_slice()).finish()
1076 }
1077}
1078
1079impl<T> IntoIterator for FixedSliceDeque<T> {
1080 type Item = T;
1081 type IntoIter = IntoIter<T>;
1082
1083 fn into_iter(self) -> Self::IntoIter {
1084 IntoIter { inner: self.buffer }
1085 }
1086}
1087
1088impl<'a, T> IntoIterator for &'a FixedSliceDeque<T> {
1089 type Item = &'a T;
1090 type IntoIter = slice::Iter<'a, T>;
1091 #[inline]
1092 fn into_iter(self) -> slice::Iter<'a, T> {
1093 self.iter()
1094 }
1095}
1096
1097impl<'a, T> IntoIterator for &'a mut FixedSliceDeque<T> {
1098 type Item = &'a mut T;
1099 type IntoIter = slice::IterMut<'a, T>;
1100 #[inline]
1101 fn into_iter(self) -> slice::IterMut<'a, T> {
1102 self.iter_mut()
1103 }
1104}
1105
1106impl<T> Extend<T> for FixedSliceDeque<T> {
1107 #[inline]
1108 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
1109 self.buffer.extend(iter);
1110 self.capacity = self.buffer.len();
1111 self.buffer.make_contiguous();
1112 }
1113}
1114
1115impl<'a, T: 'a + Copy> Extend<&'a T> for FixedSliceDeque<T> {
1116 fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
1117 self.buffer.extend(iter);
1118 self.capacity = self.buffer.len();
1119 self.buffer.make_contiguous();
1120 }
1121}
1122
1123impl<T> std::iter::FromIterator<T> for FixedSliceDeque<T> {
1124 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
1125 Self::from_vec_deque(VecDeque::from_iter(iter))
1126 }
1127}
1128
1129macro_rules! __impl_slice_eq1 {
1130 ($Lhs:ty, $Rhs:ty) => {
1131 __impl_slice_eq1! { $Lhs, $Rhs, Sized }
1132 };
1133 ($Lhs:ty, $Rhs:ty, $Bound:ident) => {
1134 #[allow(clippy::extra_unused_lifetimes)]
1135 impl<'a, 'b, A: $Bound, B> PartialEq<$Rhs> for $Lhs
1136 where
1137 A: PartialEq<B>,
1138 {
1139 #[inline]
1140 fn eq(&self, other: &$Rhs) -> bool {
1141 if self.len() != other.len() {
1142 return false;
1143 }
1144 self.iter().zip(other.iter()).all(|(a, b)| a == b)
1145 }
1146 }
1147 };
1148}
1149
1150impl<A, B> PartialEq<FixedSliceDeque<B>> for FixedSliceDeque<A>
1151where
1152 A: PartialEq<B>,
1153{
1154 #[inline]
1155 fn eq(&self, other: &FixedSliceDeque<B>) -> bool {
1156 if self.len() != other.len() {
1157 return false;
1158 }
1159 self.iter().zip(other.iter()).all(|(a, b)| a == b)
1160 }
1161}
1162
1163__impl_slice_eq1! { FixedSliceDeque<A>, &'b [B] }
1164__impl_slice_eq1! { FixedSliceDeque<A>, &'b mut [B] }
1165__impl_slice_eq1! { FixedSliceDeque<A>, Vec<B> }
1166
1167macro_rules! array_impls {
1168 ($($N: expr)+) => {
1169 $(
1170 __impl_slice_eq1! { FixedSliceDeque<A>, [B; $N] }
1172 __impl_slice_eq1! { FixedSliceDeque<A>, &'b [B; $N] }
1173 )+
1174 }
1175}
1176
1177array_impls! {
1178 0 1 2 3 4 5 6 7 8 9
1179 10 11 12 13 14 15 16 17 18 19
1180 20 21 22 23 24 25 26 27 28 29
1181 30 31 32
1182}
1183
1184#[cfg(test)]
1185mod tests {
1186 use crate::FixedSliceDeque;
1187 use std::cell::RefCell;
1188 use std::collections::{HashMap, VecDeque};
1189 use std::rc::Rc;
1190
1191 const SIZES_TO_TEST: &[usize] = &[2, 4, 8, 16, 32, 64, 128];
1192
1193 #[derive(Clone, Debug)]
1194 struct WithDrop {
1195 counter: Rc<RefCell<usize>>,
1196 }
1197
1198 impl Drop for WithDrop {
1199 fn drop(&mut self) {
1200 *self.counter.borrow_mut() += 1;
1201 }
1202 }
1203
1204 #[test]
1205 fn get() {
1206 let mut deq = FixedSliceDeque::new(3);
1207 deq.push_back(3);
1208 deq.push_back(4);
1209 deq.push_back(5);
1210 assert_eq!(deq.get(1), Some(&4));
1211 }
1212
1213 #[test]
1214 fn get_mut() {
1215 let mut deq = FixedSliceDeque::new(3);
1216 deq.push_back(3);
1217 deq.push_back(4);
1218 deq.push_back(5);
1219 assert_eq!(deq.get(1), Some(&4));
1220 if let Some(elem) = deq.get_mut(1) {
1221 *elem = 7;
1222 }
1223 assert_eq!(deq[1], 7);
1224 }
1225
1226 #[test]
1227 fn is_empty() {
1228 let mut deq = FixedSliceDeque::new(1);
1229 assert!(deq.is_empty());
1230 deq.push_back(4);
1231 assert!(!deq.is_empty());
1232 deq.pop_front();
1233 assert!(deq.is_empty());
1234 }
1235
1236 #[test]
1237 fn push_pop_front() {
1238 for size in SIZES_TO_TEST.iter().copied() {
1239 let mut v: FixedSliceDeque<usize> = FixedSliceDeque::new(size);
1240 for i in 0..size {
1241 v.push_front(i);
1242 assert_eq!(v.len(), i + 1);
1243 assert_eq!(v.capacity(), size);
1244 for j in 0..v.len() {
1245 assert_eq!(*v.get(v.len() - j - 1).unwrap(), j);
1246 }
1247 }
1248 assert_eq!(v.len(), size);
1249 for i in 0..size {
1250 assert_eq!(*v.get(i).unwrap(), size - i - 1);
1251 }
1252 for i in 0..size {
1253 assert_eq!(v.len(), size - i);
1254 assert_eq!(v.capacity(), size);
1255 v.pop_front();
1256 for j in 0..v.len() {
1257 assert_eq!(*v.get(v.len() - j - 1).unwrap(), j);
1258 }
1259 }
1260 assert_eq!(v.len(), 0);
1261 assert_eq!(v.capacity(), size);
1262 }
1263 }
1264
1265 #[test]
1266 fn try_push_front() {
1267 let mut deque = FixedSliceDeque::new(0);
1268 assert_eq!(deque.try_push_front(1), Err(1));
1269 }
1270
1271 #[test]
1272 fn try_push_back() {
1273 let mut deque = FixedSliceDeque::new(0);
1274 assert_eq!(deque.try_push_back(1), Err(1));
1275 }
1276
1277 #[test]
1278 fn front_back_mut() {
1279 let mut v = fsdeq![1];
1280 assert_eq!(v.front_mut(), Some(&mut 1));
1281 assert_eq!(v.back_mut(), Some(&mut 1));
1282 }
1283
1284 #[test]
1285 fn mut_slice() {
1286 let mut v = fsdeq![1];
1287 assert_eq!(v.as_mut_slice(), &mut [1]);
1288 }
1289
1290 #[test]
1291 fn push_pop_back() {
1292 for size in SIZES_TO_TEST.iter().copied() {
1293 let mut v: FixedSliceDeque<_> = (0..size).collect();
1294 for i in 0..size {
1295 assert_eq!(v.len(), size - i);
1296 assert_eq!(v.capacity(), size);
1297 v.pop_back();
1298 for j in 0..v.len() {
1299 assert_eq!(*v.get(j).unwrap(), j);
1300 }
1301 }
1302 assert_eq!(v.len(), 0);
1303 assert_eq!(v.capacity(), size);
1304 }
1305 }
1306
1307 #[test]
1308 fn keeps_capacity() {
1309 for size in SIZES_TO_TEST.iter().copied() {
1310 let mut v: FixedSliceDeque<_> = (0..size).collect();
1311 for i in 0..size {
1312 let first = v.push_back(i);
1313 assert!(v.is_full());
1314 assert_eq!(v.capacity(), size);
1315 assert!(first.is_some());
1316 }
1317
1318 for i in 0..size {
1319 let last = v.push_front(i);
1320 assert!(v.is_full());
1321 assert_eq!(v.capacity(), size);
1322 assert!(last.is_some());
1323 }
1324 }
1325 }
1326
1327 #[test]
1328 fn from_vec_deque() {
1329 let deque = VecDeque::from(vec![1, 2, 3]);
1330 let v: FixedSliceDeque<_> = deque.clone().into();
1331 assert_eq!(&v[..], &deque.iter().copied().collect::<Vec<_>>()[..]);
1332 let v: FixedSliceDeque<_> = FixedSliceDeque::from_vec_deque(deque.clone());
1333 assert_eq!(&v[..], &deque.iter().copied().collect::<Vec<_>>()[..]);
1334 }
1335
1336 #[test]
1337 fn from_slice() {
1338 let deque = [1, 2, 3];
1339 let v: FixedSliceDeque<_> = deque.clone().as_slice().into();
1340 assert_eq!(&v, &deque);
1341 }
1342
1343 #[test]
1344 fn from_slice_mut() {
1345 let deque = [1, 2, 3];
1346 let v: FixedSliceDeque<_> = deque.clone().as_mut_slice().into();
1347 assert_eq!(&v, &deque);
1348 }
1349
1350 #[test]
1351 fn clear() {
1352 for size in SIZES_TO_TEST.iter().copied() {
1353 let counter = Rc::new(RefCell::new(0));
1354 let val = WithDrop {
1355 counter: counter.clone(),
1356 };
1357 assert_eq!(*counter.borrow(), 0);
1358 let mut deque: FixedSliceDeque<_> = (0..size).map(|_| val.clone()).collect();
1359 assert_eq!(*counter.borrow(), 0);
1360 deque.clear();
1361 assert_eq!(*counter.borrow(), size);
1362 assert_eq!(deque.len(), 0);
1363 }
1364 }
1365
1366 #[test]
1367 fn resize() {
1368 for size in SIZES_TO_TEST.iter().copied() {
1369 let mut v: FixedSliceDeque<_> = (0..size).collect();
1370 let v_ref: FixedSliceDeque<_> = (0..size / 2).collect();
1371 v.resize(size / 2, 0);
1372 assert_eq!(v.len(), size / 2);
1373 assert_eq!(v.capacity(), size / 2);
1374 assert_eq!(v.as_slice(), v_ref.as_slice());
1375
1376 v.resize(size, 3);
1377 assert_eq!(v.len(), size);
1378 assert_eq!(v.capacity(), size);
1379 assert_eq!(v.as_slice().last(), Some(&3));
1380
1381 v.resize(0, 3);
1382 assert_eq!(v.len(), 0);
1383 assert_eq!(v.capacity(), 0);
1384
1385 v.resize(size, 3);
1386 let v_ref: FixedSliceDeque<_> = (0..size).map(|_| 3usize).collect();
1387 assert_eq!(v.len(), size);
1388 assert_eq!(v.capacity(), size);
1389 assert_eq!(v_ref.len(), size);
1390 assert_eq!(v.as_slice(), v_ref.as_slice());
1391 }
1392 }
1393
1394 #[test]
1395 fn resize_default() {
1396 for size in SIZES_TO_TEST.iter().copied() {
1397 let mut v: FixedSliceDeque<_> = (0..size).collect();
1398 let v_ref: FixedSliceDeque<_> = (0..size / 2).collect();
1399 v.resize_default(size / 2);
1400 assert_eq!(v.len(), size / 2);
1401 assert_eq!(v.capacity(), size / 2);
1402 assert_eq!(v.as_slice(), v_ref.as_slice());
1403
1404 v.resize_default(size);
1405 assert_eq!(v.len(), size);
1406 assert_eq!(v.capacity(), size);
1407 assert_eq!(v.as_slice().last(), Some(&0));
1408
1409 v.resize_default(0);
1410 assert_eq!(v.len(), 0);
1411 assert_eq!(v.capacity(), 0);
1412
1413 v.resize_default(size);
1414 let v_ref: FixedSliceDeque<_> = (0..size).map(|_| 0).collect();
1415 assert_eq!(v.len(), size);
1416 assert_eq!(v.capacity(), size);
1417 assert_eq!(v_ref.len(), size);
1418 assert_eq!(v.as_slice(), v_ref.as_slice());
1419 }
1420 }
1421
1422 #[test]
1423 fn iter() {
1424 let mut deq = FixedSliceDeque::new(3);
1425 deq.push_back(5);
1426 deq.push_back(3);
1427 deq.push_back(4);
1428 let b: &[_] = &[&5, &3, &4];
1429 let c: Vec<&i32> = deq.iter().collect();
1430 assert_eq!(&c[..], b);
1431 }
1432
1433 #[test]
1434 fn iter_mut() {
1435 let mut deq = FixedSliceDeque::new(3);
1436 deq.push_back(5);
1437 deq.push_back(3);
1438 deq.push_back(4);
1439 for num in deq.iter_mut() {
1440 *num -= 2;
1441 }
1442 let b: &[_] = &[&mut 3, &mut 1, &mut 2];
1443 assert_eq!(&deq.iter_mut().collect::<Vec<&mut i32>>()[..], b);
1444 }
1445
1446 #[test]
1447 fn hash_map() {
1448 let mut hm: HashMap<FixedSliceDeque<u32>, u32> = HashMap::new();
1449 let mut a = FixedSliceDeque::new(2);
1450 a.push_back(1);
1451 a.push_back(2);
1452 hm.insert(a.clone(), 3);
1453 let b = FixedSliceDeque::new(0);
1454 assert_eq!(hm.get(&a), Some(&3));
1455 assert_eq!(hm.get(&b), None);
1456 }
1457
1458 #[test]
1459 fn eq() {
1460 let mut a = FixedSliceDeque::new(3);
1461 a.push_back(1);
1462 a.push_back(2);
1463 a.push_back(3);
1464 assert!(a == a);
1465 assert!(!(a != a));
1466 }
1467
1468 #[test]
1469 fn vec_extend() {
1470 let mut v = FixedSliceDeque::new(0);
1471 let mut w = FixedSliceDeque::new(3);
1472
1473 v.extend(w.clone().iter().copied());
1474 assert_eq!(v, &[]);
1475
1476 v.extend(0..3);
1477
1478 for i in 0..3 {
1479 w.push_back(i);
1480 }
1481
1482 assert_eq!(v, w);
1483
1484 v.extend(3..10);
1485 for i in 3..10 {
1486 w.push_back(i);
1487 }
1488
1489 assert_eq!(v[7..10], w[..3]);
1490 }
1491
1492 #[test]
1493 fn vec_extend_zst() {
1494 #[derive(PartialEq, Eq, Debug, Clone, Copy)]
1496 struct Foo;
1497
1498 let mut a = FixedSliceDeque::new(0);
1499 let b = fsdeq![Foo, Foo];
1500
1501 a.extend_from_slice(&b);
1502 assert_eq!(&a, &b);
1503 assert_eq!(a.capacity(), 2);
1504 }
1505
1506 #[test]
1507 fn vec_extend_ref() {
1508 let mut v = FixedSliceDeque::new(2);
1509 for &i in &[1, 2] {
1510 v.push_back(i);
1511 }
1512 assert_eq!(v.capacity(), 2);
1513 v.extend(&[3, 4, 5]);
1514 assert_eq!(v.capacity(), 5);
1515
1516 assert_eq!(v.len(), 5);
1517 assert_eq!(v, [1, 2, 3, 4, 5]);
1518
1519 let mut w = FixedSliceDeque::new(2);
1520 for &i in &[6, 7] {
1521 w.push_back(i);
1522 }
1523 assert_eq!(v.capacity(), 5);
1524 v.extend(&w);
1525 assert_eq!(v.capacity(), 7);
1526
1527 assert_eq!(v.len(), 7);
1528 assert_eq!(v, [1, 2, 3, 4, 5, 6, 7]);
1529 }
1530
1531 #[test]
1532 fn vec_slice_from_mut() {
1533 let mut values = fsdeq![1, 2, 3, 4, 5];
1534 {
1535 let slice = &mut values[2..];
1536 assert_eq!(slice, [3, 4, 5]);
1537 for p in slice {
1538 *p += 2;
1539 }
1540 }
1541 assert_eq!(values.capacity(), 5);
1542 assert_eq!(values, [1, 2, 5, 6, 7]);
1543 }
1544
1545 #[test]
1546 fn vec_slice_to_mut() {
1547 let mut values = fsdeq![1, 2, 3, 4, 5];
1548 {
1549 let slice = &mut values[..2];
1550 assert_eq!(slice, [1, 2]);
1551 for p in slice {
1552 *p += 1;
1553 }
1554 }
1555
1556 assert_eq!(values.capacity(), 5);
1557 assert_eq!(values, [2, 3, 3, 4, 5]);
1558 }
1559
1560 #[test]
1561 fn vec_split_at_mut() {
1562 let mut values = fsdeq![1, 2, 3, 4, 5];
1563 {
1564 let (left, right) = values.split_at_mut(2);
1565 {
1566 let left: &[_] = left;
1567 assert_eq!(&left[..left.len()], &[1, 2]);
1568 }
1569 for p in left {
1570 *p += 1;
1571 }
1572
1573 {
1574 let right: &[_] = right;
1575 assert_eq!(&right[..right.len()], &[3, 4, 5]);
1576 }
1577 for p in right {
1578 *p += 2;
1579 }
1580 }
1581
1582 assert_eq!(values.capacity(), 5);
1583 assert_eq!(values, [2, 3, 5, 6, 7]);
1584 }
1585
1586 #[test]
1587 fn vec_clone() {
1588 let v: FixedSliceDeque<i32> = fsdeq![];
1589 let w = fsdeq![1, 2, 3];
1590
1591 assert_eq!(v, v.clone());
1592
1593 let z = w.clone();
1594 assert_eq!(w, z);
1595 assert_ne!(w.as_ptr(), z.as_ptr())
1597 }
1598
1599 #[test]
1600 fn vec_retain() {
1601 let mut deq = fsdeq![1, 2, 3, 4];
1602 deq.retain(|&x| x % 2 == 0);
1603 assert_eq!(deq, [2, 4]);
1604 }
1605
1606 #[test]
1607 fn vec_dedup() {
1608 fn case(a: FixedSliceDeque<i32>, b: FixedSliceDeque<i32>) {
1609 let mut v = a;
1610 v.dedup();
1611 assert_eq!(v, b);
1612 }
1613 case(fsdeq![], fsdeq![]);
1614 case(fsdeq![1], fsdeq![1]);
1615 case(fsdeq![1, 1], fsdeq![1]);
1616 case(fsdeq![1, 2, 3], fsdeq![1, 2, 3]);
1617 case(fsdeq![1, 1, 2, 3], fsdeq![1, 2, 3]);
1618 case(fsdeq![1, 2, 2, 3], fsdeq![1, 2, 3]);
1619 case(fsdeq![1, 2, 3, 3], fsdeq![1, 2, 3]);
1620 case(fsdeq![1, 1, 2, 2, 2, 3, 3], fsdeq![1, 2, 3]);
1621 }
1622
1623 #[test]
1624 fn vec_dedup_by_key() {
1625 fn case(a: FixedSliceDeque<i32>, b: FixedSliceDeque<i32>) {
1626 let mut v = a;
1627 v.dedup_by_key(|i| *i / 10);
1628 assert_eq!(v, b);
1629 }
1630 case(fsdeq![], fsdeq![]);
1631 case(fsdeq![10], fsdeq![10]);
1632 case(fsdeq![10, 11], fsdeq![10]);
1633 case(fsdeq![10, 20, 30], fsdeq![10, 20, 30]);
1634 case(fsdeq![10, 11, 20, 30], fsdeq![10, 20, 30]);
1635 case(fsdeq![10, 20, 21, 30], fsdeq![10, 20, 30]);
1636 case(fsdeq![10, 20, 30, 31], fsdeq![10, 20, 30]);
1637 case(fsdeq![10, 11, 20, 21, 22, 30, 31], fsdeq![10, 20, 30]);
1638 }
1639
1640 #[test]
1641 fn vec_dedup_by() {
1642 let mut deq = fsdeq!["foo", "bar", "Bar", "baz", "bar"];
1643 deq.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
1644
1645 assert_eq!(deq, ["foo", "bar", "baz", "bar"]);
1646
1647 let mut deq: FixedSliceDeque<(&'static str, i32)> =
1648 fsdeq![("foo", 1), ("foo", 2), ("bar", 3), ("bar", 4), ("bar", 5)];
1649 deq.dedup_by(|a, b| {
1650 a.0 == b.0 && {
1651 b.1 += a.1;
1652 true
1653 }
1654 });
1655
1656 assert_eq!(deq, [("foo", 3), ("bar", 12)]);
1657 }
1658
1659 #[test]
1660 fn zero_sized_values() {
1661 let mut v = FixedSliceDeque::new(1);
1662 assert_eq!(v.len(), 0);
1663 v.push_back(());
1664 assert_eq!(v.len(), 1);
1665 v.push_back(());
1666 assert_eq!(v.len(), 1);
1667 assert_eq!(v.pop_back(), Some(()));
1668 assert_eq!(v.pop_back(), None);
1669 assert_eq!(v.pop_back(), None);
1670 assert_eq!(v.capacity(), 1);
1671
1672 assert_eq!(v.iter().count(), 0);
1673 v.push_back(());
1674 assert_eq!(v.iter().count(), 1);
1675 v.push_back(());
1676 assert_eq!(v.iter().count(), 1);
1677
1678 for &() in &v {}
1679
1680 assert_eq!(v.iter_mut().count(), 1);
1681 v.push_back(());
1682 assert_eq!(v.iter_mut().count(), 1);
1683 v.push_back(());
1684 assert_eq!(v.iter_mut().count(), 1);
1685
1686 for &mut () in &mut v {}
1687 v.clear();
1688 assert_eq!(v.iter_mut().count(), 0);
1689 assert_eq!(v.capacity(), 1);
1690 }
1691
1692 #[test]
1693 fn vec_partition() {
1694 assert_eq!(
1695 fsdeq![].into_iter().partition(|x: &i32| *x < 4),
1696 (fsdeq![], fsdeq![])
1697 );
1698 assert_eq!(
1699 fsdeq![1, 2, 3].into_iter().partition(|x| *x < 4),
1700 (fsdeq![1, 2, 3], fsdeq![])
1701 );
1702 assert_eq!(
1703 fsdeq![1, 2, 3].into_iter().partition(|x| *x < 2),
1704 (fsdeq![1], fsdeq![2, 3])
1705 );
1706 assert_eq!(
1707 fsdeq![1, 2, 3].into_iter().partition(|x| *x < 0),
1708 (fsdeq![], fsdeq![1, 2, 3])
1709 );
1710 }
1711
1712 #[test]
1713 fn vec_zip_unzip() {
1714 let z1 = fsdeq![(1, 4), (2, 5), (3, 6)];
1715
1716 let (left, right): (FixedSliceDeque<_>, FixedSliceDeque<_>) = z1.iter().cloned().unzip();
1717
1718 assert_eq!((1, 4), (left[0], right[0]));
1719 assert_eq!((2, 5), (left[1], right[1]));
1720 assert_eq!((3, 6), (left[2], right[2]));
1721 }
1722
1723 #[test]
1724 fn vec_vec_truncate_drop() {
1725 static mut DROPS: u32 = 0;
1726 struct Elem;
1727 impl Drop for Elem {
1728 fn drop(&mut self) {
1729 unsafe {
1730 DROPS += 1;
1731 }
1732 }
1733 }
1734
1735 let mut v = fsdeq![Elem, Elem, Elem, Elem, Elem];
1736 assert_eq!(unsafe { DROPS }, 0);
1737 v.truncate_back(3);
1738 assert_eq!(unsafe { DROPS }, 2);
1739 v.truncate_back(0);
1740 assert_eq!(unsafe { DROPS }, 5);
1741 }
1742
1743 #[test]
1744 fn vec_vec_truncate_front_drop() {
1745 static mut DROPS: u32 = 0;
1746 struct Elem;
1747 impl Drop for Elem {
1748 fn drop(&mut self) {
1749 unsafe {
1750 DROPS += 1;
1751 }
1752 }
1753 }
1754
1755 let mut v = fsdeq![Elem, Elem, Elem, Elem, Elem];
1756 assert_eq!(unsafe { DROPS }, 0);
1757 v.truncate_front(3);
1758 assert_eq!(unsafe { DROPS }, 2);
1759 v.truncate_front(0);
1760 assert_eq!(unsafe { DROPS }, 5);
1761 }
1762
1763 #[test]
1764 #[should_panic]
1765 fn vec_vec_truncate_fail() {
1766 struct BadElem(i32);
1767 impl Drop for BadElem {
1768 fn drop(&mut self) {
1769 let BadElem(ref mut x) = *self;
1770 if *x == 0xbadbeef {
1771 panic!("BadElem panic: 0xbadbeef")
1772 }
1773 }
1774 }
1775
1776 let mut v = fsdeq![BadElem(1), BadElem(2), BadElem(0xbadbeef), BadElem(4)];
1777 v.truncate_back(0);
1778 }
1779
1780 #[test]
1781 fn vec_index() {
1782 let deq = fsdeq![1, 2, 3];
1783 assert_eq!(deq[1], 2);
1784 }
1785
1786 #[test]
1787 #[should_panic]
1788 fn vec_index_out_of_bounds() {
1789 let deq = fsdeq![1, 2, 3];
1790 let _ = deq[3];
1791 }
1792
1793 #[test]
1794 #[should_panic]
1795 fn vec_slice_out_of_bounds_1() {
1796 let x = fsdeq![1, 2, 3, 4, 5];
1797 let _ = &x[!0..];
1798 }
1799
1800 #[test]
1801 #[should_panic]
1802 fn vec_slice_out_of_bounds_2() {
1803 let x = fsdeq![1, 2, 3, 4, 5];
1804 let _ = &x[..6];
1805 }
1806
1807 #[test]
1808 #[should_panic]
1809 fn vec_slice_out_of_bounds_3() {
1810 let x = fsdeq![1, 2, 3, 4, 5];
1811 #[expect(clippy::reversed_empty_ranges, reason = "Forcing panic")]
1812 let _ = &x[!0..4];
1813 }
1814
1815 #[test]
1816 #[should_panic]
1817 fn vec_slice_out_of_bounds_4() {
1818 let x = fsdeq![1, 2, 3, 4, 5];
1819 let _ = &x[1..6];
1820 }
1821
1822 #[test]
1823 #[should_panic]
1824 fn vec_slice_out_of_bounds_5() {
1825 let x = fsdeq![1, 2, 3, 4, 5];
1826 #[expect(clippy::reversed_empty_ranges, reason = "Forcing panic")]
1827 let _ = &x[3..2];
1828 }
1829
1830 #[test]
1831 fn vec_move_items() {
1832 let deq = fsdeq![1, 2, 3];
1833 let mut deq2 = FixedSliceDeque::new(3);
1834 for i in deq {
1835 deq2.push_back(i);
1836 }
1837 assert_eq!(deq2, [1, 2, 3]);
1838 }
1839
1840 #[test]
1841 fn vec_move_items_reverse() {
1842 let deq = fsdeq![1, 2, 3];
1843 let mut deq2 = FixedSliceDeque::new(3);
1844 for i in deq.into_iter().rev() {
1845 deq2.push_back(i);
1846 }
1847 assert_eq!(deq2, [3, 2, 1]);
1848 }
1849
1850 #[test]
1851 fn vec_move_items_zero_sized() {
1852 let deq = fsdeq![(), (), ()];
1853 let mut deq2 = FixedSliceDeque::new(3);
1854 for i in deq {
1855 deq2.push_back(i);
1856 }
1857 assert_eq!(deq2, [(), (), ()]);
1858 }
1859
1860 #[test]
1861 fn vec_drain_items() {
1862 let mut deq = fsdeq![1, 2, 3];
1863 let mut deq2 = FixedSliceDeque::new(3);
1864 for i in deq.drain(..) {
1865 deq2.push_back(i);
1866 }
1867 assert_eq!(deq, []);
1868 assert_eq!(deq2, [1, 2, 3]);
1869 assert_eq!(deq.capacity(), deq2.capacity());
1870 }
1871
1872 #[test]
1873 fn vec_drain_items_reverse() {
1874 let mut deq = fsdeq![1, 2, 3];
1875 let mut deq2 = FixedSliceDeque::new(3);
1876 for i in deq.drain(..).rev() {
1877 deq2.push_back(i);
1878 }
1879 assert_eq!(deq, []);
1880 assert_eq!(deq2, [3, 2, 1]);
1881 assert_eq!(deq.capacity(), deq2.capacity());
1882 }
1883
1884 #[test]
1885 fn vec_drain_items_zero_sized() {
1886 let mut deq = fsdeq![(), (), ()];
1887 let mut deq2 = FixedSliceDeque::new(3);
1888 for i in deq.drain(..) {
1889 deq2.push_back(i);
1890 }
1891 assert_eq!(deq, []);
1892 assert_eq!(deq2, [(), (), ()]);
1893 assert_eq!(deq.capacity(), deq2.capacity());
1894 }
1895
1896 #[test]
1897 #[should_panic]
1898 fn vec_drain_out_of_bounds() {
1899 let mut v = fsdeq![1, 2, 3, 4, 5];
1900 v.drain(5..6);
1901 }
1902
1903 #[test]
1904 fn vec_drain_range() {
1905 let mut v = fsdeq![1, 2, 3, 4, 5];
1906 for _ in v.drain(4..) {}
1907 assert_eq!(v, &[1, 2, 3, 4]);
1908
1909 let mut v: FixedSliceDeque<_> = (1..6).map(|x| x.to_string()).collect();
1910 for _ in v.drain(1..4) {}
1911 assert_eq!(v, &[1.to_string(), 5.to_string()]);
1912
1913 let mut v: FixedSliceDeque<_> = (1..6).map(|x| x.to_string()).collect();
1914 for _ in v.drain(1..4).rev() {}
1915 assert_eq!(v, &[1.to_string(), 5.to_string()]);
1916 }
1917
1918 #[test]
1919 fn vec_drain_range_zst() {
1920 let mut v: FixedSliceDeque<_> = fsdeq![(); 5];
1921 for _ in v.drain(1..4).rev() {}
1922 assert_eq!(v, &[(), ()]);
1923 }
1924
1925 #[test]
1926 fn vec_drain_inclusive_range() {
1927 let mut v = fsdeq!['a', 'b', 'c', 'd', 'e'];
1928 for _ in v.drain(1..=3) {}
1929 assert_eq!(v, &['a', 'e']);
1930
1931 let mut v: FixedSliceDeque<_> = (0..=5).map(|x| x.to_string()).collect();
1932 for _ in v.drain(1..=5) {}
1933 assert_eq!(v, &["0".to_string()]);
1934
1935 let mut v: FixedSliceDeque<String> = (0..=5).map(|x| x.to_string()).collect();
1936 for _ in v.drain(0..=5) {}
1937 assert_eq!(v, FixedSliceDeque::<String>::new(0));
1938
1939 let mut v: FixedSliceDeque<_> = (0..=5).map(|x| x.to_string()).collect();
1940 for _ in v.drain(0..=3) {}
1941 assert_eq!(v, &["4".to_string(), "5".to_string()]);
1942
1943 let mut v: FixedSliceDeque<_> = (0..=1).map(|x| x.to_string()).collect();
1944 for _ in v.drain(..=0) {}
1945 assert_eq!(v, &["1".to_string()]);
1946 }
1947
1948 #[test]
1949 #[should_panic]
1950 fn vec_drain_inclusive_out_of_bounds() {
1951 let mut v = fsdeq![1, 2, 3, 4, 5];
1952 v.drain(5..=5);
1953 }
1954
1955 #[test]
1956 fn vec_append() {
1957 let mut deq = fsdeq![1, 2, 3];
1958 let mut deq2 = fsdeq![4, 5, 6];
1959 deq.append(&mut deq2);
1960 assert_eq!(deq, [4, 5, 6]);
1961 assert_eq!(deq2, []);
1962 }
1963
1964 #[test]
1965 fn vec_append_small() {
1966 let mut v = FixedSliceDeque::new(10);
1967 let mut deq = fsdeq![1, 2, 3];
1968 let mut deq2 = fsdeq![4, 5, 6];
1969 v.append(&mut deq);
1970 v.append(&mut deq2);
1971 assert_eq!(v, [1, 2, 3, 4, 5, 6]);
1972 assert_eq!(v.capacity(), 10);
1973 assert_eq!(deq, []);
1974 assert_eq!(deq2, []);
1975 }
1976
1977 #[test]
1978 fn vec_into_iter_as_slice() {
1979 let deq = fsdeq!['a', 'b', 'c'];
1980 let mut into_iter = deq.into_iter();
1981 assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
1982 let _ = into_iter.next().unwrap();
1983 assert_eq!(into_iter.as_slice(), &['b', 'c']);
1984 let _ = into_iter.next().unwrap();
1985 let _ = into_iter.next().unwrap();
1986 assert_eq!(into_iter.as_slice(), &[]);
1987 }
1988
1989 #[test]
1990 fn vec_into_iter_as_mut_slice() {
1991 let deq = fsdeq!['a', 'b', 'c'];
1992 let mut into_iter = deq.into_iter();
1993 assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
1994 into_iter.as_mut_slice()[0] = 'x';
1995 into_iter.as_mut_slice()[1] = 'y';
1996 assert_eq!(into_iter.next().unwrap(), 'x');
1997 assert_eq!(into_iter.as_slice(), &['y', 'c']);
1998 }
1999
2000 #[test]
2001 fn vec_into_iter_debug() {
2002 let deq = fsdeq!['a', 'b', 'c'];
2003 let into_iter = deq.into_iter();
2004 let debug = format!("{:?}", into_iter);
2005 assert_eq!(debug, "IntoIter(['a', 'b', 'c'])");
2006 }
2007
2008 #[test]
2009 fn vec_into_iter_count() {
2010 assert_eq!(fsdeq![1, 2, 3].into_iter().count(), 3);
2011 }
2012
2013 #[test]
2014 fn vec_into_iter_clone() {
2015 fn iter_equal<I: Iterator<Item = i32>>(it: I, slice: &[i32]) {
2016 let v: FixedSliceDeque<i32> = it.collect();
2017 assert_eq!(&v[..], slice);
2018 }
2019 let deq = fsdeq![1, 2, 3];
2020 let mut it = deq.into_iter();
2021 let it_c = it.clone();
2022 iter_equal(it_c, &[1, 2, 3]);
2023 assert_eq!(it.next(), Some(1));
2024 let mut it = it.rev();
2025 iter_equal(it.clone(), &[3, 2]);
2026 assert_eq!(it.next(), Some(3));
2027 iter_equal(it.clone(), &[2]);
2028 assert_eq!(it.next(), Some(2));
2029 iter_equal(it.clone(), &[]);
2030 assert_eq!(it.next(), None);
2031 }
2032
2033 #[test]
2034 fn into_inner() {
2035 let fdeque = fsdeq![1, 2, 3];
2036 let deque = VecDeque::from(vec![1, 2, 3]);
2037 assert_eq!(fdeque.into_inner(), deque);
2038 }
2039
2040 #[test]
2041 fn drain_filter_empty() {
2042 let mut deq: FixedSliceDeque<i32> = fsdeq![];
2043
2044 {
2045 let mut iter = deq.drain_filter(|_| true);
2046 assert_eq!(iter.size_hint(), (0, Some(0)));
2047 assert_eq!(iter.next(), None);
2048 assert_eq!(iter.size_hint(), (0, Some(0)));
2049 assert_eq!(iter.next(), None);
2050 assert_eq!(iter.size_hint(), (0, Some(0)));
2051 }
2052 assert_eq!(deq.len(), 0);
2053 assert_eq!(deq, fsdeq![]);
2054 }
2055
2056 #[test]
2057 fn drain_filter_zst() {
2058 let mut deq = fsdeq![(), (), (), (), ()];
2059 let initial_len = deq.len();
2060 let mut count = 0;
2061 {
2062 let mut iter = deq.drain_filter(|_| true);
2063 assert_eq!(iter.size_hint(), (0, Some(initial_len)));
2064 while let Some(_) = iter.next() {
2065 count += 1;
2066 assert_eq!(iter.size_hint(), (0, Some(initial_len - count)));
2067 }
2068 assert_eq!(iter.size_hint(), (0, Some(0)));
2069 assert_eq!(iter.next(), None);
2070 assert_eq!(iter.size_hint(), (0, Some(0)));
2071 }
2072
2073 assert_eq!(count, initial_len);
2074 assert_eq!(deq.len(), 0);
2075 assert_eq!(deq, fsdeq![]);
2076 }
2077
2078 #[test]
2079 fn drain_filter_false() {
2080 let mut deq = fsdeq![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
2081
2082 let initial_len = deq.len();
2083 let mut count = 0;
2084 {
2085 let mut iter = deq.drain_filter(|_| false);
2086 assert_eq!(iter.size_hint(), (0, Some(initial_len)));
2087 for _ in iter.by_ref() {
2088 count += 1;
2089 }
2090 assert_eq!(iter.size_hint(), (0, Some(0)));
2091 assert_eq!(iter.next(), None);
2092 assert_eq!(iter.size_hint(), (0, Some(0)));
2093 }
2094
2095 assert_eq!(count, 0);
2096 assert_eq!(deq.len(), initial_len);
2097 assert_eq!(deq, fsdeq![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
2098 }
2099
2100 #[test]
2101 fn drain_filter_true() {
2102 let mut deq = fsdeq![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
2103
2104 let initial_len = deq.len();
2105 let mut count = 0;
2106 {
2107 let mut iter = deq.drain_filter(|_| true);
2108 assert_eq!(iter.size_hint(), (0, Some(initial_len)));
2109 while let Some(_) = iter.next() {
2110 count += 1;
2111 assert_eq!(iter.size_hint(), (0, Some(initial_len - count)));
2112 }
2113 assert_eq!(iter.size_hint(), (0, Some(0)));
2114 assert_eq!(iter.next(), None);
2115 assert_eq!(iter.size_hint(), (0, Some(0)));
2116 }
2117
2118 assert_eq!(count, initial_len);
2119 assert_eq!(deq.len(), 0);
2120 assert_eq!(deq, fsdeq![]);
2121 }
2122
2123 #[test]
2124 fn drain_filter_complex() {
2125 {
2126 let mut deq = fsdeq![
2128 1, 2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36,
2129 37, 39,
2130 ];
2131
2132 let removed = deq
2133 .drain_filter(|x| *x % 2 == 0)
2134 .collect::<FixedSliceDeque<_>>();
2135 assert_eq!(removed.len(), 10);
2136 assert_eq!(removed, fsdeq![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
2137
2138 assert_eq!(deq.len(), 14);
2139 assert_eq!(
2140 deq,
2141 fsdeq![1, 7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]
2142 );
2143 }
2144
2145 {
2146 let mut deq = fsdeq![
2148 2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36, 37,
2149 39,
2150 ];
2151
2152 let removed = deq
2153 .drain_filter(|x| *x % 2 == 0)
2154 .collect::<FixedSliceDeque<_>>();
2155 assert_eq!(removed.len(), 10);
2156 assert_eq!(removed, fsdeq![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
2157
2158 assert_eq!(deq.len(), 13);
2159 assert_eq!(
2160 deq,
2161 fsdeq![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]
2162 );
2163 }
2164
2165 {
2166 let mut deq = fsdeq![
2168 2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36,
2169 ];
2170
2171 let removed = deq
2172 .drain_filter(|x| *x % 2 == 0)
2173 .collect::<FixedSliceDeque<_>>();
2174 assert_eq!(removed.len(), 10);
2175 assert_eq!(removed, fsdeq![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
2176
2177 assert_eq!(deq.len(), 11);
2178 assert_eq!(deq, fsdeq![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35]);
2179 }
2180
2181 {
2182 let mut deq =
2184 fsdeq![2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19,];
2185
2186 let removed = deq
2187 .drain_filter(|x| *x % 2 == 0)
2188 .collect::<FixedSliceDeque<_>>();
2189 assert_eq!(removed.len(), 10);
2190 assert_eq!(removed, fsdeq![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
2191
2192 assert_eq!(deq.len(), 10);
2193 assert_eq!(deq, fsdeq![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
2194 }
2195
2196 {
2197 let mut deq =
2199 fsdeq![1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20,];
2200
2201 let removed = deq
2202 .drain_filter(|x| *x % 2 == 0)
2203 .collect::<FixedSliceDeque<_>>();
2204 assert_eq!(removed.len(), 10);
2205 assert_eq!(removed, fsdeq![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
2206
2207 assert_eq!(deq.len(), 10);
2208 assert_eq!(deq, fsdeq![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
2209 }
2210 }
2211
2212 #[test]
2213 fn vecdeque_simple() {
2214 let mut d = FixedSliceDeque::new(3);
2215 assert_eq!(d.len(), 0);
2216 assert_eq!(d.capacity(), 3);
2217 d.push_front(17);
2218 d.push_front(42);
2219 d.push_back(137);
2220 assert_eq!(d.len(), 3);
2221 assert_eq!(d.capacity(), 3);
2222 d.push_back(137);
2223 assert_eq!(d.len(), 3);
2224 assert_eq!(*d.front().unwrap(), 17);
2225 assert_eq!(*d.back().unwrap(), 137);
2226 let mut i = d.pop_front();
2227 assert_eq!(i, Some(17));
2228 i = d.pop_back();
2229 assert_eq!(i, Some(137));
2230 i = d.pop_back();
2231 assert_eq!(i, Some(137));
2232 i = d.pop_back();
2233 assert_eq!(i, None);
2234 assert_eq!(d.len(), 0);
2235 assert_eq!(d.capacity(), 3);
2236 d.push_back(3);
2237 assert_eq!(d.len(), 1);
2238 d.push_front(2);
2239 assert_eq!(d.len(), 2);
2240 d.push_back(4);
2241 assert_eq!(d.len(), 3);
2242 d.push_front(1);
2243 assert_eq!(d.len(), 3);
2244 assert_eq!(d[0], 1);
2245 assert_eq!(d[1], 2);
2246 assert_eq!(d[2], 3);
2247 }
2248
2249 #[test]
2250 fn vecdeque_push_front_grow() {
2251 let mut deq = FixedSliceDeque::new(66);
2252 for i in 0..66 {
2253 deq.push_front(i);
2254 }
2255 assert_eq!(deq.len(), 66);
2256
2257 for i in 0..66 {
2258 assert_eq!(deq[i], 65 - i);
2259 }
2260
2261 let mut deq = FixedSliceDeque::new(66);
2262 for i in 0..66 {
2263 deq.push_back(i);
2264 }
2265
2266 for i in 0..66 {
2267 assert_eq!(deq[i], i);
2268 }
2269 }
2270
2271 #[test]
2272 fn vecdeque_index() {
2273 let mut deq = FixedSliceDeque::new(4);
2274 for i in 1..4 {
2275 deq.push_front(i);
2276 }
2277 assert_eq!(deq[1], 2);
2278 }
2279
2280 #[test]
2281 #[should_panic]
2282 fn vecdeque_index_out_of_bounds() {
2283 let mut deq = FixedSliceDeque::new(1);
2284 for i in 1..4 {
2285 deq.push_front(i);
2286 }
2287 #[expect(clippy::no_effect, reason = "This is just to make it panic")]
2288 deq[3];
2289 }
2290
2291 #[test]
2292 fn vecdeque_with_capacity() {
2293 let mut d = FixedSliceDeque::new(0);
2294 d.push_back(1);
2295 assert_eq!(d.len(), 1);
2296 let mut d = FixedSliceDeque::new(50);
2297 d.push_back(1);
2298 assert_eq!(d.len(), 1);
2299 }
2300
2301 #[test]
2302 fn vecdeque_with_capacity_non_power_two() {
2303 let mut d3 = FixedSliceDeque::new(3);
2304 d3.push_back(1);
2305
2306 assert_eq!(d3.pop_front(), Some(1));
2309 assert_eq!(d3.front(), None);
2311
2312 d3.push_back(3);
2314 d3.push_back(6);
2316 assert_eq!(d3.pop_front(), Some(3));
2318
2319 d3.push_back(9);
2323 d3.push_back(12);
2325
2326 d3.push_back(15);
2327 assert_eq!(d3.pop_front(), Some(9));
2335
2336 assert_eq!(d3.front(), Some(&12));
2340 assert_eq!(d3.capacity(), 3);
2341 }
2342
2343 #[test]
2344 fn vecdeque_iter() {
2345 let mut d = FixedSliceDeque::new(10);
2346 assert_eq!(d.iter().next(), None);
2347 assert_eq!(d.iter().size_hint(), (0, Some(0)));
2348
2349 for i in 0..5 {
2350 d.push_back(i);
2351 }
2352 {
2353 let b: &[_] = &[&0, &1, &2, &3, &4];
2354 assert_eq!(d.iter().collect::<Vec<_>>(), b);
2355 }
2356
2357 for i in 6..9 {
2358 d.push_front(i);
2359 }
2360 {
2361 let b: &[_] = &[&8, &7, &6, &0, &1, &2, &3, &4];
2362 assert_eq!(d.iter().collect::<Vec<_>>(), b);
2363 }
2364
2365 let mut it = d.iter();
2366 let mut len = d.len();
2367 loop {
2368 match it.next() {
2369 None => break,
2370 _ => {
2371 len -= 1;
2372 assert_eq!(it.size_hint(), (len, Some(len)))
2373 }
2374 }
2375 }
2376 }
2377
2378 #[test]
2379 fn vecdeque_rev_iter() {
2380 let mut d = FixedSliceDeque::new(10);
2381 assert_eq!(d.iter().next_back(), None);
2382
2383 for i in 0..5 {
2384 d.push_back(i);
2385 }
2386 {
2387 let b: &[_] = &[&4, &3, &2, &1, &0];
2388 assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
2389 }
2390
2391 for i in 6..9 {
2392 d.push_front(i);
2393 }
2394 let b: &[_] = &[&4, &3, &2, &1, &0, &6, &7, &8];
2395 assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
2396 }
2397
2398 #[test]
2399 fn vecdeque_mut_rev_iter_wrap() {
2400 let mut d = FixedSliceDeque::new(3);
2401 assert!(d.iter_mut().next_back().is_none());
2402
2403 d.push_back(1);
2404 d.push_back(2);
2405 d.push_back(3);
2406 assert_eq!(d.pop_front(), Some(1));
2407 d.push_back(4);
2408
2409 assert_eq!(
2410 d.iter_mut().rev().map(|x| *x).collect::<Vec<_>>(),
2411 vec![4, 3, 2]
2412 );
2413 }
2414
2415 #[test]
2416 fn vecdeque_mut_iter() {
2417 let mut d = FixedSliceDeque::new(3);
2418 assert!(d.iter_mut().next().is_none());
2419
2420 for i in 0..3 {
2421 d.push_front(i);
2422 }
2423
2424 for (i, elt) in d.iter_mut().enumerate() {
2425 assert_eq!(*elt, 2 - i);
2426 *elt = i;
2427 }
2428
2429 {
2430 let mut it = d.iter_mut();
2431 assert_eq!(*it.next().unwrap(), 0);
2432 assert_eq!(*it.next().unwrap(), 1);
2433 assert_eq!(*it.next().unwrap(), 2);
2434 assert!(it.next().is_none());
2435 }
2436 }
2437
2438 #[test]
2439 fn vecdeque_mut_rev_iter() {
2440 let mut d = FixedSliceDeque::new(3);
2441 assert!(d.iter_mut().next_back().is_none());
2442
2443 for i in 0..3 {
2444 d.push_front(i);
2445 }
2446
2447 for (i, elt) in d.iter_mut().rev().enumerate() {
2448 assert_eq!(*elt, i);
2449 *elt = i;
2450 }
2451
2452 {
2453 let mut it = d.iter_mut().rev();
2454 assert_eq!(*it.next().unwrap(), 0);
2455 assert_eq!(*it.next().unwrap(), 1);
2456 assert_eq!(*it.next().unwrap(), 2);
2457 assert!(it.next().is_none());
2458 }
2459 }
2460
2461 #[test]
2462 fn vecdeque_into_iter() {
2463 {
2465 let d: FixedSliceDeque<i32> = FixedSliceDeque::new(0);
2466 let mut iter = d.into_iter();
2467
2468 assert_eq!(iter.size_hint(), (0, Some(0)));
2469 assert_eq!(iter.next(), None);
2470 assert_eq!(iter.size_hint(), (0, Some(0)));
2471 }
2472
2473 {
2475 let mut d = FixedSliceDeque::new(5);
2476 for i in 0..5 {
2477 d.push_back(i);
2478 }
2479
2480 let b = vec![0, 1, 2, 3, 4];
2481 assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
2482 }
2483
2484 {
2486 let mut d = FixedSliceDeque::new(10);
2487 for i in 0..5 {
2488 d.push_back(i);
2489 }
2490 for i in 6..9 {
2491 d.push_front(i);
2492 }
2493
2494 let b = vec![8, 7, 6, 0, 1, 2, 3, 4];
2495 assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
2496 }
2497
2498 {
2500 let mut d = FixedSliceDeque::new(10);
2501 for i in 0..5 {
2502 d.push_back(i);
2503 }
2504 for i in 6..9 {
2505 d.push_front(i);
2506 }
2507
2508 let mut it = d.into_iter();
2509 assert_eq!(it.size_hint(), (8, Some(8)));
2510 assert_eq!(it.next(), Some(8));
2511 assert_eq!(it.size_hint(), (7, Some(7)));
2512 assert_eq!(it.next_back(), Some(4));
2513 assert_eq!(it.size_hint(), (6, Some(6)));
2514 assert_eq!(it.next(), Some(7));
2515 assert_eq!(it.size_hint(), (5, Some(5)));
2516 }
2517 }
2518
2519 #[test]
2520 fn vecdeque_drain() {
2521 {
2523 let mut d: FixedSliceDeque<i32> = FixedSliceDeque::new(0);
2524
2525 {
2526 let mut iter = d.drain(..);
2527
2528 assert_eq!(iter.size_hint(), (0, Some(0)));
2529 assert_eq!(iter.next(), None);
2530 assert_eq!(iter.size_hint(), (0, Some(0)));
2531 }
2532
2533 assert!(d.is_empty());
2534 }
2535
2536 {
2538 let mut d = FixedSliceDeque::new(5);
2539 for i in 0..5 {
2540 d.push_back(i);
2541 }
2542
2543 assert_eq!(d.drain(..).collect::<Vec<_>>(), [0, 1, 2, 3, 4]);
2544 assert!(d.is_empty());
2545 }
2546
2547 {
2549 let mut d = FixedSliceDeque::new(10);
2550 for i in 0..5 {
2551 d.push_back(i);
2552 }
2553 for i in 6..9 {
2554 d.push_front(i);
2555 }
2556
2557 assert_eq!(d.drain(..).collect::<Vec<_>>(), [8, 7, 6, 0, 1, 2, 3, 4]);
2558 assert!(d.is_empty());
2559 }
2560
2561 {
2563 let mut d: FixedSliceDeque<_> = FixedSliceDeque::new(10);
2564 for i in 0..5 {
2565 d.push_back(i);
2566 }
2567 for i in 6..9 {
2568 d.push_front(i);
2569 }
2570
2571 {
2572 let mut it = d.drain(..);
2573 assert_eq!(it.size_hint(), (8, Some(8)));
2574 assert_eq!(it.next(), Some(8));
2575 assert_eq!(it.size_hint(), (7, Some(7)));
2576 assert_eq!(it.next_back(), Some(4));
2577 assert_eq!(it.size_hint(), (6, Some(6)));
2578 assert_eq!(it.next(), Some(7));
2579 assert_eq!(it.size_hint(), (5, Some(5)));
2580 }
2581 assert!(d.is_empty());
2582 }
2583 }
2584
2585 #[test]
2586 fn deref_slice_size() {
2587 let mut deq = fsdeq![1, 2, 3, 4, 5];
2588 assert_eq!(deq.as_slice().len(), 5);
2589 assert_eq!(deq.as_mut_slice().len(), 5);
2590 }
2591}