1use slice_deque::SliceDeque;
71use std::ops::{Deref, DerefMut};
72use std::slice;
73
74#[derive(Debug, Clone, Eq, Hash, Default)]
79pub struct FixedSliceDeque<T> {
80 buffer: SliceDeque<T>,
81 capacity: usize,
82}
83
84#[macro_export]
136macro_rules! fsdeq {
137 ($elem:expr; $n:expr) => (
138 {
139 let mut deq = $crate::FixedSliceDeque::new($n);
140 deq.resize($n, $elem);
141 deq
142 }
143 );
144 ($($x:expr),*) => (
145 {
146 let sdeq = ::slice_deque::sdeq![$($x),*];
147 let deq = $crate::FixedSliceDeque::from_slice_deque(sdeq);
148 deq
149 }
150 );
151 ($($x:expr,)*) => (fsdeq![$($x),*])
152}
153
154impl<T> FixedSliceDeque<T> {
155 #[inline]
165 pub fn new(size: usize) -> Self {
166 Self {
167 buffer: SliceDeque::with_capacity(size),
168 capacity: size,
169 }
170 }
171
172 pub fn from_slice_deque(deque: SliceDeque<T>) -> Self {
183 Self {
184 capacity: deque.len(),
185 buffer: deque,
186 }
187 }
188
189 #[inline]
200 pub fn is_full(&self) -> bool {
201 self.buffer.len() == self.capacity
202 }
203
204 #[inline]
216 pub fn is_empty(&self) -> bool {
217 self.buffer.is_empty()
218 }
219
220 #[inline]
222 pub fn len(&self) -> usize {
223 self.buffer.len()
224 }
225
226 #[inline]
228 pub fn capacity(&self) -> usize {
229 self.capacity
230 }
231
232 #[inline]
234 pub fn as_slice(&self) -> &[T] {
235 let len = self.len();
236 &self.buffer.as_slice()[..len]
237 }
238
239 #[inline]
241 pub fn as_mut_slice(&mut self) -> &mut [T] {
242 let len = self.len();
243 &mut self.buffer.as_mut_slice()[..len]
244 }
245
246 #[inline]
264 pub fn append(&mut self, other: &mut Self) {
265 if other.len() + self.len() <= self.capacity {
266 self.buffer.append(&mut other.buffer);
267 } else {
268 other
269 .buffer
270 .truncate_back(other.len() - (self.capacity - self.len()));
271 self.buffer.clear();
272 self.buffer.append(&mut other.buffer);
273 }
274 other.buffer.clear();
275 }
276
277 #[inline]
294 pub fn front(&self) -> Option<&T> {
295 self.buffer.front()
296 }
297
298 #[inline]
315 pub fn front_mut(&mut self) -> Option<&mut T> {
316 self.buffer.front_mut()
317 }
318
319 #[inline]
336 pub fn back(&self) -> Option<&T> {
337 self.buffer.back()
338 }
339
340 #[inline]
357 pub fn back_mut(&mut self) -> Option<&mut T> {
358 self.buffer.back_mut()
359 }
360
361 #[inline]
375 pub fn push_front(&mut self, value: T) -> Option<T> {
376 let ret = self.is_full().then(|| self.buffer.pop_back()).flatten();
377 self.buffer.push_front(value);
378 ret
379 }
380
381 #[inline]
395 pub fn push_back(&mut self, value: T) -> Option<T> {
396 let ret = self.is_full().then(|| self.buffer.pop_front()).flatten();
397 self.buffer.push_back(value);
398 ret
399 }
400
401 #[inline]
413 pub fn try_push_front(&mut self, value: T) -> Result<(), T> {
414 if self.is_full() {
415 return Err(value);
416 }
417 self.push_front(value);
418 Ok(())
419 }
420
421 #[inline]
433 pub fn try_push_back(&mut self, value: T) -> Result<(), T> {
434 if self.is_full() {
435 return Err(value);
436 }
437 self.push_back(value);
438 Ok(())
439 }
440
441 #[inline]
459 pub fn pop_front(&mut self) -> Option<T> {
460 self.buffer.pop_front()
461 }
462
463 #[inline]
481 pub fn pop_back(&mut self) -> Option<T> {
482 self.buffer.pop_back()
483 }
484
485 #[inline]
502 pub fn truncate_front(&mut self, len: usize) {
503 self.buffer.truncate_front(len.min(self.capacity));
504 }
505
506 #[inline]
523 pub fn truncate_back(&mut self, len: usize) {
524 self.buffer.truncate_back(len.min(self.capacity));
525 }
526
527 #[inline]
540 pub fn clear(&mut self) {
541 self.buffer.clear()
542 }
543
544 #[inline]
574 pub fn drain<R>(&mut self, range: R) -> slice_deque::Drain<T>
575 where
576 R: std::ops::RangeBounds<usize>,
577 {
578 self.buffer.drain(range)
579 }
580
581 #[inline]
583 pub fn into_inner(self) -> SliceDeque<T> {
584 self.buffer
585 }
586
587 #[inline]
611 pub fn insert(&mut self, index: usize, element: T) -> Option<T> {
612 let is_full = self.is_full();
613 if index == 0 && is_full {
614 return Some(element);
615 }
616 let ret = is_full.then(|| self.pop_back()).flatten();
617 self.buffer.insert(index, element);
618 ret
619 }
620
621 #[inline]
638 pub fn remove(&mut self, index: usize) -> T {
639 self.buffer.remove(index)
640 }
641
642 #[inline]
659 pub fn retain<F>(&mut self, f: F)
660 where
661 F: FnMut(&T) -> bool,
662 {
663 self.buffer.retain(f);
664 }
665
666 #[inline]
683 pub fn dedup_by_key<F, K>(&mut self, key: F)
684 where
685 F: FnMut(&mut T) -> K,
686 K: PartialEq,
687 {
688 self.buffer.dedup_by_key(key);
689 }
690
691 #[inline]
715 pub fn dedup_by<F>(&mut self, same_bucket: F)
716 where
717 F: FnMut(&mut T, &mut T) -> bool,
718 {
719 self.buffer.dedup_by(same_bucket);
720 }
721
722 #[inline]
782 pub fn drain_filter<F>(&mut self, filter: F) -> slice_deque::DrainFilter<T, F>
783 where
784 F: FnMut(&mut T) -> bool,
785 {
786 self.buffer.drain_filter(filter)
787 }
788}
789
790impl<T: PartialEq> FixedSliceDeque<T> {
791 #[inline]
813 pub fn dedup(&mut self) {
814 self.buffer.dedup();
815 }
816
817 #[inline]
833 pub fn remove_item(&mut self, item: &T) -> Option<T> {
834 self.buffer.remove_item(item)
835 }
836}
837
838impl<T: Clone> FixedSliceDeque<T> {
839 #[inline]
861 pub fn extend_from_slice(&mut self, other: &[T]) {
862 self.capacity = self.len() + other.len();
863 self.buffer.extend_from_slice(other);
864 }
865
866 #[inline]
889 pub fn resize(&mut self, new_capacity: usize, value: T) {
890 self.capacity = new_capacity;
891 self.buffer.resize(new_capacity, value);
892 }
893}
894
895impl<T: Default> FixedSliceDeque<T> {
896 #[inline]
924 pub fn resize_default(&mut self, new_capacity: usize) {
925 self.capacity = new_capacity;
926 self.buffer.resize_default(new_capacity);
927 }
928}
929
930impl<T> Deref for FixedSliceDeque<T> {
931 type Target = [T];
932
933 fn deref(&self) -> &Self::Target {
934 self.as_slice()
935 }
936}
937
938impl<T> DerefMut for FixedSliceDeque<T> {
939 fn deref_mut(&mut self) -> &mut Self::Target {
940 self.buffer.as_mut_slice()
941 }
942}
943
944impl<T> From<SliceDeque<T>> for FixedSliceDeque<T> {
945 fn from(deque: SliceDeque<T>) -> Self {
946 Self::from_slice_deque(deque)
947 }
948}
949
950impl<'a, T: Clone> From<&'a [T]> for FixedSliceDeque<T> {
951 fn from(slice: &'a [T]) -> Self {
952 Self {
953 capacity: slice.len(),
954 buffer: SliceDeque::from(slice),
955 }
956 }
957}
958
959impl<'a, T: Clone> From<&'a mut [T]> for FixedSliceDeque<T> {
960 fn from(slice: &'a mut [T]) -> Self {
961 Self {
962 capacity: slice.len(),
963 buffer: SliceDeque::from(slice),
964 }
965 }
966}
967
968impl<T> IntoIterator for FixedSliceDeque<T> {
969 type Item = T;
970 type IntoIter = slice_deque::IntoIter<T>;
971
972 fn into_iter(self) -> Self::IntoIter {
973 self.buffer.into_iter()
974 }
975}
976
977impl<'a, T> IntoIterator for &'a FixedSliceDeque<T> {
978 type Item = &'a T;
979 type IntoIter = slice::Iter<'a, T>;
980 #[inline]
981 fn into_iter(self) -> slice::Iter<'a, T> {
982 self.iter()
983 }
984}
985
986impl<'a, T> IntoIterator for &'a mut FixedSliceDeque<T> {
987 type Item = &'a mut T;
988 type IntoIter = slice::IterMut<'a, T>;
989 #[inline]
990 fn into_iter(self) -> slice::IterMut<'a, T> {
991 self.iter_mut()
992 }
993}
994
995impl<T> Extend<T> for FixedSliceDeque<T> {
996 #[inline]
997 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
998 self.buffer.extend(iter);
999 self.capacity = self.buffer.len();
1000 }
1001}
1002
1003impl<'a, T: 'a + Copy> Extend<&'a T> for FixedSliceDeque<T> {
1004 fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
1005 self.buffer.extend(iter.into_iter());
1006 self.capacity = self.buffer.len();
1007 }
1008}
1009
1010impl<T> std::iter::FromIterator<T> for FixedSliceDeque<T> {
1011 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
1012 Self::from_slice_deque(SliceDeque::from_iter(iter.into_iter()))
1013 }
1014}
1015
1016macro_rules! __impl_slice_eq1 {
1017 ($Lhs:ty, $Rhs:ty) => {
1018 __impl_slice_eq1! { $Lhs, $Rhs, Sized }
1019 };
1020 ($Lhs:ty, $Rhs:ty, $Bound:ident) => {
1021 #[allow(clippy::extra_unused_lifetimes)]
1022 impl<'a, 'b, A: $Bound, B> PartialEq<$Rhs> for $Lhs
1023 where
1024 A: PartialEq<B>,
1025 {
1026 #[inline]
1027 fn eq(&self, other: &$Rhs) -> bool {
1028 self.buffer[..] == other[..]
1029 }
1030 }
1031 };
1032}
1033__impl_slice_eq1! { FixedSliceDeque<A>, FixedSliceDeque<B> }
1034__impl_slice_eq1! { FixedSliceDeque<A>, SliceDeque<B> }
1035__impl_slice_eq1! { FixedSliceDeque<A>, &'b [B] }
1036__impl_slice_eq1! { FixedSliceDeque<A>, &'b mut [B] }
1037__impl_slice_eq1! { FixedSliceDeque<A>, Vec<B> }
1038
1039macro_rules! array_impls {
1040 ($($N: expr)+) => {
1041 $(
1042 __impl_slice_eq1! { FixedSliceDeque<A>, [B; $N] }
1044 __impl_slice_eq1! { FixedSliceDeque<A>, &'b [B; $N] }
1045 )+
1046 }
1047}
1048
1049array_impls! {
1050 0 1 2 3 4 5 6 7 8 9
1051 10 11 12 13 14 15 16 17 18 19
1052 20 21 22 23 24 25 26 27 28 29
1053 30 31 32
1054}
1055
1056#[cfg(test)]
1057mod tests {
1058 use crate::FixedSliceDeque;
1059 use std::cell::RefCell;
1060 use std::collections::HashMap;
1061 use std::rc::Rc;
1062
1063 const SIZES_TO_TEST: &[usize] = &[2, 4, 8, 16, 32, 64, 128];
1064
1065 #[derive(Clone, Debug)]
1066 struct WithDrop {
1067 counter: Rc<RefCell<usize>>,
1068 }
1069
1070 impl Drop for WithDrop {
1071 fn drop(&mut self) {
1072 *self.counter.borrow_mut() += 1;
1073 }
1074 }
1075
1076 #[test]
1077 fn get() {
1078 let mut deq = FixedSliceDeque::new(3);
1079 deq.push_back(3);
1080 deq.push_back(4);
1081 deq.push_back(5);
1082 assert_eq!(deq.get(1), Some(&4));
1083 }
1084
1085 #[test]
1086 fn get_mut() {
1087 let mut deq = FixedSliceDeque::new(3);
1088 deq.push_back(3);
1089 deq.push_back(4);
1090 deq.push_back(5);
1091 assert_eq!(deq.get(1), Some(&4));
1092 if let Some(elem) = deq.get_mut(1) {
1093 *elem = 7;
1094 }
1095 assert_eq!(deq[1], 7);
1096 }
1097
1098 #[test]
1099 fn is_empty() {
1100 let mut deq = FixedSliceDeque::new(1);
1101 assert!(deq.is_empty());
1102 deq.push_back(4);
1103 assert!(!deq.is_empty());
1104 deq.pop_front();
1105 assert!(deq.is_empty());
1106 }
1107
1108 #[test]
1109 fn push_pop_front() {
1110 for size in SIZES_TO_TEST.iter().copied() {
1111 let mut v: FixedSliceDeque<usize> = FixedSliceDeque::new(size);
1112 for i in 0..size {
1113 v.push_front(i);
1114 assert_eq!(v.len(), i + 1);
1115 assert_eq!(v.capacity(), size);
1116 for j in 0..v.len() {
1117 assert_eq!(*v.get(v.len() - j - 1).unwrap(), j);
1118 }
1119 }
1120 assert_eq!(v.len(), size);
1121 for i in 0..size {
1122 assert_eq!(*v.get(i).unwrap(), size - i - 1);
1123 }
1124 for i in 0..size {
1125 assert_eq!(v.len(), size - i);
1126 assert_eq!(v.capacity(), size);
1127 v.pop_front();
1128 for j in 0..v.len() {
1129 assert_eq!(*v.get(v.len() - j - 1).unwrap(), j);
1130 }
1131 }
1132 assert_eq!(v.len(), 0);
1133 assert_eq!(v.capacity(), size);
1134 }
1135 }
1136
1137 #[test]
1138 fn try_push_front() {
1139 let mut deque = FixedSliceDeque::new(0);
1140 assert_eq!(deque.try_push_front(1), Err(1));
1141 }
1142
1143 #[test]
1144 fn try_push_back() {
1145 let mut deque = FixedSliceDeque::new(0);
1146 assert_eq!(deque.try_push_back(1), Err(1));
1147 }
1148
1149 #[test]
1150 fn front_back_mut() {
1151 let mut v = fsdeq![1];
1152 assert_eq!(v.front_mut(), Some(&mut 1));
1153 assert_eq!(v.back_mut(), Some(&mut 1));
1154 }
1155
1156 #[test]
1157 fn mut_slice() {
1158 let mut v = fsdeq![1];
1159 assert_eq!(v.as_mut_slice(), &mut [1]);
1160 }
1161
1162 #[test]
1163 fn push_pop_back() {
1164 for size in SIZES_TO_TEST.iter().copied() {
1165 let mut v: FixedSliceDeque<_> = (0..size).collect();
1166 for i in 0..size {
1167 assert_eq!(v.len(), size - i);
1168 assert_eq!(v.capacity(), size);
1169 v.pop_back();
1170 for j in 0..v.len() {
1171 assert_eq!(*v.get(j).unwrap(), j);
1172 }
1173 }
1174 assert_eq!(v.len(), 0);
1175 assert_eq!(v.capacity(), size);
1176 }
1177 }
1178
1179 #[test]
1180 fn keeps_capacity() {
1181 for size in SIZES_TO_TEST.iter().copied() {
1182 let mut v: FixedSliceDeque<_> = (0..size).collect();
1183 for i in 0..size {
1184 let first = v.push_back(i);
1185 assert!(v.is_full());
1186 assert_eq!(v.capacity(), size);
1187 assert!(first.is_some());
1188 }
1189
1190 for i in 0..size {
1191 let last = v.push_front(i);
1192 assert!(v.is_full());
1193 assert_eq!(v.capacity(), size);
1194 assert!(last.is_some());
1195 }
1196 }
1197 }
1198
1199 #[test]
1200 fn from_slice_deque() {
1201 let deque = slice_deque::sdeq![1, 2, 3];
1202 let v: FixedSliceDeque<_> = deque.clone().into();
1203 assert_eq!(&v, &deque);
1204 let v: FixedSliceDeque<_> = FixedSliceDeque::from_slice_deque(deque.clone());
1205 assert_eq!(&v, &deque);
1206 }
1207
1208 #[test]
1209 fn from_slice() {
1210 let deque = [1, 2, 3];
1211 let v: FixedSliceDeque<_> = deque.clone().as_slice().into();
1212 assert_eq!(&v, &deque);
1213 }
1214
1215 #[test]
1216 fn from_slice_mut() {
1217 let deque = [1, 2, 3];
1218 let v: FixedSliceDeque<_> = deque.clone().as_mut_slice().into();
1219 assert_eq!(&v, &deque);
1220 }
1221
1222 #[test]
1223 fn clear() {
1224 for size in SIZES_TO_TEST.iter().copied() {
1225 let counter = Rc::new(RefCell::new(0));
1226 let val = WithDrop {
1227 counter: counter.clone(),
1228 };
1229 assert_eq!(*counter.borrow(), 0);
1230 let mut deque: FixedSliceDeque<_> = (0..size).map(|_| val.clone()).collect();
1231 assert_eq!(*counter.borrow(), 0);
1232 deque.clear();
1233 assert_eq!(*counter.borrow(), size);
1234 assert_eq!(deque.len(), 0);
1235 }
1236 }
1237
1238 #[test]
1239 fn resize() {
1240 for size in SIZES_TO_TEST.iter().copied() {
1241 let mut v: FixedSliceDeque<_> = (0..size).collect();
1242 let v_ref: FixedSliceDeque<_> = (0..size / 2).collect();
1243 v.resize(size / 2, 0);
1244 assert_eq!(v.len(), size / 2);
1245 assert_eq!(v.capacity(), size / 2);
1246 assert_eq!(v.as_slice(), v_ref.as_slice());
1247
1248 v.resize(size, 3);
1249 assert_eq!(v.len(), size);
1250 assert_eq!(v.capacity(), size);
1251 assert_eq!(v.as_slice().last(), Some(&3));
1252
1253 v.resize(0, 3);
1254 assert_eq!(v.len(), 0);
1255 assert_eq!(v.capacity(), 0);
1256
1257 v.resize(size, 3);
1258 let v_ref: FixedSliceDeque<_> = (0..size).map(|_| 3usize).collect();
1259 assert_eq!(v.len(), size);
1260 assert_eq!(v.capacity(), size);
1261 assert_eq!(v_ref.len(), size);
1262 assert_eq!(v.as_slice(), v_ref.as_slice());
1263 }
1264 }
1265
1266 #[test]
1267 fn resize_default() {
1268 for size in SIZES_TO_TEST.iter().copied() {
1269 let mut v: FixedSliceDeque<_> = (0..size).collect();
1270 let v_ref: FixedSliceDeque<_> = (0..size / 2).collect();
1271 v.resize_default(size / 2);
1272 assert_eq!(v.len(), size / 2);
1273 assert_eq!(v.capacity(), size / 2);
1274 assert_eq!(v.as_slice(), v_ref.as_slice());
1275
1276 v.resize_default(size);
1277 assert_eq!(v.len(), size);
1278 assert_eq!(v.capacity(), size);
1279 assert_eq!(v.as_slice().last(), Some(&0));
1280
1281 v.resize_default(0);
1282 assert_eq!(v.len(), 0);
1283 assert_eq!(v.capacity(), 0);
1284
1285 v.resize_default(size);
1286 let v_ref: FixedSliceDeque<_> = (0..size).map(|_| 0).collect();
1287 assert_eq!(v.len(), size);
1288 assert_eq!(v.capacity(), size);
1289 assert_eq!(v_ref.len(), size);
1290 assert_eq!(v.as_slice(), v_ref.as_slice());
1291 }
1292 }
1293
1294 #[test]
1295 fn iter() {
1296 let mut deq = FixedSliceDeque::new(3);
1297 deq.push_back(5);
1298 deq.push_back(3);
1299 deq.push_back(4);
1300 let b: &[_] = &[&5, &3, &4];
1301 let c: Vec<&i32> = deq.iter().collect();
1302 assert_eq!(&c[..], b);
1303 }
1304
1305 #[test]
1306 fn iter_mut() {
1307 let mut deq = FixedSliceDeque::new(3);
1308 deq.push_back(5);
1309 deq.push_back(3);
1310 deq.push_back(4);
1311 for num in deq.iter_mut() {
1312 *num = *num - 2;
1313 }
1314 let b: &[_] = &[&mut 3, &mut 1, &mut 2];
1315 assert_eq!(&deq.iter_mut().collect::<Vec<&mut i32>>()[..], b);
1316 }
1317
1318 #[test]
1319 fn hash_map() {
1320 let mut hm: HashMap<FixedSliceDeque<u32>, u32> = HashMap::new();
1321 let mut a = FixedSliceDeque::new(2);
1322 a.push_back(1);
1323 a.push_back(2);
1324 hm.insert(a.clone(), 3);
1325 let b = FixedSliceDeque::new(0);
1326 assert_eq!(hm.get(&a), Some(&3));
1327 assert_eq!(hm.get(&b), None);
1328 }
1329
1330 #[test]
1331 fn eq() {
1332 let mut a = FixedSliceDeque::new(3);
1333 a.push_back(1);
1334 a.push_back(2);
1335 a.push_back(3);
1336 assert!(a == a);
1337 assert!(!(a != a));
1338 }
1339
1340 #[test]
1341 fn vec_extend() {
1342 let mut v = FixedSliceDeque::new(0);
1343 let mut w = FixedSliceDeque::new(3);
1344
1345 v.extend(w.clone().iter().copied());
1346 assert_eq!(v, &[]);
1347
1348 v.extend(0..3);
1349
1350 for i in 0..3 {
1351 w.push_back(i);
1352 }
1353
1354 assert_eq!(v, w);
1355
1356 v.extend(3..10);
1357 for i in 3..10 {
1358 w.push_back(i);
1359 }
1360
1361 assert_eq!(v[7..10], w[..3]);
1362 }
1363
1364 #[test]
1365 fn vec_extend_zst() {
1366 #[derive(PartialEq, Eq, Debug, Clone, Copy)]
1368 struct Foo;
1369
1370 let mut a = FixedSliceDeque::new(0);
1371 let b = fsdeq![Foo, Foo];
1372
1373 a.extend_from_slice(&b);
1374 assert_eq!(&a, &b);
1375 assert_eq!(a.capacity(), 2);
1376 }
1377
1378 #[test]
1379 fn vec_extend_ref() {
1380 let mut v = FixedSliceDeque::new(2);
1381 for &i in &[1, 2] {
1382 v.push_back(i);
1383 }
1384 assert_eq!(v.capacity(), 2);
1385 v.extend(&[3, 4, 5]);
1386 assert_eq!(v.capacity(), 5);
1387
1388 assert_eq!(v.len(), 5);
1389 assert_eq!(v, [1, 2, 3, 4, 5]);
1390
1391 let mut w = FixedSliceDeque::new(2);
1392 for &i in &[6, 7] {
1393 w.push_back(i);
1394 }
1395 assert_eq!(v.capacity(), 5);
1396 v.extend(&w);
1397 assert_eq!(v.capacity(), 7);
1398
1399 assert_eq!(v.len(), 7);
1400 assert_eq!(v, [1, 2, 3, 4, 5, 6, 7]);
1401 }
1402
1403 #[test]
1404 fn vec_slice_from_mut() {
1405 let mut values = fsdeq![1, 2, 3, 4, 5];
1406 {
1407 let slice = &mut values[2..];
1408 assert_eq!(slice, [3, 4, 5]);
1409 for p in slice {
1410 *p += 2;
1411 }
1412 }
1413 assert_eq!(values.capacity(), 5);
1414 assert_eq!(values, [1, 2, 5, 6, 7]);
1415 }
1416
1417 #[test]
1418 fn vec_slice_to_mut() {
1419 let mut values = fsdeq![1, 2, 3, 4, 5];
1420 {
1421 let slice = &mut values[..2];
1422 assert_eq!(slice, [1, 2]);
1423 for p in slice {
1424 *p += 1;
1425 }
1426 }
1427
1428 assert_eq!(values.capacity(), 5);
1429 assert_eq!(values, [2, 3, 3, 4, 5]);
1430 }
1431
1432 #[test]
1433 fn vec_split_at_mut() {
1434 let mut values = fsdeq![1, 2, 3, 4, 5];
1435 {
1436 let (left, right) = values.split_at_mut(2);
1437 {
1438 let left: &[_] = left;
1439 assert_eq!(&left[..left.len()], &[1, 2]);
1440 }
1441 for p in left {
1442 *p += 1;
1443 }
1444
1445 {
1446 let right: &[_] = right;
1447 assert_eq!(&right[..right.len()], &[3, 4, 5]);
1448 }
1449 for p in right {
1450 *p += 2;
1451 }
1452 }
1453
1454 assert_eq!(values.capacity(), 5);
1455 assert_eq!(values, [2, 3, 5, 6, 7]);
1456 }
1457
1458 #[test]
1459 fn vec_clone() {
1460 let v: FixedSliceDeque<i32> = fsdeq![];
1461 let w = fsdeq![1, 2, 3];
1462
1463 assert_eq!(v, v.clone());
1464
1465 let z = w.clone();
1466 assert_eq!(w, z);
1467 assert_ne!(w.as_ptr(), z.as_ptr())
1469 }
1470
1471 #[test]
1472 fn vec_retain() {
1473 let mut deq = fsdeq![1, 2, 3, 4];
1474 deq.retain(|&x| x % 2 == 0);
1475 assert_eq!(deq, [2, 4]);
1476 }
1477
1478 #[test]
1479 fn vec_dedup() {
1480 fn case(a: FixedSliceDeque<i32>, b: FixedSliceDeque<i32>) {
1481 let mut v = a;
1482 v.dedup();
1483 assert_eq!(v, b);
1484 }
1485 case(fsdeq![], fsdeq![]);
1486 case(fsdeq![1], fsdeq![1]);
1487 case(fsdeq![1, 1], fsdeq![1]);
1488 case(fsdeq![1, 2, 3], fsdeq![1, 2, 3]);
1489 case(fsdeq![1, 1, 2, 3], fsdeq![1, 2, 3]);
1490 case(fsdeq![1, 2, 2, 3], fsdeq![1, 2, 3]);
1491 case(fsdeq![1, 2, 3, 3], fsdeq![1, 2, 3]);
1492 case(fsdeq![1, 1, 2, 2, 2, 3, 3], fsdeq![1, 2, 3]);
1493 }
1494
1495 #[test]
1496 fn vec_dedup_by_key() {
1497 fn case(a: FixedSliceDeque<i32>, b: FixedSliceDeque<i32>) {
1498 let mut v = a;
1499 v.dedup_by_key(|i| *i / 10);
1500 assert_eq!(v, b);
1501 }
1502 case(fsdeq![], fsdeq![]);
1503 case(fsdeq![10], fsdeq![10]);
1504 case(fsdeq![10, 11], fsdeq![10]);
1505 case(fsdeq![10, 20, 30], fsdeq![10, 20, 30]);
1506 case(fsdeq![10, 11, 20, 30], fsdeq![10, 20, 30]);
1507 case(fsdeq![10, 20, 21, 30], fsdeq![10, 20, 30]);
1508 case(fsdeq![10, 20, 30, 31], fsdeq![10, 20, 30]);
1509 case(fsdeq![10, 11, 20, 21, 22, 30, 31], fsdeq![10, 20, 30]);
1510 }
1511
1512 #[test]
1513 fn vec_dedup_by() {
1514 let mut deq = fsdeq!["foo", "bar", "Bar", "baz", "bar"];
1515 deq.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
1516
1517 assert_eq!(deq, ["foo", "bar", "baz", "bar"]);
1518
1519 let mut deq: FixedSliceDeque<(&'static str, i32)> =
1520 fsdeq![("foo", 1), ("foo", 2), ("bar", 3), ("bar", 4), ("bar", 5)];
1521 deq.dedup_by(|a, b| {
1522 a.0 == b.0 && {
1523 b.1 += a.1;
1524 true
1525 }
1526 });
1527
1528 assert_eq!(deq, [("foo", 3), ("bar", 12)]);
1529 }
1530
1531 #[test]
1532 fn zero_sized_values() {
1533 let mut v = FixedSliceDeque::new(1);
1534 assert_eq!(v.len(), 0);
1535 v.push_back(());
1536 assert_eq!(v.len(), 1);
1537 v.push_back(());
1538 assert_eq!(v.len(), 1);
1539 assert_eq!(v.pop_back(), Some(()));
1540 assert_eq!(v.pop_back(), None);
1541 assert_eq!(v.pop_back(), None);
1542 assert_eq!(v.capacity(), 1);
1543
1544 assert_eq!(v.iter().count(), 0);
1545 v.push_back(());
1546 assert_eq!(v.iter().count(), 1);
1547 v.push_back(());
1548 assert_eq!(v.iter().count(), 1);
1549
1550 for &() in &v {}
1551
1552 assert_eq!(v.iter_mut().count(), 1);
1553 v.push_back(());
1554 assert_eq!(v.iter_mut().count(), 1);
1555 v.push_back(());
1556 assert_eq!(v.iter_mut().count(), 1);
1557
1558 for &mut () in &mut v {}
1559 v.clear();
1560 assert_eq!(v.iter_mut().count(), 0);
1561 assert_eq!(v.capacity(), 1);
1562 }
1563
1564 #[test]
1565 fn vec_partition() {
1566 assert_eq!(
1567 fsdeq![].into_iter().partition(|x: &i32| *x < 4),
1568 (fsdeq![], fsdeq![])
1569 );
1570 assert_eq!(
1571 fsdeq![1, 2, 3].into_iter().partition(|x| *x < 4),
1572 (fsdeq![1, 2, 3], fsdeq![])
1573 );
1574 assert_eq!(
1575 fsdeq![1, 2, 3].into_iter().partition(|x| *x < 2),
1576 (fsdeq![1], fsdeq![2, 3])
1577 );
1578 assert_eq!(
1579 fsdeq![1, 2, 3].into_iter().partition(|x| *x < 0),
1580 (fsdeq![], fsdeq![1, 2, 3])
1581 );
1582 }
1583
1584 #[test]
1585 fn vec_zip_unzip() {
1586 let z1 = fsdeq![(1, 4), (2, 5), (3, 6)];
1587
1588 let (left, right): (FixedSliceDeque<_>, FixedSliceDeque<_>) = z1.iter().cloned().unzip();
1589
1590 assert_eq!((1, 4), (left[0], right[0]));
1591 assert_eq!((2, 5), (left[1], right[1]));
1592 assert_eq!((3, 6), (left[2], right[2]));
1593 }
1594
1595 #[test]
1596 fn vec_vec_truncate_drop() {
1597 static mut DROPS: u32 = 0;
1598 struct Elem(i32);
1599 impl Drop for Elem {
1600 fn drop(&mut self) {
1601 unsafe {
1602 DROPS += 1;
1603 }
1604 }
1605 }
1606
1607 let mut v = fsdeq![Elem(1), Elem(2), Elem(3), Elem(4), Elem(5)];
1608 assert_eq!(unsafe { DROPS }, 0);
1609 v.truncate_back(3);
1610 assert_eq!(unsafe { DROPS }, 2);
1611 v.truncate_back(0);
1612 assert_eq!(unsafe { DROPS }, 5);
1613 }
1614
1615 #[test]
1616 fn vec_vec_truncate_front_drop() {
1617 static mut DROPS: u32 = 0;
1618 struct Elem(i32);
1619 impl Drop for Elem {
1620 fn drop(&mut self) {
1621 unsafe {
1622 DROPS += 1;
1623 }
1624 }
1625 }
1626
1627 let mut v = fsdeq![Elem(1), Elem(2), Elem(3), Elem(4), Elem(5)];
1628 assert_eq!(unsafe { DROPS }, 0);
1629 v.truncate_front(3);
1630 assert_eq!(unsafe { DROPS }, 2);
1631 v.truncate_front(0);
1632 assert_eq!(unsafe { DROPS }, 5);
1633 }
1634
1635 #[test]
1636 #[should_panic]
1637 fn vec_vec_truncate_fail() {
1638 struct BadElem(i32);
1639 impl Drop for BadElem {
1640 fn drop(&mut self) {
1641 let BadElem(ref mut x) = *self;
1642 if *x == 0xbadbeef {
1643 panic!("BadElem panic: 0xbadbeef")
1644 }
1645 }
1646 }
1647
1648 let mut v = fsdeq![BadElem(1), BadElem(2), BadElem(0xbadbeef), BadElem(4)];
1649 v.truncate_back(0);
1650 }
1651
1652 #[test]
1653 fn vec_index() {
1654 let deq = fsdeq![1, 2, 3];
1655 assert_eq!(deq[1], 2);
1656 }
1657
1658 #[test]
1659 #[should_panic]
1660 fn vec_index_out_of_bounds() {
1661 let deq = fsdeq![1, 2, 3];
1662 let _ = deq[3];
1663 }
1664
1665 #[test]
1666 #[should_panic]
1667 fn vec_slice_out_of_bounds_1() {
1668 let x = fsdeq![1, 2, 3, 4, 5];
1669 let _ = &x[!0..];
1670 }
1671
1672 #[test]
1673 #[should_panic]
1674 fn vec_slice_out_of_bounds_2() {
1675 let x = fsdeq![1, 2, 3, 4, 5];
1676 let _ = &x[..6];
1677 }
1678
1679 #[test]
1680 #[should_panic]
1681 fn vec_slice_out_of_bounds_3() {
1682 let x = fsdeq![1, 2, 3, 4, 5];
1683 let _ = &x[!0..4];
1684 }
1685
1686 #[test]
1687 #[should_panic]
1688 fn vec_slice_out_of_bounds_4() {
1689 let x = fsdeq![1, 2, 3, 4, 5];
1690 let _ = &x[1..6];
1691 }
1692
1693 #[test]
1694 #[should_panic]
1695 fn vec_slice_out_of_bounds_5() {
1696 let x = fsdeq![1, 2, 3, 4, 5];
1697 let _ = &x[3..2];
1698 }
1699
1700 #[test]
1701 fn vec_move_items() {
1702 let deq = fsdeq![1, 2, 3];
1703 let mut deq2 = FixedSliceDeque::new(3);
1704 for i in deq {
1705 deq2.push_back(i);
1706 }
1707 assert_eq!(deq2, [1, 2, 3]);
1708 }
1709
1710 #[test]
1711 fn vec_move_items_reverse() {
1712 let deq = fsdeq![1, 2, 3];
1713 let mut deq2 = FixedSliceDeque::new(3);
1714 for i in deq.into_iter().rev() {
1715 deq2.push_back(i);
1716 }
1717 assert_eq!(deq2, [3, 2, 1]);
1718 }
1719
1720 #[test]
1721 fn vec_move_items_zero_sized() {
1722 let deq = fsdeq![(), (), ()];
1723 let mut deq2 = FixedSliceDeque::new(3);
1724 for i in deq {
1725 deq2.push_back(i);
1726 }
1727 assert_eq!(deq2, [(), (), ()]);
1728 }
1729
1730 #[test]
1731 fn vec_drain_items() {
1732 let mut deq = fsdeq![1, 2, 3];
1733 let mut deq2 = FixedSliceDeque::new(3);
1734 for i in deq.drain(..) {
1735 deq2.push_back(i);
1736 }
1737 assert_eq!(deq, []);
1738 assert_eq!(deq2, [1, 2, 3]);
1739 assert_eq!(deq.capacity(), deq2.capacity());
1740 }
1741
1742 #[test]
1743 fn vec_drain_items_reverse() {
1744 let mut deq = fsdeq![1, 2, 3];
1745 let mut deq2 = FixedSliceDeque::new(3);
1746 for i in deq.drain(..).rev() {
1747 deq2.push_back(i);
1748 }
1749 assert_eq!(deq, []);
1750 assert_eq!(deq2, [3, 2, 1]);
1751 assert_eq!(deq.capacity(), deq2.capacity());
1752 }
1753
1754 #[test]
1755 fn vec_drain_items_zero_sized() {
1756 let mut deq = fsdeq![(), (), ()];
1757 let mut deq2 = FixedSliceDeque::new(3);
1758 for i in deq.drain(..) {
1759 deq2.push_back(i);
1760 }
1761 assert_eq!(deq, []);
1762 assert_eq!(deq2, [(), (), ()]);
1763 assert_eq!(deq.capacity(), deq2.capacity());
1764 }
1765
1766 #[test]
1767 #[should_panic]
1768 fn vec_drain_out_of_bounds() {
1769 let mut v = fsdeq![1, 2, 3, 4, 5];
1770 v.drain(5..6);
1771 }
1772
1773 #[test]
1774 fn vec_drain_range() {
1775 let mut v = fsdeq![1, 2, 3, 4, 5];
1776 for _ in v.drain(4..) {}
1777 assert_eq!(v, &[1, 2, 3, 4]);
1778
1779 let mut v: FixedSliceDeque<_> = (1..6).map(|x| x.to_string()).collect();
1780 for _ in v.drain(1..4) {}
1781 assert_eq!(v, &[1.to_string(), 5.to_string()]);
1782
1783 let mut v: FixedSliceDeque<_> = (1..6).map(|x| x.to_string()).collect();
1784 for _ in v.drain(1..4).rev() {}
1785 assert_eq!(v, &[1.to_string(), 5.to_string()]);
1786 }
1787
1788 #[test]
1789 fn vec_drain_range_zst() {
1790 let mut v: FixedSliceDeque<_> = fsdeq![(); 5];
1791 for _ in v.drain(1..4).rev() {}
1792 assert_eq!(v, &[(), ()]);
1793 }
1794
1795 #[test]
1796 fn vec_drain_inclusive_range() {
1797 let mut v = fsdeq!['a', 'b', 'c', 'd', 'e'];
1798 for _ in v.drain(1..=3) {}
1799 assert_eq!(v, &['a', 'e']);
1800
1801 let mut v: FixedSliceDeque<_> = (0..=5).map(|x| x.to_string()).collect();
1802 for _ in v.drain(1..=5) {}
1803 assert_eq!(v, &["0".to_string()]);
1804
1805 let mut v: FixedSliceDeque<String> = (0..=5).map(|x| x.to_string()).collect();
1806 for _ in v.drain(0..=5) {}
1807 assert_eq!(v, FixedSliceDeque::<String>::new(0));
1808
1809 let mut v: FixedSliceDeque<_> = (0..=5).map(|x| x.to_string()).collect();
1810 for _ in v.drain(0..=3) {}
1811 assert_eq!(v, &["4".to_string(), "5".to_string()]);
1812
1813 let mut v: FixedSliceDeque<_> = (0..=1).map(|x| x.to_string()).collect();
1814 for _ in v.drain(..=0) {}
1815 assert_eq!(v, &["1".to_string()]);
1816 }
1817
1818 #[test]
1819 #[should_panic]
1820 fn vec_drain_inclusive_out_of_bounds() {
1821 let mut v = fsdeq![1, 2, 3, 4, 5];
1822 v.drain(5..=5);
1823 }
1824
1825 #[test]
1826 fn vec_append() {
1827 let mut deq = fsdeq![1, 2, 3];
1828 let mut deq2 = fsdeq![4, 5, 6];
1829 deq.append(&mut deq2);
1830 assert_eq!(deq, [4, 5, 6]);
1831 assert_eq!(deq2, []);
1832 }
1833
1834 #[test]
1835 fn vec_append_small() {
1836 let mut v = FixedSliceDeque::new(10);
1837 let mut deq = fsdeq![1, 2, 3];
1838 let mut deq2 = fsdeq![4, 5, 6];
1839 v.append(&mut deq);
1840 v.append(&mut deq2);
1841 assert_eq!(v, [1, 2, 3, 4, 5, 6]);
1842 assert_eq!(v.capacity(), 10);
1843 assert_eq!(deq, []);
1844 assert_eq!(deq2, []);
1845 }
1846
1847 #[test]
1848 fn vec_into_iter_as_slice() {
1849 let deq = fsdeq!['a', 'b', 'c'];
1850 let mut into_iter = deq.into_iter();
1851 assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
1852 let _ = into_iter.next().unwrap();
1853 assert_eq!(into_iter.as_slice(), &['b', 'c']);
1854 let _ = into_iter.next().unwrap();
1855 let _ = into_iter.next().unwrap();
1856 assert_eq!(into_iter.as_slice(), &[]);
1857 }
1858
1859 #[test]
1860 fn vec_into_iter_as_mut_slice() {
1861 let deq = fsdeq!['a', 'b', 'c'];
1862 let mut into_iter = deq.into_iter();
1863 assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
1864 into_iter.as_mut_slice()[0] = 'x';
1865 into_iter.as_mut_slice()[1] = 'y';
1866 assert_eq!(into_iter.next().unwrap(), 'x');
1867 assert_eq!(into_iter.as_slice(), &['y', 'c']);
1868 }
1869
1870 #[test]
1871 fn vec_into_iter_debug() {
1872 let deq = fsdeq!['a', 'b', 'c'];
1873 let into_iter = deq.into_iter();
1874 let debug = format!("{:?}", into_iter);
1875 assert_eq!(debug, "IntoIter(['a', 'b', 'c'])");
1876 }
1877
1878 #[test]
1879 fn vec_into_iter_count() {
1880 assert_eq!(fsdeq![1, 2, 3].into_iter().count(), 3);
1881 }
1882
1883 #[test]
1884 fn vec_into_iter_clone() {
1885 fn iter_equal<I: Iterator<Item = i32>>(it: I, slice: &[i32]) {
1886 let v: FixedSliceDeque<i32> = it.collect();
1887 assert_eq!(&v[..], slice);
1888 }
1889 let deq = fsdeq![1, 2, 3];
1890 let mut it = deq.into_iter();
1891 let it_c = it.clone();
1892 iter_equal(it_c, &[1, 2, 3]);
1893 assert_eq!(it.next(), Some(1));
1894 let mut it = it.rev();
1895 iter_equal(it.clone(), &[3, 2]);
1896 assert_eq!(it.next(), Some(3));
1897 iter_equal(it.clone(), &[2]);
1898 assert_eq!(it.next(), Some(2));
1899 iter_equal(it.clone(), &[]);
1900 assert_eq!(it.next(), None);
1901 }
1902
1903 #[test]
1904 fn into_inner() {
1905 let fdeque = fsdeq![1, 2, 3];
1906 let deque = slice_deque::sdeq![1, 2, 3];
1907 assert_eq!(fdeque.into_inner(), deque);
1908 }
1909
1910 #[test]
1911 fn drain_filter_empty() {
1912 let mut deq: FixedSliceDeque<i32> = fsdeq![];
1913
1914 {
1915 let mut iter = deq.drain_filter(|_| true);
1916 assert_eq!(iter.size_hint(), (0, Some(0)));
1917 assert_eq!(iter.next(), None);
1918 assert_eq!(iter.size_hint(), (0, Some(0)));
1919 assert_eq!(iter.next(), None);
1920 assert_eq!(iter.size_hint(), (0, Some(0)));
1921 }
1922 assert_eq!(deq.len(), 0);
1923 assert_eq!(deq, fsdeq![]);
1924 }
1925
1926 #[test]
1927 fn drain_filter_zst() {
1928 let mut deq = fsdeq![(), (), (), (), ()];
1929 let initial_len = deq.len();
1930 let mut count = 0;
1931 {
1932 let mut iter = deq.drain_filter(|_| true);
1933 assert_eq!(iter.size_hint(), (0, Some(initial_len)));
1934 while let Some(_) = iter.next() {
1935 count += 1;
1936 assert_eq!(iter.size_hint(), (0, Some(initial_len - count)));
1937 }
1938 assert_eq!(iter.size_hint(), (0, Some(0)));
1939 assert_eq!(iter.next(), None);
1940 assert_eq!(iter.size_hint(), (0, Some(0)));
1941 }
1942
1943 assert_eq!(count, initial_len);
1944 assert_eq!(deq.len(), 0);
1945 assert_eq!(deq, fsdeq![]);
1946 }
1947
1948 #[test]
1949 fn drain_filter_false() {
1950 let mut deq = fsdeq![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1951
1952 let initial_len = deq.len();
1953 let mut count = 0;
1954 {
1955 let mut iter = deq.drain_filter(|_| false);
1956 assert_eq!(iter.size_hint(), (0, Some(initial_len)));
1957 for _ in iter.by_ref() {
1958 count += 1;
1959 }
1960 assert_eq!(iter.size_hint(), (0, Some(0)));
1961 assert_eq!(iter.next(), None);
1962 assert_eq!(iter.size_hint(), (0, Some(0)));
1963 }
1964
1965 assert_eq!(count, 0);
1966 assert_eq!(deq.len(), initial_len);
1967 assert_eq!(deq, fsdeq![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
1968 }
1969
1970 #[test]
1971 fn drain_filter_true() {
1972 let mut deq = fsdeq![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1973
1974 let initial_len = deq.len();
1975 let mut count = 0;
1976 {
1977 let mut iter = deq.drain_filter(|_| true);
1978 assert_eq!(iter.size_hint(), (0, Some(initial_len)));
1979 while let Some(_) = iter.next() {
1980 count += 1;
1981 assert_eq!(iter.size_hint(), (0, Some(initial_len - count)));
1982 }
1983 assert_eq!(iter.size_hint(), (0, Some(0)));
1984 assert_eq!(iter.next(), None);
1985 assert_eq!(iter.size_hint(), (0, Some(0)));
1986 }
1987
1988 assert_eq!(count, initial_len);
1989 assert_eq!(deq.len(), 0);
1990 assert_eq!(deq, fsdeq![]);
1991 }
1992
1993 #[test]
1994 fn drain_filter_complex() {
1995 {
1996 let mut deq = fsdeq![
1998 1, 2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36,
1999 37, 39,
2000 ];
2001
2002 let removed = deq
2003 .drain_filter(|x| *x % 2 == 0)
2004 .collect::<FixedSliceDeque<_>>();
2005 assert_eq!(removed.len(), 10);
2006 assert_eq!(removed, fsdeq![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
2007
2008 assert_eq!(deq.len(), 14);
2009 assert_eq!(
2010 deq,
2011 fsdeq![1, 7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]
2012 );
2013 }
2014
2015 {
2016 let mut deq = fsdeq![
2018 2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36, 37,
2019 39,
2020 ];
2021
2022 let removed = deq
2023 .drain_filter(|x| *x % 2 == 0)
2024 .collect::<FixedSliceDeque<_>>();
2025 assert_eq!(removed.len(), 10);
2026 assert_eq!(removed, fsdeq![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
2027
2028 assert_eq!(deq.len(), 13);
2029 assert_eq!(
2030 deq,
2031 fsdeq![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]
2032 );
2033 }
2034
2035 {
2036 let mut deq = fsdeq![
2038 2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36,
2039 ];
2040
2041 let removed = deq
2042 .drain_filter(|x| *x % 2 == 0)
2043 .collect::<FixedSliceDeque<_>>();
2044 assert_eq!(removed.len(), 10);
2045 assert_eq!(removed, fsdeq![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
2046
2047 assert_eq!(deq.len(), 11);
2048 assert_eq!(deq, fsdeq![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35]);
2049 }
2050
2051 {
2052 let mut deq =
2054 fsdeq![2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19,];
2055
2056 let removed = deq
2057 .drain_filter(|x| *x % 2 == 0)
2058 .collect::<FixedSliceDeque<_>>();
2059 assert_eq!(removed.len(), 10);
2060 assert_eq!(removed, fsdeq![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
2061
2062 assert_eq!(deq.len(), 10);
2063 assert_eq!(deq, fsdeq![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
2064 }
2065
2066 {
2067 let mut deq =
2069 fsdeq![1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20,];
2070
2071 let removed = deq
2072 .drain_filter(|x| *x % 2 == 0)
2073 .collect::<FixedSliceDeque<_>>();
2074 assert_eq!(removed.len(), 10);
2075 assert_eq!(removed, fsdeq![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
2076
2077 assert_eq!(deq.len(), 10);
2078 assert_eq!(deq, fsdeq![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
2079 }
2080 }
2081
2082 #[test]
2083 fn vecdeque_simple() {
2084 let mut d = FixedSliceDeque::new(3);
2085 assert_eq!(d.len(), 0);
2086 assert_eq!(d.capacity(), 3);
2087 d.push_front(17);
2088 d.push_front(42);
2089 d.push_back(137);
2090 assert_eq!(d.len(), 3);
2091 assert_eq!(d.capacity(), 3);
2092 d.push_back(137);
2093 assert_eq!(d.len(), 3);
2094 assert_eq!(*d.front().unwrap(), 17);
2095 assert_eq!(*d.back().unwrap(), 137);
2096 let mut i = d.pop_front();
2097 assert_eq!(i, Some(17));
2098 i = d.pop_back();
2099 assert_eq!(i, Some(137));
2100 i = d.pop_back();
2101 assert_eq!(i, Some(137));
2102 i = d.pop_back();
2103 assert_eq!(i, None);
2104 assert_eq!(d.len(), 0);
2105 assert_eq!(d.capacity(), 3);
2106 d.push_back(3);
2107 assert_eq!(d.len(), 1);
2108 d.push_front(2);
2109 assert_eq!(d.len(), 2);
2110 d.push_back(4);
2111 assert_eq!(d.len(), 3);
2112 d.push_front(1);
2113 assert_eq!(d.len(), 3);
2114 assert_eq!(d[0], 1);
2115 assert_eq!(d[1], 2);
2116 assert_eq!(d[2], 3);
2117 }
2118
2119 #[test]
2120 fn vecdeque_push_front_grow() {
2121 let mut deq = FixedSliceDeque::new(66);
2122 for i in 0..66 {
2123 deq.push_front(i);
2124 }
2125 assert_eq!(deq.len(), 66);
2126
2127 for i in 0..66 {
2128 assert_eq!(deq[i], 65 - i);
2129 }
2130
2131 let mut deq = FixedSliceDeque::new(66);
2132 for i in 0..66 {
2133 deq.push_back(i);
2134 }
2135
2136 for i in 0..66 {
2137 assert_eq!(deq[i], i);
2138 }
2139 }
2140
2141 #[test]
2142 fn vecdeque_index() {
2143 let mut deq = FixedSliceDeque::new(4);
2144 for i in 1..4 {
2145 deq.push_front(i);
2146 }
2147 assert_eq!(deq[1], 2);
2148 }
2149
2150 #[test]
2151 #[should_panic]
2152 fn vecdeque_index_out_of_bounds() {
2153 let mut deq = FixedSliceDeque::new(1);
2154 for i in 1..4 {
2155 deq.push_front(i);
2156 }
2157 deq[3];
2158 }
2159
2160 #[test]
2161 fn vecdeque_with_capacity() {
2162 let mut d = FixedSliceDeque::new(0);
2163 d.push_back(1);
2164 assert_eq!(d.len(), 1);
2165 let mut d = FixedSliceDeque::new(50);
2166 d.push_back(1);
2167 assert_eq!(d.len(), 1);
2168 }
2169
2170 #[test]
2171 fn vecdeque_with_capacity_non_power_two() {
2172 let mut d3 = FixedSliceDeque::new(3);
2173 d3.push_back(1);
2174
2175 assert_eq!(d3.pop_front(), Some(1));
2178 assert_eq!(d3.front(), None);
2180
2181 d3.push_back(3);
2183 d3.push_back(6);
2185 assert_eq!(d3.pop_front(), Some(3));
2187
2188 d3.push_back(9);
2192 d3.push_back(12);
2194
2195 d3.push_back(15);
2196 assert_eq!(d3.pop_front(), Some(9));
2204
2205 assert_eq!(d3.front(), Some(&12));
2209 assert_eq!(d3.capacity(), 3);
2210 }
2211
2212 #[test]
2213 fn vecdeque_iter() {
2214 let mut d = FixedSliceDeque::new(10);
2215 assert_eq!(d.iter().next(), None);
2216 assert_eq!(d.iter().size_hint(), (0, Some(0)));
2217
2218 for i in 0..5 {
2219 d.push_back(i);
2220 }
2221 {
2222 let b: &[_] = &[&0, &1, &2, &3, &4];
2223 assert_eq!(d.iter().collect::<Vec<_>>(), b);
2224 }
2225
2226 for i in 6..9 {
2227 d.push_front(i);
2228 }
2229 {
2230 let b: &[_] = &[&8, &7, &6, &0, &1, &2, &3, &4];
2231 assert_eq!(d.iter().collect::<Vec<_>>(), b);
2232 }
2233
2234 let mut it = d.iter();
2235 let mut len = d.len();
2236 loop {
2237 match it.next() {
2238 None => break,
2239 _ => {
2240 len -= 1;
2241 assert_eq!(it.size_hint(), (len, Some(len)))
2242 }
2243 }
2244 }
2245 }
2246
2247 #[test]
2248 fn vecdeque_rev_iter() {
2249 let mut d = FixedSliceDeque::new(10);
2250 assert_eq!(d.iter().rev().next(), None);
2251
2252 for i in 0..5 {
2253 d.push_back(i);
2254 }
2255 {
2256 let b: &[_] = &[&4, &3, &2, &1, &0];
2257 assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
2258 }
2259
2260 for i in 6..9 {
2261 d.push_front(i);
2262 }
2263 let b: &[_] = &[&4, &3, &2, &1, &0, &6, &7, &8];
2264 assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
2265 }
2266
2267 #[test]
2268 fn vecdeque_mut_rev_iter_wrap() {
2269 let mut d = FixedSliceDeque::new(3);
2270 assert!(d.iter_mut().rev().next().is_none());
2271
2272 d.push_back(1);
2273 d.push_back(2);
2274 d.push_back(3);
2275 assert_eq!(d.pop_front(), Some(1));
2276 d.push_back(4);
2277
2278 assert_eq!(
2279 d.iter_mut().rev().map(|x| *x).collect::<Vec<_>>(),
2280 vec![4, 3, 2]
2281 );
2282 }
2283
2284 #[test]
2285 fn vecdeque_mut_iter() {
2286 let mut d = FixedSliceDeque::new(3);
2287 assert!(d.iter_mut().next().is_none());
2288
2289 for i in 0..3 {
2290 d.push_front(i);
2291 }
2292
2293 for (i, elt) in d.iter_mut().enumerate() {
2294 assert_eq!(*elt, 2 - i);
2295 *elt = i;
2296 }
2297
2298 {
2299 let mut it = d.iter_mut();
2300 assert_eq!(*it.next().unwrap(), 0);
2301 assert_eq!(*it.next().unwrap(), 1);
2302 assert_eq!(*it.next().unwrap(), 2);
2303 assert!(it.next().is_none());
2304 }
2305 }
2306
2307 #[test]
2308 fn vecdeque_mut_rev_iter() {
2309 let mut d = FixedSliceDeque::new(3);
2310 assert!(d.iter_mut().rev().next().is_none());
2311
2312 for i in 0..3 {
2313 d.push_front(i);
2314 }
2315
2316 for (i, elt) in d.iter_mut().rev().enumerate() {
2317 assert_eq!(*elt, i);
2318 *elt = i;
2319 }
2320
2321 {
2322 let mut it = d.iter_mut().rev();
2323 assert_eq!(*it.next().unwrap(), 0);
2324 assert_eq!(*it.next().unwrap(), 1);
2325 assert_eq!(*it.next().unwrap(), 2);
2326 assert!(it.next().is_none());
2327 }
2328 }
2329
2330 #[test]
2331 fn vecdeque_into_iter() {
2332 {
2334 let d: FixedSliceDeque<i32> = FixedSliceDeque::new(0);
2335 let mut iter = d.into_iter();
2336
2337 assert_eq!(iter.size_hint(), (0, Some(0)));
2338 assert_eq!(iter.next(), None);
2339 assert_eq!(iter.size_hint(), (0, Some(0)));
2340 }
2341
2342 {
2344 let mut d = FixedSliceDeque::new(5);
2345 for i in 0..5 {
2346 d.push_back(i);
2347 }
2348
2349 let b = vec![0, 1, 2, 3, 4];
2350 assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
2351 }
2352
2353 {
2355 let mut d = FixedSliceDeque::new(10);
2356 for i in 0..5 {
2357 d.push_back(i);
2358 }
2359 for i in 6..9 {
2360 d.push_front(i);
2361 }
2362
2363 let b = vec![8, 7, 6, 0, 1, 2, 3, 4];
2364 assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
2365 }
2366
2367 {
2369 let mut d = FixedSliceDeque::new(10);
2370 for i in 0..5 {
2371 d.push_back(i);
2372 }
2373 for i in 6..9 {
2374 d.push_front(i);
2375 }
2376
2377 let mut it = d.into_iter();
2378 assert_eq!(it.size_hint(), (8, Some(8)));
2379 assert_eq!(it.next(), Some(8));
2380 assert_eq!(it.size_hint(), (7, Some(7)));
2381 assert_eq!(it.next_back(), Some(4));
2382 assert_eq!(it.size_hint(), (6, Some(6)));
2383 assert_eq!(it.next(), Some(7));
2384 assert_eq!(it.size_hint(), (5, Some(5)));
2385 }
2386 }
2387
2388 #[test]
2389 fn vecdeque_drain() {
2390 {
2392 let mut d: FixedSliceDeque<i32> = FixedSliceDeque::new(0);
2393
2394 {
2395 let mut iter = d.drain(..);
2396
2397 assert_eq!(iter.size_hint(), (0, Some(0)));
2398 assert_eq!(iter.next(), None);
2399 assert_eq!(iter.size_hint(), (0, Some(0)));
2400 }
2401
2402 assert!(d.is_empty());
2403 }
2404
2405 {
2407 let mut d = FixedSliceDeque::new(5);
2408 for i in 0..5 {
2409 d.push_back(i);
2410 }
2411
2412 assert_eq!(d.drain(..).collect::<Vec<_>>(), [0, 1, 2, 3, 4]);
2413 assert!(d.is_empty());
2414 }
2415
2416 {
2418 let mut d = FixedSliceDeque::new(10);
2419 for i in 0..5 {
2420 d.push_back(i);
2421 }
2422 for i in 6..9 {
2423 d.push_front(i);
2424 }
2425
2426 assert_eq!(d.drain(..).collect::<Vec<_>>(), [8, 7, 6, 0, 1, 2, 3, 4]);
2427 assert!(d.is_empty());
2428 }
2429
2430 {
2432 let mut d: FixedSliceDeque<_> = FixedSliceDeque::new(10);
2433 for i in 0..5 {
2434 d.push_back(i);
2435 }
2436 for i in 6..9 {
2437 d.push_front(i);
2438 }
2439
2440 {
2441 let mut it = d.drain(..);
2442 assert_eq!(it.size_hint(), (8, Some(8)));
2443 assert_eq!(it.next(), Some(8));
2444 assert_eq!(it.size_hint(), (7, Some(7)));
2445 assert_eq!(it.next_back(), Some(4));
2446 assert_eq!(it.size_hint(), (6, Some(6)));
2447 assert_eq!(it.next(), Some(7));
2448 assert_eq!(it.size_hint(), (5, Some(5)));
2449 }
2450 assert!(d.is_empty());
2451 }
2452 }
2453
2454 #[test]
2455 fn deref_slice_size() {
2456 let mut deq = fsdeq![1, 2, 3, 4, 5];
2457 assert_eq!(deq.as_slice().len(), 5);
2458 assert_eq!(deq.as_mut_slice().len(), 5);
2459 }
2460}