1use crate::{
37 vec::{OwnedVecStorage, VecStorage, VecStorageInner, ViewVecStorage},
38 CapacityError,
39};
40use core::{
41 cmp::Ordering,
42 fmt,
43 iter::FusedIterator,
44 marker::PhantomData,
45 mem::{ManuallyDrop, MaybeUninit},
46 ptr, slice,
47};
48
49#[cfg(feature = "zeroize")]
50use zeroize::Zeroize;
51
52#[cfg_attr(feature = "zeroize", derive(Zeroize))]
57pub struct DequeInner<T, S: VecStorage<T> + ?Sized> {
58 phantom: PhantomData<T>,
60 front: usize,
62 back: usize,
64
65 full: bool,
68 buffer: S,
69}
70
71pub type Deque<T, const N: usize> = DequeInner<T, OwnedVecStorage<T, N>>;
106
107pub type DequeView<T> = DequeInner<T, ViewVecStorage<T>>;
145
146impl<T, const N: usize> Deque<T, N> {
147 const INIT: MaybeUninit<T> = MaybeUninit::uninit();
148
149 pub const fn new() -> Self {
163 const {
164 assert!(N > 0);
165 }
166
167 Self {
168 phantom: PhantomData,
169 buffer: VecStorageInner {
170 buffer: [Self::INIT; N],
171 },
172 front: 0,
173 back: 0,
174 full: false,
175 }
176 }
177
178 pub const fn capacity(&self) -> usize {
183 N
184 }
185
186 pub const fn len(&self) -> usize {
191 if self.full {
192 N
193 } else if self.back < self.front {
194 self.back + N - self.front
195 } else {
196 self.back - self.front
197 }
198 }
199}
200
201impl<T, S: VecStorage<T> + ?Sized> DequeInner<T, S> {
202 pub fn as_view(&self) -> &DequeView<T> {
204 S::as_deque_view(self)
205 }
206
207 pub fn as_mut_view(&mut self) -> &mut DequeView<T> {
209 S::as_deque_view_mut(self)
210 }
211
212 pub fn storage_capacity(&self) -> usize {
214 self.buffer.borrow().len()
215 }
216
217 fn increment(&self, i: usize) -> usize {
218 if i + 1 == self.storage_capacity() {
219 0
220 } else {
221 i + 1
222 }
223 }
224
225 fn decrement(&self, i: usize) -> usize {
226 if i == 0 {
227 self.storage_capacity() - 1
228 } else {
229 i - 1
230 }
231 }
232
233 pub fn storage_len(&self) -> usize {
235 if self.full {
236 self.storage_capacity()
237 } else if self.back < self.front {
238 self.back + self.storage_capacity() - self.front
239 } else {
240 self.back - self.front
241 }
242 }
243
244 pub fn clear(&mut self) {
246 unsafe { self.drop_contents() }
248 self.front = 0;
249 self.back = 0;
250 self.full = false;
251 }
252
253 unsafe fn drop_contents(&mut self) {
257 let (a, b) = self.as_mut_slices();
259 ptr::drop_in_place(a);
260 ptr::drop_in_place(b);
261 }
262
263 pub fn is_empty(&self) -> bool {
265 self.front == self.back && !self.full
266 }
267
268 pub fn is_full(&self) -> bool {
270 self.full
271 }
272
273 pub fn as_slices(&self) -> (&[T], &[T]) {
275 unsafe {
277 if self.is_empty() {
278 (&[], &[])
279 } else if self.back <= self.front {
280 (
281 slice::from_raw_parts(
282 self.buffer.borrow().as_ptr().add(self.front).cast::<T>(),
283 self.storage_capacity() - self.front,
284 ),
285 slice::from_raw_parts(self.buffer.borrow().as_ptr().cast::<T>(), self.back),
286 )
287 } else {
288 (
289 slice::from_raw_parts(
290 self.buffer.borrow().as_ptr().add(self.front).cast::<T>(),
291 self.back - self.front,
292 ),
293 &[],
294 )
295 }
296 }
297 }
298
299 pub fn as_mut_slices(&mut self) -> (&mut [T], &mut [T]) {
301 let ptr = self.buffer.borrow_mut().as_mut_ptr();
302
303 unsafe {
305 if self.is_empty() {
306 (&mut [], &mut [])
307 } else if self.back <= self.front {
308 (
309 slice::from_raw_parts_mut(
310 ptr.add(self.front).cast::<T>(),
311 self.storage_capacity() - self.front,
312 ),
313 slice::from_raw_parts_mut(ptr.cast::<T>(), self.back),
314 )
315 } else {
316 (
317 slice::from_raw_parts_mut(
318 ptr.add(self.front).cast::<T>(),
319 self.back - self.front,
320 ),
321 &mut [],
322 )
323 }
324 }
325 }
326
327 #[inline]
328 fn is_contiguous(&self) -> bool {
329 self.front <= self.storage_capacity() - self.storage_len()
330 }
331
332 pub fn make_contiguous(&mut self) -> &mut [T] {
363 if self.is_contiguous() {
364 return unsafe {
365 slice::from_raw_parts_mut(
366 self.buffer.borrow_mut().as_mut_ptr().add(self.front).cast(),
367 self.storage_len(),
368 )
369 };
370 }
371
372 let buffer_ptr: *mut T = self.buffer.borrow_mut().as_mut_ptr().cast();
373
374 let len = self.storage_len();
375
376 let free = self.storage_capacity() - len;
377 let front_len = self.storage_capacity() - self.front;
378 let back = len - front_len;
379 let back_len = back;
380
381 if free >= front_len {
382 unsafe {
389 ptr::copy(buffer_ptr, buffer_ptr.add(front_len), back_len);
390 ptr::copy_nonoverlapping(buffer_ptr.add(self.front), buffer_ptr, front_len);
392 }
394
395 self.front = 0;
396 self.back = len;
397 } else if free >= back_len {
398 unsafe {
405 ptr::copy(
406 buffer_ptr.add(self.front),
407 buffer_ptr.add(self.back),
408 front_len,
409 );
410 ptr::copy_nonoverlapping(
412 buffer_ptr,
413 buffer_ptr.add(self.back + front_len),
414 back_len,
415 );
416 }
418
419 self.front = back;
420 self.back = 0;
421 } else {
422 if front_len > back_len {
440 unsafe {
445 if free != 0 {
448 ptr::copy(buffer_ptr, buffer_ptr.add(free), back_len);
452 }
453
454 let slice: &mut [T] = slice::from_raw_parts_mut(
457 buffer_ptr.add(free),
458 self.storage_capacity() - free,
459 );
460
461 slice.rotate_left(back_len);
464
465 self.front = free;
468 self.back = 0;
469 }
470 } else {
471 unsafe {
478 if free != 0 {
481 ptr::copy(
483 buffer_ptr.add(self.front),
484 buffer_ptr.add(back_len),
485 front_len,
486 );
487 }
488
489 let slice: &mut [T] = slice::from_raw_parts_mut(buffer_ptr, len);
492
493 slice.rotate_right(front_len);
496
497 self.front = 0;
500 self.back = len;
501 }
502 }
503 }
504
505 unsafe { slice::from_raw_parts_mut(buffer_ptr.add(self.front), len) }
506 }
507
508 pub fn front(&self) -> Option<&T> {
510 if self.is_empty() {
511 None
512 } else {
513 Some(unsafe { &*self.buffer.borrow().get_unchecked(self.front).as_ptr() })
514 }
515 }
516
517 pub fn front_mut(&mut self) -> Option<&mut T> {
519 if self.is_empty() {
520 None
521 } else {
522 Some(unsafe {
523 &mut *self
524 .buffer
525 .borrow_mut()
526 .get_unchecked_mut(self.front)
527 .as_mut_ptr()
528 })
529 }
530 }
531
532 pub fn back(&self) -> Option<&T> {
534 if self.is_empty() {
535 None
536 } else {
537 let index = self.decrement(self.back);
538 Some(unsafe { &*self.buffer.borrow().get_unchecked(index).as_ptr() })
539 }
540 }
541
542 pub fn back_mut(&mut self) -> Option<&mut T> {
544 if self.is_empty() {
545 None
546 } else {
547 let index = self.decrement(self.back);
548 Some(unsafe {
549 &mut *self
550 .buffer
551 .borrow_mut()
552 .get_unchecked_mut(index)
553 .as_mut_ptr()
554 })
555 }
556 }
557
558 pub fn pop_front(&mut self) -> Option<T> {
560 if self.is_empty() {
561 None
562 } else {
563 Some(unsafe { self.pop_front_unchecked() })
564 }
565 }
566
567 pub fn pop_back(&mut self) -> Option<T> {
569 if self.is_empty() {
570 None
571 } else {
572 Some(unsafe { self.pop_back_unchecked() })
573 }
574 }
575
576 pub fn push_front(&mut self, item: T) -> Result<(), T> {
580 if self.is_full() {
581 Err(item)
582 } else {
583 unsafe { self.push_front_unchecked(item) }
584 Ok(())
585 }
586 }
587
588 pub fn push_back(&mut self, item: T) -> Result<(), T> {
592 if self.is_full() {
593 Err(item)
594 } else {
595 unsafe { self.push_back_unchecked(item) }
596 Ok(())
597 }
598 }
599
600 pub unsafe fn pop_front_unchecked(&mut self) -> T {
607 debug_assert!(!self.is_empty());
608
609 let index = self.front;
610 self.full = false;
611 self.front = self.increment(self.front);
612 self.buffer
613 .borrow_mut()
614 .get_unchecked_mut(index)
615 .as_ptr()
616 .read()
617 }
618
619 pub unsafe fn pop_back_unchecked(&mut self) -> T {
626 debug_assert!(!self.is_empty());
627
628 self.full = false;
629 self.back = self.decrement(self.back);
630 self.buffer
631 .borrow_mut()
632 .get_unchecked_mut(self.back)
633 .as_ptr()
634 .read()
635 }
636
637 pub unsafe fn push_front_unchecked(&mut self, item: T) {
643 debug_assert!(!self.is_full());
644
645 let index = self.decrement(self.front);
646 *self.buffer.borrow_mut().get_unchecked_mut(index) = MaybeUninit::new(item);
649 self.front = index;
650 if self.front == self.back {
651 self.full = true;
652 }
653 }
654
655 pub unsafe fn push_back_unchecked(&mut self, item: T) {
661 debug_assert!(!self.is_full());
662
663 *self.buffer.borrow_mut().get_unchecked_mut(self.back) = MaybeUninit::new(item);
666 self.back = self.increment(self.back);
667 if self.front == self.back {
668 self.full = true;
669 }
670 }
671
672 pub fn get(&self, index: usize) -> Option<&T> {
676 if index < self.storage_len() {
677 let idx = self.to_physical_index(index);
678 Some(unsafe { self.buffer.borrow().get_unchecked(idx).assume_init_ref() })
679 } else {
680 None
681 }
682 }
683
684 pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
688 if index < self.storage_len() {
689 let idx = self.to_physical_index(index);
690 Some(unsafe {
691 self.buffer
692 .borrow_mut()
693 .get_unchecked_mut(idx)
694 .assume_init_mut()
695 })
696 } else {
697 None
698 }
699 }
700
701 pub unsafe fn get_unchecked(&self, index: usize) -> &T {
707 debug_assert!(index < self.storage_len());
708
709 let idx = self.to_physical_index(index);
710 self.buffer.borrow().get_unchecked(idx).assume_init_ref()
711 }
712
713 pub unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T {
719 debug_assert!(index < self.storage_len());
720
721 let idx = self.to_physical_index(index);
722 self.buffer
723 .borrow_mut()
724 .get_unchecked_mut(idx)
725 .assume_init_mut()
726 }
727
728 pub fn swap(&mut self, i: usize, j: usize) {
734 let len = self.storage_len();
735 assert!(i < len);
736 assert!(j < len);
737 unsafe { self.swap_unchecked(i, j) }
738 }
739
740 pub unsafe fn swap_unchecked(&mut self, i: usize, j: usize) {
746 debug_assert!(i < self.storage_len());
747 debug_assert!(j < self.storage_len());
748 let idx_i = self.to_physical_index(i);
749 let idx_j = self.to_physical_index(j);
750
751 let buffer = self.buffer.borrow_mut();
752 let buffer_ptr = buffer.as_mut_ptr();
753 let ptr_i = buffer_ptr.add(idx_i);
754 let ptr_j = buffer_ptr.add(idx_j);
755 ptr::swap(ptr_i, ptr_j);
756 }
757
758 pub fn swap_remove_front(&mut self, index: usize) -> Option<T> {
767 let len = self.storage_len();
768 if len > 0 && index < len {
769 Some(unsafe {
770 self.swap_unchecked(index, 0);
771 self.pop_front_unchecked()
772 })
773 } else {
774 None
775 }
776 }
777
778 pub fn swap_remove_back(&mut self, index: usize) -> Option<T> {
787 let len = self.storage_len();
788 if len > 0 && index < len {
789 Some(unsafe {
790 self.swap_unchecked(index, len - 1);
791 self.pop_back_unchecked()
792 })
793 } else {
794 None
795 }
796 }
797
798 fn to_physical_index(&self, index: usize) -> usize {
799 let mut res = self.front + index;
800 if res >= self.storage_capacity() {
801 res -= self.storage_capacity();
802 }
803 res
804 }
805
806 pub fn iter(&self) -> Iter<'_, T> {
808 let (start, end) = self.as_slices();
809 Iter {
810 inner: start.iter().chain(end),
811 }
812 }
813
814 pub fn iter_mut(&mut self) -> IterMut<'_, T> {
816 let (start, end) = self.as_mut_slices();
817 IterMut {
818 inner: start.iter_mut().chain(end),
819 }
820 }
821
822 pub fn truncate(&mut self, len: usize) {
841 struct Dropper<'a, T>(&'a mut [T]);
844
845 impl<'a, T> Drop for Dropper<'a, T> {
846 fn drop(&mut self) {
847 unsafe {
848 ptr::drop_in_place(self.0);
849 }
850 }
851 }
852
853 unsafe {
860 if len >= self.storage_len() {
862 return;
863 }
864
865 let (front, back) = self.as_mut_slices();
866
867 if len > front.len() {
871 let begin = len - front.len();
872 let drop_back = back.get_unchecked_mut(begin..) as *mut _;
873
874 self.back = self.to_physical_index(len);
879 self.full = false;
880
881 ptr::drop_in_place(drop_back);
882 } else {
883 let drop_back = back as *mut _;
886 let drop_front = front.get_unchecked_mut(len..) as *mut _;
887
888 self.back = self.to_physical_index(len);
889 self.full = false;
890
891 let _back_dropper = Dropper(&mut *drop_back);
895 ptr::drop_in_place(drop_front);
896 }
897 }
898 }
899
900 pub fn retain<F>(&mut self, mut f: F)
932 where
933 F: FnMut(&T) -> bool,
934 {
935 self.retain_mut(|elem| f(elem));
936 }
937
938 pub fn retain_mut<F>(&mut self, mut f: F)
962 where
963 F: FnMut(&mut T) -> bool,
964 {
965 let len = self.storage_len();
966 let mut idx = 0;
967 let mut cur = 0;
968
969 while cur < len {
971 let val = self
972 .get_mut(cur)
973 .expect("cur was checked to be less than deque's length");
974 if !f(val) {
975 cur += 1;
976 break;
977 }
978
979 cur += 1;
980 idx += 1;
981 }
982 while cur < len {
985 let val = self
986 .get_mut(cur)
987 .expect("cur was checked to be less than deque's length");
988 if !f(val) {
989 cur += 1;
990 continue;
991 }
992
993 self.swap(idx, cur);
994 cur += 1;
995 idx += 1;
996 }
997 if cur != idx {
999 self.truncate(idx);
1000 }
1001 }
1002}
1003
1004pub struct Iter<'a, T> {
1006 inner: core::iter::Chain<core::slice::Iter<'a, T>, core::slice::Iter<'a, T>>,
1007}
1008
1009pub struct IterMut<'a, T> {
1011 inner: core::iter::Chain<core::slice::IterMut<'a, T>, core::slice::IterMut<'a, T>>,
1012}
1013
1014impl<'a, T> Iterator for Iter<'a, T> {
1015 type Item = &'a T;
1016 #[inline]
1017 fn next(&mut self) -> Option<Self::Item> {
1018 self.inner.next()
1019 }
1020
1021 #[inline]
1022 fn size_hint(&self) -> (usize, Option<usize>) {
1023 self.inner.size_hint()
1024 }
1025}
1026
1027impl<T> DoubleEndedIterator for Iter<'_, T> {
1028 #[inline]
1029 fn next_back(&mut self) -> Option<Self::Item> {
1030 self.inner.next_back()
1031 }
1032}
1033
1034impl<T> ExactSizeIterator for Iter<'_, T> {}
1035impl<T> FusedIterator for Iter<'_, T> {}
1036
1037impl<'a, T> Iterator for IterMut<'a, T> {
1038 type Item = &'a mut T;
1039 #[inline]
1040 fn next(&mut self) -> Option<Self::Item> {
1041 self.inner.next()
1042 }
1043 #[inline]
1044 fn size_hint(&self) -> (usize, Option<usize>) {
1045 self.inner.size_hint()
1046 }
1047}
1048
1049impl<T> DoubleEndedIterator for IterMut<'_, T> {
1050 #[inline]
1051 fn next_back(&mut self) -> Option<Self::Item> {
1052 self.inner.next_back()
1053 }
1054}
1055
1056impl<T> ExactSizeIterator for IterMut<'_, T> {}
1057impl<T> FusedIterator for IterMut<'_, T> {}
1058
1059impl<T, const N: usize> Default for Deque<T, N> {
1062 fn default() -> Self {
1063 Self::new()
1064 }
1065}
1066
1067impl<T, S: VecStorage<T> + ?Sized> Drop for DequeInner<T, S> {
1068 fn drop(&mut self) {
1069 unsafe { self.drop_contents() }
1072 }
1073}
1074
1075impl<T: fmt::Debug, S: VecStorage<T> + ?Sized> fmt::Debug for DequeInner<T, S> {
1076 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1077 f.debug_list().entries(self).finish()
1078 }
1079}
1080
1081impl<T, S: VecStorage<T> + ?Sized> Extend<T> for DequeInner<T, S> {
1083 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
1084 for item in iter {
1085 self.push_back(item).ok().unwrap();
1086 }
1087 }
1088}
1089impl<'a, T: 'a + Copy, S: VecStorage<T> + ?Sized> Extend<&'a T> for DequeInner<T, S> {
1090 fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
1091 self.extend(iter.into_iter().copied());
1092 }
1093}
1094
1095#[derive(Clone)]
1099pub struct IntoIter<T, const N: usize> {
1100 deque: Deque<T, N>,
1101}
1102
1103impl<T, const N: usize> Iterator for IntoIter<T, N> {
1104 type Item = T;
1105 fn next(&mut self) -> Option<Self::Item> {
1106 self.deque.pop_front()
1107 }
1108 fn size_hint(&self) -> (usize, Option<usize>) {
1109 let len = self.len();
1110 (len, Some(len))
1111 }
1112}
1113impl<T, const N: usize> DoubleEndedIterator for IntoIter<T, N> {
1114 fn next_back(&mut self) -> Option<Self::Item> {
1115 self.deque.pop_back()
1116 }
1117}
1118impl<T, const N: usize> FusedIterator for IntoIter<T, N> {}
1119impl<T, const N: usize> ExactSizeIterator for IntoIter<T, N> {
1120 fn len(&self) -> usize {
1121 self.deque.len()
1122 }
1123}
1124
1125impl<T, const N: usize> IntoIterator for Deque<T, N> {
1126 type Item = T;
1127 type IntoIter = IntoIter<T, N>;
1128
1129 fn into_iter(self) -> Self::IntoIter {
1130 IntoIter { deque: self }
1131 }
1132}
1133
1134impl<'a, T, S: VecStorage<T> + ?Sized> IntoIterator for &'a DequeInner<T, S> {
1135 type Item = &'a T;
1136 type IntoIter = Iter<'a, T>;
1137
1138 fn into_iter(self) -> Self::IntoIter {
1139 self.iter()
1140 }
1141}
1142
1143impl<'a, T, S: VecStorage<T> + ?Sized> IntoIterator for &'a mut DequeInner<T, S> {
1144 type Item = &'a mut T;
1145 type IntoIter = IterMut<'a, T>;
1146
1147 fn into_iter(self) -> Self::IntoIter {
1148 self.iter_mut()
1149 }
1150}
1151
1152impl<T, const N: usize> Clone for Deque<T, N>
1153where
1154 T: Clone,
1155{
1156 fn clone(&self) -> Self {
1157 let mut res = Self::new();
1158 for i in self {
1159 unsafe { res.push_back_unchecked(i.clone()) }
1162 }
1163 res
1164 }
1165}
1166
1167impl<T: PartialEq, const N: usize> PartialEq for Deque<T, N> {
1168 fn eq(&self, other: &Self) -> bool {
1169 if self.len() != other.len() {
1170 return false;
1171 }
1172 let (sa, sb) = self.as_slices();
1173 let (oa, ob) = other.as_slices();
1174 match sa.len().cmp(&oa.len()) {
1175 Ordering::Equal => sa == oa && sb == ob,
1176 Ordering::Less => {
1177 let front = sa.len();
1183 let mid = oa.len() - front;
1184
1185 let (oa_front, oa_mid) = oa.split_at(front);
1186 let (sb_mid, sb_back) = sb.split_at(mid);
1187 debug_assert_eq!(sa.len(), oa_front.len());
1188 debug_assert_eq!(sb_mid.len(), oa_mid.len());
1189 debug_assert_eq!(sb_back.len(), ob.len());
1190 sa == oa_front && sb_mid == oa_mid && sb_back == ob
1191 }
1192 Ordering::Greater => {
1193 let front = oa.len();
1194 let mid = sa.len() - front;
1195
1196 let (sa_front, sa_mid) = sa.split_at(front);
1197 let (ob_mid, ob_back) = ob.split_at(mid);
1198 debug_assert_eq!(sa_front.len(), oa.len());
1199 debug_assert_eq!(sa_mid.len(), ob_mid.len());
1200 debug_assert_eq!(sb.len(), ob_back.len());
1201 sa_front == oa && sa_mid == ob_mid && sb == ob_back
1202 }
1203 }
1204 }
1205}
1206
1207impl<T: Eq, const N: usize> Eq for Deque<T, N> {}
1208
1209impl<T, const NS: usize, const ND: usize> TryFrom<[T; NS]> for Deque<T, ND> {
1210 type Error = (CapacityError, [T; NS]);
1224
1225 fn try_from(value: [T; NS]) -> Result<Self, Self::Error> {
1229 if NS > ND {
1230 return Err((CapacityError, value));
1231 }
1232
1233 let mut deq = Self::default();
1234 let value = ManuallyDrop::new(value);
1235
1236 unsafe {
1238 ptr::copy_nonoverlapping(
1239 value.as_ptr(),
1240 deq.buffer.buffer.as_mut_ptr().cast::<T>(),
1241 NS,
1242 );
1243 }
1244
1245 deq.front = 0;
1246 deq.back = NS;
1247 deq.full = NS == ND;
1248
1249 Ok(deq)
1250 }
1251}
1252
1253#[cfg(test)]
1254mod tests {
1255 use super::Deque;
1256 use crate::CapacityError;
1257 use static_assertions::assert_not_impl_any;
1258
1259 assert_not_impl_any!(Deque<*const (), 4>: Send);
1261
1262 #[test]
1263 fn static_new() {
1264 static mut _V: Deque<i32, 4> = Deque::new();
1265 }
1266
1267 #[test]
1268 fn stack_new() {
1269 let mut _v: Deque<i32, 4> = Deque::new();
1270 }
1271
1272 #[test]
1273 fn drop() {
1274 droppable!();
1275
1276 {
1277 let mut v: Deque<Droppable, 2> = Deque::new();
1278 v.push_back(Droppable::new()).ok().unwrap();
1279 v.push_back(Droppable::new()).ok().unwrap();
1280 v.pop_front().unwrap();
1281 }
1282
1283 assert_eq!(Droppable::count(), 0);
1284
1285 {
1286 let mut v: Deque<Droppable, 2> = Deque::new();
1287 v.push_back(Droppable::new()).ok().unwrap();
1288 v.push_back(Droppable::new()).ok().unwrap();
1289 }
1290
1291 assert_eq!(Droppable::count(), 0);
1292 {
1293 let mut v: Deque<Droppable, 2> = Deque::new();
1294 v.push_front(Droppable::new()).ok().unwrap();
1295 v.push_front(Droppable::new()).ok().unwrap();
1296 }
1297
1298 assert_eq!(Droppable::count(), 0);
1299 }
1300
1301 #[test]
1302 fn full() {
1303 let mut v: Deque<i32, 4> = Deque::new();
1304
1305 v.push_back(0).unwrap();
1306 v.push_front(1).unwrap();
1307 v.push_back(2).unwrap();
1308 v.push_back(3).unwrap();
1309
1310 assert!(v.push_front(4).is_err());
1311 assert!(v.push_back(4).is_err());
1312 assert!(v.is_full());
1313 }
1314
1315 #[test]
1316 fn empty() {
1317 let mut v: Deque<i32, 4> = Deque::new();
1318 assert!(v.is_empty());
1319
1320 v.push_back(0).unwrap();
1321 assert!(!v.is_empty());
1322
1323 v.push_front(1).unwrap();
1324 assert!(!v.is_empty());
1325
1326 v.pop_front().unwrap();
1327 v.pop_front().unwrap();
1328
1329 assert!(v.pop_front().is_none());
1330 assert!(v.pop_back().is_none());
1331 assert!(v.is_empty());
1332 }
1333
1334 #[test]
1335 fn front_back() {
1336 let mut v: Deque<i32, 4> = Deque::new();
1337 assert_eq!(v.front(), None);
1338 assert_eq!(v.front_mut(), None);
1339 assert_eq!(v.back(), None);
1340 assert_eq!(v.back_mut(), None);
1341
1342 v.push_back(4).unwrap();
1343 assert_eq!(v.front(), Some(&4));
1344 assert_eq!(v.front_mut(), Some(&mut 4));
1345 assert_eq!(v.back(), Some(&4));
1346 assert_eq!(v.back_mut(), Some(&mut 4));
1347
1348 v.push_front(3).unwrap();
1349 assert_eq!(v.front(), Some(&3));
1350 assert_eq!(v.front_mut(), Some(&mut 3));
1351 assert_eq!(v.back(), Some(&4));
1352 assert_eq!(v.back_mut(), Some(&mut 4));
1353
1354 v.pop_back().unwrap();
1355 assert_eq!(v.front(), Some(&3));
1356 assert_eq!(v.front_mut(), Some(&mut 3));
1357 assert_eq!(v.back(), Some(&3));
1358 assert_eq!(v.back_mut(), Some(&mut 3));
1359
1360 v.pop_front().unwrap();
1361 assert_eq!(v.front(), None);
1362 assert_eq!(v.front_mut(), None);
1363 assert_eq!(v.back(), None);
1364 assert_eq!(v.back_mut(), None);
1365 }
1366
1367 #[test]
1368 fn extend() {
1369 let mut v: Deque<i32, 4> = Deque::new();
1370 v.extend(&[1, 2, 3]);
1371 assert_eq!(v.pop_front().unwrap(), 1);
1372 assert_eq!(v.pop_front().unwrap(), 2);
1373 assert_eq!(*v.front().unwrap(), 3);
1374
1375 v.push_back(4).unwrap();
1376 v.extend(&[5, 6]);
1377 assert_eq!(v.pop_front().unwrap(), 3);
1378 assert_eq!(v.pop_front().unwrap(), 4);
1379 assert_eq!(v.pop_front().unwrap(), 5);
1380 assert_eq!(v.pop_front().unwrap(), 6);
1381 assert!(v.pop_front().is_none());
1382 }
1383
1384 #[test]
1385 #[should_panic]
1386 fn extend_panic() {
1387 let mut v: Deque<i32, 4> = Deque::new();
1388 v.extend(&[1, 2, 3, 4, 5]);
1390 }
1391
1392 #[test]
1393 fn iter() {
1394 let mut v: Deque<i32, 4> = Deque::new();
1395
1396 v.push_back(0).unwrap();
1397 v.push_back(1).unwrap();
1398 v.push_front(2).unwrap();
1399 v.push_front(3).unwrap();
1400 v.pop_back().unwrap();
1401 v.push_front(4).unwrap();
1402
1403 let mut items = v.iter();
1404
1405 assert_eq!(items.next(), Some(&4));
1406 assert_eq!(items.next(), Some(&3));
1407 assert_eq!(items.next(), Some(&2));
1408 assert_eq!(items.next(), Some(&0));
1409 assert_eq!(items.next(), None);
1410 }
1411
1412 #[test]
1413 fn iter_mut() {
1414 let mut v: Deque<i32, 4> = Deque::new();
1415
1416 v.push_back(0).unwrap();
1417 v.push_back(1).unwrap();
1418 v.push_front(2).unwrap();
1419 v.push_front(3).unwrap();
1420 v.pop_back().unwrap();
1421 v.push_front(4).unwrap();
1422
1423 let mut items = v.iter_mut();
1424
1425 assert_eq!(items.next(), Some(&mut 4));
1426 assert_eq!(items.next(), Some(&mut 3));
1427 assert_eq!(items.next(), Some(&mut 2));
1428 assert_eq!(items.next(), Some(&mut 0));
1429 assert_eq!(items.next(), None);
1430 }
1431
1432 #[test]
1433 fn iter_move() {
1434 let mut v: Deque<i32, 4> = Deque::new();
1435 v.push_back(0).unwrap();
1436 v.push_back(1).unwrap();
1437 v.push_back(2).unwrap();
1438 v.push_back(3).unwrap();
1439
1440 let mut items = v.into_iter();
1441
1442 assert_eq!(items.next(), Some(0));
1443 assert_eq!(items.next(), Some(1));
1444 assert_eq!(items.next(), Some(2));
1445 assert_eq!(items.next(), Some(3));
1446 assert_eq!(items.next(), None);
1447 }
1448
1449 #[test]
1450 fn iter_move_back() {
1451 let mut v: Deque<i32, 4> = Deque::new();
1452
1453 v.push_back(0).unwrap();
1454 v.push_back(1).unwrap();
1455 v.push_back(2).unwrap();
1456 v.push_back(3).unwrap();
1457
1458 let mut items = v.into_iter();
1459 assert_eq!(items.next_back(), Some(3));
1460 assert_eq!(items.next_back(), Some(2));
1461 assert_eq!(items.next_back(), Some(1));
1462 assert_eq!(items.next_back(), Some(0));
1463 assert_eq!(items.next_back(), None);
1464 }
1465
1466 #[test]
1467 fn iter_move_len() {
1468 let mut v: Deque<i32, 3> = Deque::new();
1469
1470 v.push_back(0).unwrap();
1471 v.push_back(1).unwrap();
1472 v.push_back(2).unwrap();
1473
1474 let mut items = v.into_iter();
1475 assert_eq!(items.len(), 3);
1476 let _ = items.next();
1477 assert_eq!(items.len(), 2);
1478 let _ = items.next_back();
1479 assert_eq!(items.len(), 1);
1480 let _ = items.next();
1481 assert_eq!(items.len(), 0);
1482 }
1483
1484 #[test]
1485 fn iter_move_drop() {
1486 droppable!();
1487
1488 {
1489 let mut deque: Deque<Droppable, 2> = Deque::new();
1490 deque.push_back(Droppable::new()).ok().unwrap();
1491 deque.push_back(Droppable::new()).ok().unwrap();
1492 let mut items = deque.into_iter();
1493 let _ = items.next();
1495 let _ = items.next();
1496 }
1497
1498 assert_eq!(Droppable::count(), 0);
1499
1500 {
1501 let mut deque: Deque<Droppable, 2> = Deque::new();
1502 deque.push_back(Droppable::new()).ok().unwrap();
1503 deque.push_back(Droppable::new()).ok().unwrap();
1504 let _items = deque.into_iter();
1505 }
1507
1508 assert_eq!(Droppable::count(), 0);
1509
1510 {
1511 let mut deque: Deque<Droppable, 2> = Deque::new();
1512 deque.push_back(Droppable::new()).ok().unwrap();
1513 deque.push_back(Droppable::new()).ok().unwrap();
1514 let mut items = deque.into_iter();
1515 let _ = items.next(); }
1517
1518 assert_eq!(Droppable::count(), 0);
1519 }
1520
1521 #[test]
1522 fn push_and_pop() {
1523 let mut q: Deque<i32, 4> = Deque::new();
1524 assert_eq!(q.len(), 0);
1525
1526 assert_eq!(q.pop_front(), None);
1527 assert_eq!(q.pop_back(), None);
1528 assert_eq!(q.len(), 0);
1529
1530 q.push_back(0).unwrap();
1531 assert_eq!(q.len(), 1);
1532
1533 assert_eq!(q.pop_back(), Some(0));
1534 assert_eq!(q.len(), 0);
1535
1536 q.push_back(0).unwrap();
1537 q.push_back(1).unwrap();
1538 q.push_front(2).unwrap();
1539 q.push_front(3).unwrap();
1540 assert_eq!(q.len(), 4);
1541
1542 assert_eq!(q.pop_front(), Some(3));
1544 assert_eq!(q.len(), 3);
1545 assert_eq!(q.pop_front(), Some(2));
1546 assert_eq!(q.len(), 2);
1547 assert_eq!(q.pop_back(), Some(1));
1548 assert_eq!(q.len(), 1);
1549 assert_eq!(q.pop_front(), Some(0));
1550 assert_eq!(q.len(), 0);
1551
1552 assert_eq!(q.pop_front(), None);
1554 assert_eq!(q.pop_back(), None);
1555 assert_eq!(q.len(), 0);
1556 }
1557
1558 #[test]
1559 fn as_slices() {
1560 let mut q: Deque<i32, 4> = Deque::new();
1561 assert_eq!(q.len(), 0);
1562
1563 q.push_back(0).unwrap();
1564 q.push_back(1).unwrap();
1565 q.push_back(2).unwrap();
1566 q.push_back(3).unwrap();
1567 assert_eq!(q.as_slices(), (&[0, 1, 2, 3][..], &[][..]));
1568
1569 q.pop_front().unwrap();
1570 assert_eq!(q.as_slices(), (&[1, 2, 3][..], &[][..]));
1571
1572 q.push_back(4).unwrap();
1573 assert_eq!(q.as_slices(), (&[1, 2, 3][..], &[4][..]));
1574 }
1575
1576 #[test]
1577 fn clear() {
1578 let mut q: Deque<i32, 4> = Deque::new();
1579 assert_eq!(q.len(), 0);
1580
1581 q.push_back(0).unwrap();
1582 q.push_back(1).unwrap();
1583 q.push_back(2).unwrap();
1584 q.push_back(3).unwrap();
1585 assert_eq!(q.len(), 4);
1586
1587 q.clear();
1588 assert_eq!(q.len(), 0);
1589
1590 q.push_back(0).unwrap();
1591 assert_eq!(q.len(), 1);
1592 }
1593
1594 #[test]
1595 fn make_contiguous() {
1596 let mut q: Deque<i32, 4> = Deque::new();
1597 assert_eq!(q.len(), 0);
1598
1599 q.push_back(0).unwrap();
1600 q.push_back(1).unwrap();
1601 q.push_back(2).unwrap();
1602 q.push_back(3).unwrap();
1603
1604 assert_eq!(q.pop_front(), Some(0));
1606 assert_eq!(q.pop_front(), Some(1));
1607
1608 q.push_back(4).unwrap();
1610
1611 assert_eq!(q.as_slices(), ([2, 3].as_slice(), [4].as_slice()));
1613
1614 assert_eq!(q.make_contiguous(), &[2, 3, 4]);
1615
1616 assert_eq!(q.as_slices(), ([2, 3, 4].as_slice(), [].as_slice()));
1618
1619 assert_eq!(q.pop_front(), Some(2));
1620 assert_eq!(q.pop_front(), Some(3));
1621 q.push_back(5).unwrap();
1622 q.push_back(6).unwrap();
1623
1624 assert_eq!(q.as_slices(), ([4].as_slice(), [5, 6].as_slice()));
1626
1627 assert_eq!(q.make_contiguous(), &[4, 5, 6]);
1628
1629 assert_eq!(q.as_slices(), ([4, 5, 6].as_slice(), [].as_slice()));
1631
1632 assert_eq!(q.pop_front(), Some(4));
1633 q.push_back(7).unwrap();
1634 q.push_back(8).unwrap();
1635
1636 assert_eq!(q.as_slices(), ([5, 6, 7].as_slice(), [8].as_slice()));
1638
1639 assert_eq!(q.make_contiguous(), &[5, 6, 7, 8]);
1640
1641 assert_eq!(q.as_slices(), ([5, 6, 7, 8].as_slice(), [].as_slice()));
1643 }
1644
1645 #[test]
1646 fn get() {
1647 let mut q: Deque<i32, 4> = Deque::new();
1648 assert_eq!(q.get(0), None);
1649
1650 q.push_back(0).unwrap();
1651 assert_eq!(q.get(0), Some(&0));
1652 assert_eq!(q.get(1), None);
1653
1654 q.push_back(1).unwrap();
1655 assert_eq!(q.get(0), Some(&0));
1656 assert_eq!(q.get(1), Some(&1));
1657 assert_eq!(q.get(2), None);
1658
1659 q.pop_front().unwrap();
1660 assert_eq!(q.get(0), Some(&1));
1661 assert_eq!(q.get(1), None);
1662
1663 q.push_back(2).unwrap();
1664 q.push_back(3).unwrap();
1665 q.push_back(4).unwrap();
1666 assert_eq!(q.get(0), Some(&1));
1667 assert_eq!(q.get(1), Some(&2));
1668 assert_eq!(q.get(2), Some(&3));
1669 assert_eq!(q.get(3), Some(&4));
1670 }
1671
1672 #[test]
1673 fn get_mut() {
1674 let mut q: Deque<i32, 4> = Deque::new();
1675 assert_eq!(q.get(0), None);
1676
1677 q.push_back(0).unwrap();
1678 assert_eq!(q.get_mut(0), Some(&mut 0));
1679 assert_eq!(q.get_mut(1), None);
1680
1681 q.push_back(1).unwrap();
1682 assert_eq!(q.get_mut(0), Some(&mut 0));
1683 assert_eq!(q.get_mut(1), Some(&mut 1));
1684 assert_eq!(q.get_mut(2), None);
1685 *q.get_mut(0).unwrap() = 42;
1686 *q.get_mut(1).unwrap() = 43;
1687
1688 assert_eq!(q.pop_front(), Some(42));
1689 assert_eq!(q.pop_front(), Some(43));
1690 assert_eq!(q.pop_front(), None);
1691 }
1692
1693 #[test]
1694 fn swap() {
1695 let mut q: Deque<i32, 4> = Deque::new();
1696 q.push_back(40).unwrap();
1697 q.push_back(41).unwrap();
1698 q.push_back(42).unwrap();
1699 q.pop_front().unwrap();
1700 q.push_back(43).unwrap();
1701 assert_eq!(*q.get(0).unwrap(), 41);
1702 assert_eq!(*q.get(1).unwrap(), 42);
1703 assert_eq!(*q.get(2).unwrap(), 43);
1704
1705 q.swap(0, 1);
1706 assert_eq!(*q.get(0).unwrap(), 42);
1707 assert_eq!(*q.get(1).unwrap(), 41);
1708 assert_eq!(*q.get(2).unwrap(), 43);
1709
1710 q.swap(1, 2);
1711 assert_eq!(*q.get(0).unwrap(), 42);
1712 assert_eq!(*q.get(1).unwrap(), 43);
1713 assert_eq!(*q.get(2).unwrap(), 41);
1714
1715 q.swap(1, 1);
1716 assert_eq!(*q.get(0).unwrap(), 42);
1717 assert_eq!(*q.get(1).unwrap(), 43);
1718 assert_eq!(*q.get(2).unwrap(), 41);
1719 }
1720
1721 #[test]
1722 fn swap_remove_front() {
1723 let mut q: Deque<i32, 4> = Deque::new();
1724 q.push_back(40).unwrap();
1725 q.push_back(41).unwrap();
1726 q.push_back(42).unwrap();
1727 q.push_back(43).unwrap();
1728
1729 assert_eq!(q.swap_remove_front(2), Some(42));
1730 assert_eq!(q.swap_remove_front(1), Some(40));
1731 assert_eq!(q.swap_remove_front(0), Some(41));
1732 assert_eq!(q.swap_remove_front(1), None);
1733 assert_eq!(q.swap_remove_front(4), None);
1734 assert_eq!(q.swap_remove_front(6), None);
1735 assert_eq!(q.swap_remove_front(0), Some(43));
1736 }
1737
1738 #[test]
1739 fn swap_remove_back() {
1740 let mut q: Deque<i32, 4> = Deque::new();
1741 q.push_back(40).unwrap();
1742 q.push_back(41).unwrap();
1743 q.push_back(42).unwrap();
1744 q.push_back(43).unwrap();
1745 q.pop_front().unwrap();
1746 q.push_back(44).unwrap();
1747
1748 assert_eq!(q.swap_remove_back(1), Some(42));
1749 assert_eq!(q.swap_remove_front(1), Some(44));
1750 assert_eq!(q.swap_remove_front(0), Some(41));
1751 assert_eq!(q.swap_remove_front(1), None);
1752 assert_eq!(q.swap_remove_front(4), None);
1753 assert_eq!(q.swap_remove_front(6), None);
1754 assert_eq!(q.swap_remove_front(0), Some(43));
1755 }
1756
1757 #[test]
1758 #[should_panic = "i < len"]
1759 fn swap_i_out_of_bounds() {
1760 let mut q: Deque<i32, 4> = Deque::new();
1761 q.push_back(40).unwrap();
1762 q.push_back(41).unwrap();
1763 q.push_back(42).unwrap();
1764 q.pop_front().unwrap();
1765 q.swap(2, 0);
1766 }
1767
1768 #[test]
1769 #[should_panic = "j < len"]
1770 fn swap_j_out_of_bounds() {
1771 let mut q: Deque<i32, 4> = Deque::new();
1772 q.push_back(40).unwrap();
1773 q.push_back(41).unwrap();
1774 q.push_back(42).unwrap();
1775 q.pop_front().unwrap();
1776 q.swap(0, 2);
1777 }
1778
1779 #[test]
1780 fn equality() {
1781 let mut a: Deque<i32, 7> = Deque::new();
1782 let mut b: Deque<i32, 7> = Deque::new();
1783
1784 assert_eq!(a, b);
1785
1786 a.push_back(1).unwrap();
1787 a.push_back(2).unwrap();
1788 a.push_back(3).unwrap();
1789
1790 assert_ne!(a, b);
1791
1792 b.push_back(1).unwrap();
1793 b.push_back(2).unwrap();
1794 b.push_back(3).unwrap();
1795
1796 assert_eq!(a, b);
1797
1798 a.push_back(1).unwrap();
1799 a.push_back(2).unwrap();
1800 a.push_back(3).unwrap();
1801
1802 assert_ne!(a, b);
1803
1804 b.push_front(3).unwrap();
1805 b.push_front(2).unwrap();
1806 b.push_front(1).unwrap();
1807
1808 assert_eq!(a, b);
1809
1810 a.push_back(4).unwrap();
1811 b.push_back(4).unwrap();
1812
1813 assert_eq!(a, b);
1814
1815 a.clear();
1816 b.clear();
1817
1818 a.push_back(1).unwrap();
1819 a.push_back(2).unwrap();
1820 a.push_back(3).unwrap();
1821 a.push_front(3).unwrap();
1822 a.push_front(2).unwrap();
1823 a.push_front(1).unwrap();
1824
1825 b.push_back(2).unwrap();
1826 b.push_back(3).unwrap();
1827 b.push_back(1).unwrap();
1828 b.push_back(2).unwrap();
1829 b.push_back(3).unwrap();
1830 b.push_front(1).unwrap();
1831
1832 assert_eq!(a, b);
1833 }
1834
1835 #[test]
1836 fn try_from_array() {
1837 assert!(matches!(
1839 Deque::<u8, 3>::try_from([1, 2, 3, 4]),
1840 Err((CapacityError, [1, 2, 3, 4]))
1841 ));
1842
1843 let deq1 = Deque::<u8, 3>::try_from([1, 2, 3]).unwrap();
1845 let mut deq2 = Deque::<u8, 3>::new();
1846 deq2.push_back(1).unwrap();
1847 deq2.push_back(2).unwrap();
1848 deq2.push_back(3).unwrap();
1849 assert!(deq1.is_full());
1850 assert_eq!(deq1, deq2);
1851
1852 let deq1 = Deque::<u8, 8>::try_from([1, 2, 3, 4]).unwrap();
1854 let mut deq2 = Deque::<u8, 8>::new();
1855 deq2.push_back(1).unwrap();
1856 deq2.push_back(2).unwrap();
1857 deq2.push_back(3).unwrap();
1858 deq2.push_back(4).unwrap();
1859
1860 assert!(!deq1.is_full());
1861 assert_eq!(deq1, deq2);
1862 }
1863
1864 #[test]
1865 fn try_from_array_with_zst() {
1866 #[derive(Debug, PartialEq, Copy, Clone)]
1867 struct ZeroSizedType;
1868
1869 let deq1 =
1871 Deque::<ZeroSizedType, 5>::try_from([ZeroSizedType, ZeroSizedType, ZeroSizedType])
1872 .unwrap();
1873 let mut deq2 = Deque::<ZeroSizedType, 5>::new();
1874 deq2.push_back(ZeroSizedType).unwrap();
1875 deq2.push_back(ZeroSizedType).unwrap();
1876 deq2.push_back(ZeroSizedType).unwrap();
1877
1878 assert_eq!(deq1, deq2);
1879 assert_eq!(deq1.len(), 3);
1880 }
1881
1882 #[test]
1883 fn try_from_array_drop() {
1884 droppable!();
1885
1886 {
1888 let _result = Deque::<Droppable, 2>::try_from([
1889 Droppable::new(),
1890 Droppable::new(),
1891 Droppable::new(),
1892 ]);
1893 }
1894
1895 assert_eq!(Droppable::count(), 0);
1896
1897 {
1899 let _result = Deque::<Droppable, 3>::try_from([
1900 Droppable::new(),
1901 Droppable::new(),
1902 Droppable::new(),
1903 ]);
1904 }
1905
1906 assert_eq!(Droppable::count(), 0);
1907
1908 {
1910 let _result = Deque::<Droppable, 4>::try_from([
1911 Droppable::new(),
1912 Droppable::new(),
1913 Droppable::new(),
1914 ]);
1915 }
1916
1917 assert_eq!(Droppable::count(), 0);
1918 }
1919
1920 #[test]
1921 #[cfg(feature = "zeroize")]
1922 fn test_deque_zeroize() {
1923 use zeroize::Zeroize;
1924
1925 let mut deque = Deque::<u8, 16>::new();
1926
1927 for i in 1..=8 {
1928 deque.push_back(i).unwrap();
1929 }
1930 for i in 9..=16 {
1931 deque.push_front(i).unwrap();
1932 }
1933
1934 assert_eq!(deque.len(), 16);
1935 assert_eq!(deque.front(), Some(&16));
1936 assert_eq!(deque.back(), Some(&8));
1937
1938 deque.zeroize();
1940
1941 assert_eq!(deque.len(), 0);
1942 assert!(deque.is_empty());
1943 }
1944
1945 #[test]
1947 fn truncate_empty() {
1948 droppable!();
1949
1950 const LEN: usize = 1;
1951 let mut tester: Deque<_, LEN> = Deque::new();
1952
1953 tester.truncate(0);
1955 assert_eq!(tester.len(), 0);
1956 assert_eq!(Droppable::count(), 0);
1957
1958 tester.truncate(123);
1960 assert_eq!(tester.len(), 0);
1961 assert_eq!(Droppable::count(), 0);
1962
1963 assert!(tester.push_front(Droppable::new()).is_ok());
1965 assert_eq!(tester.len(), 1);
1966 assert_eq!(Droppable::count(), 1);
1967
1968 tester.truncate(0);
1970 assert_eq!(tester.len(), 0);
1971 assert_eq!(Droppable::count(), 0);
1972 }
1973
1974 #[test]
1976 fn truncate_contiguous() {
1977 droppable!();
1978
1979 fn slice_lengths<T>(slices: (&[T], &[T])) -> (usize, usize) {
1980 let (a, b) = slices;
1981 (a.len(), b.len())
1982 }
1983
1984 const LEN: usize = 20;
1985 let mut tester: Deque<_, LEN> = Deque::new();
1986
1987 for _ in 0..5 {
1989 assert!(tester.push_front(Droppable::new()).is_ok());
1990 }
1991
1992 tester.truncate(10);
1994 let lens = slice_lengths(tester.as_slices());
1995 assert_eq!(lens, (5, 0));
1996 assert_eq!(Droppable::count(), 5);
1997
1998 tester.truncate(5);
2000 let lens = slice_lengths(tester.as_slices());
2001 assert_eq!(lens, (5, 0));
2002 assert_eq!(Droppable::count(), 5);
2003
2004 tester.truncate(0);
2006 assert_eq!(tester.len(), 0);
2007 assert_eq!(Droppable::count(), 0);
2008
2009 for _ in 0..5 {
2011 assert!(tester.push_front(Droppable::new()).is_ok());
2012 }
2013
2014 let lens = slice_lengths(tester.as_slices());
2015 assert_eq!(lens, (5, 0));
2016 assert_eq!(Droppable::count(), 5);
2017
2018 tester.truncate(3);
2020 let lens = slice_lengths(tester.as_slices());
2021 assert_eq!(lens, (3, 0));
2022 assert_eq!(Droppable::count(), 3);
2023
2024 tester.truncate(0);
2026 assert_eq!(tester.len(), 0);
2027 assert_eq!(Droppable::count(), 0);
2028
2029 tester.clear();
2031
2032 for _ in 0..5 {
2034 assert!(tester.push_back(Droppable::new()).is_ok());
2035 }
2036
2037 tester.truncate(10);
2038 let lens = slice_lengths(tester.as_slices());
2039 assert_eq!(lens, (5, 0));
2040 assert_eq!(Droppable::count(), 5);
2041
2042 tester.truncate(5);
2043 let lens = slice_lengths(tester.as_slices());
2044 assert_eq!(lens, (5, 0));
2045 assert_eq!(Droppable::count(), 5);
2046
2047 tester.truncate(0);
2048 assert_eq!(tester.len(), 0);
2049 assert_eq!(Droppable::count(), 0);
2050
2051 for _ in 0..5 {
2052 assert!(tester.push_back(Droppable::new()).is_ok());
2053 }
2054
2055 let lens = slice_lengths(tester.as_slices());
2056 assert_eq!(lens, (5, 0));
2057 assert_eq!(Droppable::count(), 5);
2058
2059 tester.truncate(3);
2060 let lens = slice_lengths(tester.as_slices());
2061 assert_eq!(lens, (3, 0));
2062 assert_eq!(Droppable::count(), 3);
2063
2064 tester.truncate(0);
2065 assert_eq!(tester.len(), 0);
2066 assert_eq!(Droppable::count(), 0);
2067 }
2068
2069 #[test]
2071 fn truncate_non_contiguous() {
2072 const LEN: usize = 20;
2073 let mut tester: Deque<u8, LEN> = Deque::new();
2074
2075 for x in 1..=3 {
2079 assert!(tester.push_front(x).is_ok());
2080 }
2081 for y in 1..=3 {
2082 assert!(tester.push_back(y).is_ok());
2083 }
2084
2085 tester.truncate(10);
2087 assert_eq!(tester.as_slices(), (&[3, 2, 1][..], &[1, 2, 3][..]));
2088 println!("{} {}", tester.front, tester.back);
2089 tester.truncate(6);
2091 assert_eq!(tester.as_slices(), (&[3, 2, 1][..], &[1, 2, 3][..]));
2092
2093 tester.truncate(0);
2095 assert_eq!(tester.as_slices(), (&[][..], &[][..]));
2096
2097 tester.clear();
2099
2100 for x in 1..=3 {
2102 assert!(tester.push_front(x).is_ok());
2103 }
2104 for y in 1..=3 {
2105 assert!(tester.push_back(y).is_ok());
2106 }
2107
2108 assert_eq!(tester.as_slices(), (&[3, 2, 1][..], &[1, 2, 3][..]));
2109
2110 tester.truncate(5);
2112 assert_eq!(tester.as_slices(), (&[3, 2, 1][..], &[1, 2][..]));
2113
2114 assert!(tester.push_back(3).is_ok());
2116 assert_eq!(tester.as_slices(), (&[3, 2, 1][..], &[1, 2, 3][..]));
2117
2118 tester.truncate(3);
2120 assert_eq!(tester.as_slices(), (&[3, 2, 1][..], &[][..]));
2121
2122 for y in 1..=3 {
2124 assert!(tester.push_back(y).is_ok());
2125 }
2126 assert_eq!(tester.as_slices(), (&[3, 2, 1][..], &[1, 2, 3][..]));
2127
2128 tester.truncate(2);
2130 assert_eq!(tester.as_slices(), (&[3, 2][..], &[][..]));
2131
2132 tester.truncate(0);
2134 assert_eq!(tester.as_slices(), (&[][..], &[][..]));
2135
2136 tester.truncate(123);
2138 assert_eq!(tester.as_slices(), (&[][..], &[][..]));
2139 }
2140
2141 #[test]
2143 fn truncate_drop_count() {
2144 droppable!();
2145
2146 const LEN: usize = 20;
2147 const TRUNC: usize = 3;
2148 for push_front_amt in 0..=LEN {
2149 let mut tester: Deque<_, LEN> = Deque::new();
2150 for index in 0..LEN {
2151 if index < push_front_amt {
2152 assert!(
2153 tester.push_front(Droppable::new()).is_ok(),
2154 "deque must have room for all {LEN} entries"
2155 );
2156 } else {
2157 assert!(
2158 tester.push_back(Droppable::new()).is_ok(),
2159 "deque must have room for all {LEN} entries"
2160 );
2161 }
2162 }
2163
2164 assert_eq!(Droppable::count(), LEN as i32);
2165
2166 tester.truncate(TRUNC);
2167 assert_eq!(tester.len(), TRUNC);
2168 assert_eq!(Droppable::count(), TRUNC as i32);
2169
2170 tester.truncate(0);
2171 assert_eq!(tester.len(), 0);
2172 assert_eq!(Droppable::count(), 0);
2173 }
2174 }
2175
2176 #[test]
2177 fn retain() {
2178 droppable!();
2179
2180 const LEN: usize = 20;
2181 for push_front_amt in 0..=LEN {
2182 let mut tester: Deque<_, LEN> = Deque::new();
2183 for index in 0..LEN {
2184 if index < push_front_amt {
2185 assert!(tester.push_front((index, Droppable::new())).is_ok());
2186 } else {
2187 assert!(tester.push_back((index, Droppable::new())).is_ok());
2188 }
2189 }
2190 assert_eq!(Droppable::count(), LEN as i32);
2191
2192 tester.retain(|(x, _)| *x >= 10);
2193
2194 assert_eq!(tester.len(), 10);
2195 assert_eq!(Droppable::count(), 10);
2196 }
2197 }
2198}