1#![cfg_attr(not(any(feature = "std", test)), no_std)]
2#![warn(missing_docs)]
3#![doc(test(attr(deny(warnings))))]
4
5extern crate alloc;
48
49use alloc::vec::Vec;
50use core::cmp::Ordering;
51use core::fmt::Debug;
52use core::hash::Hash;
53use core::marker::PhantomData;
54use core::ops::{Bound, Deref, DerefMut, RangeBounds};
55use core::ptr;
56use core::{cmp, mem};
57#[cfg(feature = "std")]
58use std::io::{Read, Write};
59
60use buffer::Buffer;
61use iter::RawValIter;
62
63mod buffer;
64mod iter;
65
66#[cfg(test)]
67mod drop_tracker;
68
69pub struct LinearDeque<T> {
83 buf: Buffer<T>,
84 len: usize,
85 off: usize,
86}
87
88unsafe impl<T: Send> Send for LinearDeque<T> {}
89unsafe impl<T: Sync> Sync for LinearDeque<T> {}
90
91impl<T> LinearDeque<T> {
92 fn ptr(&self) -> *mut T {
93 self.buf.ptr.as_ptr()
94 }
95
96 fn cap(&self) -> usize {
97 self.buf.cap
98 }
99
100 #[must_use]
110 pub fn new() -> Self {
111 Self::with_reserved_space(0, 0)
112 }
113
114 #[must_use]
128 pub fn with_reserved_space(front: usize, back: usize) -> Self {
129 let mut buf = Buffer::new();
130
131 let cap = front + back;
132 if cap > 0 && !is_zst::<T>() {
133 buf.realloc(cap);
134 }
135
136 LinearDeque {
137 buf,
138 len: 0,
139 off: front,
140 }
141 }
142
143 #[must_use]
159 pub fn front(&self) -> Option<&T> {
160 self.first()
161 }
162
163 pub fn front_mut(&mut self) -> Option<&mut T> {
183 self.first_mut()
184 }
185
186 #[must_use]
202 pub fn back(&self) -> Option<&T> {
203 self.last()
204 }
205
206 pub fn back_mut(&mut self) -> Option<&mut T> {
226 self.last_mut()
227 }
228
229 pub fn push_front(&mut self, elem: T) {
242 if !is_zst::<T>() {
243 self.ensure_reserved_front_space(1);
244 unsafe {
245 self.off -= 1;
246 ptr::write(self.ptr().add(self.off), elem);
247 }
248 }
249 self.len += 1;
250 }
251
252 pub fn push_back(&mut self, elem: T) {
265 self.ensure_reserved_back_space(1);
266 unsafe {
267 ptr::write(self.ptr().add(self.off + self.len), elem);
268 }
269
270 self.len += 1;
271 }
272
273 pub fn pop_front(&mut self) -> Option<T> {
290 if self.len == 0 {
291 None
292 } else {
293 self.len -= 1;
294 self.off += 1;
295 unsafe { Some(ptr::read(self.ptr().add(self.off - 1))) }
296 }
297 }
298
299 pub fn pop_back(&mut self) -> Option<T> {
314 if self.len == 0 {
315 None
316 } else {
317 self.len -= 1;
318 unsafe { Some(ptr::read(self.ptr().add(self.off + self.len))) }
319 }
320 }
321
322 pub fn insert(&mut self, index: usize, elem: T) {
350 assert!(index <= self.len, "index out of bounds");
351
352 if !is_zst::<T>() {
353 if 2 * index < self.len {
354 unsafe {
356 let pending_copy = self.prepare_reserved_front_space(1);
357 let (mut front_copy, back_copy) = pending_copy.split(index);
358 front_copy.dst -= 1;
359 back_copy.perform(self.ptr());
360 front_copy.perform(self.ptr());
361 self.off -= 1;
362 ptr::write(self.ptr().add(self.off + index), elem);
363 }
364 } else {
365 unsafe {
367 let pending_copy = self.prepare_reserved_back_space(1);
368 let (front_copy, mut back_copy) = pending_copy.split(index);
369 back_copy.dst += 1;
370 front_copy.perform(self.ptr());
371 back_copy.perform(self.ptr());
372 ptr::write(self.ptr().add(self.off + index), elem);
373 }
374 }
375 }
376 self.len += 1;
377 }
378
379 pub fn remove(&mut self, index: usize) -> Option<T> {
401 if index < self.len {
402 unsafe {
403 let start = self.ptr().add(self.off);
404 let result = ptr::read(start.add(index));
405
406 if index < self.len / 2 {
407 ptr::copy(start, start.add(1), index);
409 self.off += 1;
410 } else {
411 ptr::copy(start.add(index + 1), start.add(index), self.len - index - 1);
413 }
414 self.len -= 1;
415
416 Some(result)
417 }
418 } else {
419 None
420 }
421 }
422
423 pub fn drain<R>(&mut self, range: R) -> Drain<'_, T>
454 where
455 R: RangeBounds<usize>,
456 {
457 let start = match range.start_bound() {
458 Bound::Included(&start) => start,
459 Bound::Excluded(start) => start.checked_add(1).expect("invalid start index"),
460 Bound::Unbounded => 0,
461 };
462
463 let end = match range.end_bound() {
464 Bound::Included(end) => end.checked_add(1).expect("invalid end index"),
465 Bound::Excluded(&end) => end,
466 Bound::Unbounded => self.len,
467 };
468
469 assert!(!(start > end || end > self.len), "invalid range");
470
471 let iter = unsafe { RawValIter::new(&self[start..end]) };
472
473 let front_len = start;
474 let back_len = self.len - end;
475 let count = end - start;
476
477 let pending_copy = if front_len < back_len {
478 let prev_off = self.off;
479 self.off += count;
480 PendingCopy {
481 src: prev_off,
482 dst: prev_off + count,
483 count: front_len,
484 }
485 } else {
486 PendingCopy {
487 src: self.off + end,
488 dst: self.off + start,
489 count: back_len,
490 }
491 };
492
493 self.len -= count;
494
495 Drain {
496 iter,
497 pending_copy,
498 ptr: self.ptr(),
499 vec: PhantomData,
500 }
501 }
502
503 pub fn extend_at_front(&mut self, iter: impl IntoIterator<Item = T>) {
520 let iter = iter.into_iter();
521 let (lower, upper) = iter.size_hint();
522 let count = upper.unwrap_or(lower);
523 if count < usize::MAX {
524 self.ensure_reserved_front_space(count);
525 }
526 for elem in iter {
527 self.push_front(elem);
528 }
529 }
530
531 pub fn extend_at_back(&mut self, iter: impl IntoIterator<Item = T>) {
548 let iter = iter.into_iter();
549 let (lower, upper) = iter.size_hint();
550 let count = upper.unwrap_or(lower);
551 if count < usize::MAX {
552 self.ensure_reserved_back_space(count);
553 }
554 for elem in iter {
555 self.push_back(elem);
556 }
557 }
558
559 pub fn resize_at_front_with(&mut self, new_len: usize, mut f: impl FnMut() -> T) {
591 match new_len.cmp(&self.len) {
592 Ordering::Less => self.truncate_at_front(new_len),
593 Ordering::Equal => (),
594 Ordering::Greater => {
595 let count = new_len - self.len;
596 self.set_reserved_space(SetReservedSpace::GrowTo(count), SetReservedSpace::Keep);
597 self.extend_at_front(core::iter::from_fn(|| Some(f())).take(count));
598 }
599 }
600 }
601
602 pub fn resize_at_back_with(&mut self, new_len: usize, mut f: impl FnMut() -> T) {
634 match new_len.cmp(&self.len) {
635 Ordering::Less => self.truncate_at_back(new_len),
636 Ordering::Equal => (),
637 Ordering::Greater => {
638 let count = new_len - self.len;
639 self.set_reserved_space(SetReservedSpace::Keep, SetReservedSpace::GrowTo(count));
640 self.extend_at_back(core::iter::from_fn(|| Some(f())).take(count));
641 }
642 }
643 }
644
645 #[inline]
652 pub fn resize_with(&mut self, new_len: usize, f: impl FnMut() -> T) {
653 self.resize_at_back_with(new_len, f);
654 }
655
656 pub fn retain<F>(&mut self, mut f: F)
686 where
687 F: FnMut(&T) -> bool,
688 {
689 self.retain_mut(|x| f(x));
690 }
691
692 pub fn retain_mut<F>(&mut self, mut f: F)
713 where
714 F: FnMut(&mut T) -> bool,
715 {
716 unsafe {
717 let mut dropped_index_option = None;
718
719 let base = self.ptr().add(self.off);
720 for i in 0..self.len {
721 let p = base.add(i);
722 if f(&mut *p) {
723 if let Some(dropped_index) = dropped_index_option {
724 ptr::copy_nonoverlapping(p, base.add(dropped_index), 1);
725 dropped_index_option = Some(dropped_index + 1);
726 }
727 } else {
728 p.drop_in_place();
729 if dropped_index_option.is_none() {
730 dropped_index_option = Some(i);
731 }
732 }
733 }
734
735 if let Some(dropped_index) = dropped_index_option {
736 self.len = dropped_index;
737 }
738 }
739 }
740
741 pub fn truncate_at_front(&mut self, len: usize) {
761 if len < self.len {
762 unsafe {
763 let count = self.len() - len;
764 let front = self.get_unchecked_mut(..count);
765 ptr::drop_in_place(front);
766 self.off += count;
767 self.len = len;
768 }
769 }
770 }
771
772 pub fn truncate_at_back(&mut self, len: usize) {
792 if len < self.len {
793 unsafe {
794 let back = self.get_unchecked_mut(len..);
795 ptr::drop_in_place(back);
796 self.len = len;
797 }
798 }
799 }
800
801 #[inline]
808 pub fn truncate(&mut self, len: usize) {
809 self.truncate_at_back(len);
810 }
811
812 pub fn clear(&mut self) {
828 self.truncate_at_back(0);
829 self.off = self.cap() / 2;
830 }
831
832 pub fn set_reserved_space(&mut self, front: SetReservedSpace, back: SetReservedSpace) {
850 fn new_space(current: usize, set: SetReservedSpace) -> usize {
851 match set {
852 SetReservedSpace::Keep => current,
853 SetReservedSpace::ShrinkTo(new) => current.min(new),
854 SetReservedSpace::GrowTo(new) => current.max(new),
855 SetReservedSpace::Exact(new) => new,
856 }
857 }
858
859 if is_zst::<T>() {
860 return;
861 }
862
863 let front_space = self.reserved_front_space();
864 let back_space = self.reserved_back_space();
865 let cap = self.cap();
866
867 let new_front_space = new_space(front_space, front);
868 let new_back_space = new_space(back_space, back);
869 let new_cap = new_front_space + self.len + new_back_space;
870
871 if new_cap > cap {
872 self.buf.realloc(new_cap);
873 }
874
875 if new_front_space != front_space {
876 unsafe {
877 ptr::copy(
878 self.ptr().add(front_space),
879 self.ptr().add(new_front_space),
880 self.len,
881 );
882 }
883 self.off = new_front_space;
884 }
885
886 if new_cap < cap {
887 self.buf.realloc(new_cap);
888 }
889 }
890
891 fn ensure_reserved_front_space(&mut self, count: usize) {
892 unsafe {
893 let pending_copy = self.prepare_reserved_front_space(count);
894 pending_copy.perform(self.ptr());
895 }
896 }
897
898 unsafe fn prepare_reserved_front_space(&mut self, count: usize) -> PendingCopy {
899 let mut pending_copy = PendingCopy {
900 src: self.off,
901 dst: self.off,
902 count: self.len,
903 };
904
905 if self.reserved_front_space() >= count {
906 } else {
908 let total_reserved_space = self.cap() - self.len;
909 self.off = if total_reserved_space >= count {
910 usize::midpoint(total_reserved_space, count)
911 } else {
912 let growth = cmp::max(1, self.len);
913 let new_cap = if count > total_reserved_space + growth {
914 self.len + count
915 } else {
916 self.cap() + growth
917 };
918 self.buf.realloc(new_cap);
919 new_cap - self.len
920 };
921 pending_copy.dst = self.off;
922 }
923
924 debug_assert!(self.reserved_front_space() >= count);
925
926 pending_copy
927 }
928
929 fn ensure_reserved_back_space(&mut self, count: usize) {
930 unsafe {
931 let pending_copy = self.prepare_reserved_back_space(count);
932 pending_copy.perform(self.ptr());
933 }
934 }
935
936 unsafe fn prepare_reserved_back_space(&mut self, count: usize) -> PendingCopy {
937 let mut pending_copy = PendingCopy {
938 src: self.off,
939 dst: self.off,
940 count: self.len,
941 };
942
943 if self.reserved_back_space() >= count {
944 } else {
946 let total_reserved_space = self.cap() - self.len;
947 self.off = if total_reserved_space >= count {
948 (total_reserved_space - count) / 2
949 } else {
950 let growth = cmp::max(1, self.len);
951 let new_cap = if count > total_reserved_space + growth {
952 self.len + count
953 } else {
954 self.cap() + growth
955 };
956 self.buf.realloc(new_cap);
957 0
958 };
959 pending_copy.dst = self.off;
960 }
961
962 debug_assert!(self.reserved_back_space() >= count);
963
964 pending_copy
965 }
966
967 #[must_use]
979 pub fn reserved_front_space(&self) -> usize {
980 if is_zst::<T>() { usize::MAX } else { self.off }
981 }
982
983 #[must_use]
995 pub fn reserved_back_space(&self) -> usize {
996 if is_zst::<T>() {
997 usize::MAX
998 } else {
999 self.cap() - self.len - self.off
1000 }
1001 }
1002}
1003
1004impl<T: Clone> LinearDeque<T> {
1005 pub fn resize_at_front(&mut self, new_len: usize, value: T) {
1034 self.resize_at_front_with(new_len, || value.clone());
1035 }
1036
1037 pub fn resize_at_back(&mut self, new_len: usize, value: T) {
1066 self.resize_at_back_with(new_len, || value.clone());
1067 }
1068
1069 #[inline]
1076 pub fn resize(&mut self, new_len: usize, value: T) {
1077 self.resize_at_back(new_len, value);
1078 }
1079}
1080
1081impl<T> Default for LinearDeque<T> {
1082 fn default() -> Self {
1083 Self::new()
1084 }
1085}
1086
1087impl<T> Drop for LinearDeque<T> {
1088 fn drop(&mut self) {
1089 while self.pop_back().is_some() {}
1090 }
1091}
1092
1093impl<T> Deref for LinearDeque<T> {
1094 type Target = [T];
1095
1096 fn deref(&self) -> &Self::Target {
1097 unsafe { core::slice::from_raw_parts(self.ptr().add(self.off), self.len) }
1098 }
1099}
1100
1101impl<T> DerefMut for LinearDeque<T> {
1102 fn deref_mut(&mut self) -> &mut Self::Target {
1103 unsafe { core::slice::from_raw_parts_mut(self.ptr().add(self.off), self.len) }
1104 }
1105}
1106
1107impl<T> Extend<T> for LinearDeque<T> {
1108 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
1114 self.extend_at_back(iter);
1115 }
1116}
1117
1118impl<'a, T> Extend<&'a T> for LinearDeque<T>
1119where
1120 T: 'a + Copy,
1121{
1122 fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
1123 self.extend(iter.into_iter().copied());
1124 }
1125}
1126
1127impl<T> IntoIterator for LinearDeque<T> {
1128 type Item = T;
1129
1130 type IntoIter = IntoIter<T>;
1131
1132 fn into_iter(self) -> Self::IntoIter {
1133 unsafe {
1134 let iter = RawValIter::new(&self);
1135
1136 let buf = ptr::read(&raw const self.buf);
1137 mem::forget(self);
1138
1139 IntoIter { iter, _buf: buf }
1140 }
1141 }
1142}
1143
1144macro_rules! impl_partial_eq {
1145 ([$($n:tt)*] $rhs:ty) => {
1146 impl<T, U, $($n)*> PartialEq<$rhs> for LinearDeque<T>
1147 where
1148 T: PartialEq<U>,
1149 {
1150 fn eq(&self, other: & $rhs) -> bool {
1151 self.deref() == other.deref()
1152 }
1153 }
1154 };
1155}
1156
1157impl_partial_eq!([const N: usize] [U; N]);
1158impl_partial_eq!([const N: usize] &[U; N]);
1159impl_partial_eq!([const N: usize] &mut [U; N]);
1160impl_partial_eq!([] & [U]);
1161impl_partial_eq!([] &mut [U]);
1162impl_partial_eq!([] Vec<U>);
1163impl_partial_eq!([] LinearDeque<U>);
1164
1165impl<T: Eq> Eq for LinearDeque<T> {}
1166
1167impl<T: PartialOrd> PartialOrd for LinearDeque<T> {
1168 fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
1169 self.iter().partial_cmp(other.iter())
1170 }
1171}
1172
1173impl<T: Ord> Ord for LinearDeque<T> {
1174 fn cmp(&self, other: &Self) -> core::cmp::Ordering {
1175 self.iter().cmp(other.iter())
1176 }
1177}
1178
1179impl<T: Hash> Hash for LinearDeque<T> {
1180 fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
1181 self.deref().hash(state);
1182 }
1183}
1184
1185impl<T, const N: usize> From<[T; N]> for LinearDeque<T> {
1186 fn from(value: [T; N]) -> Self {
1195 Self::from_iter(value)
1196 }
1197}
1198
1199impl<T> From<Vec<T>> for LinearDeque<T> {
1200 fn from(value: Vec<T>) -> Self {
1202 Self::from_iter(value)
1203 }
1204}
1205
1206impl<T> FromIterator<T> for LinearDeque<T> {
1207 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
1208 let iter = iter.into_iter();
1209 let (lower, upper) = iter.size_hint();
1210 let size = upper.unwrap_or(lower);
1211 let mut deque = Self::with_reserved_space(0, size);
1212 for elem in iter {
1213 deque.push_back(elem);
1214 }
1215 deque
1216 }
1217}
1218
1219#[cfg(feature = "std")]
1220impl Read for LinearDeque<u8> {
1221 fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
1222 let result = (&*self as &[u8]).read(buf);
1223 if let Ok(ref count) = result {
1224 self.truncate_at_front(self.len - count);
1225 }
1226 result
1227 }
1228}
1229
1230#[cfg(feature = "std")]
1231impl Write for LinearDeque<u8> {
1232 fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
1233 self.extend(buf);
1234 Ok(buf.len())
1235 }
1236
1237 fn flush(&mut self) -> std::io::Result<()> {
1238 Ok(())
1239 }
1240}
1241
1242impl<T: Clone> Clone for LinearDeque<T> {
1243 fn clone(&self) -> Self {
1244 let mut clone = Self::with_reserved_space(0, self.len);
1245 for elem in self.iter() {
1246 clone.push_back(elem.clone());
1247 }
1248 clone
1249 }
1250}
1251
1252impl<T: Debug> Debug for LinearDeque<T> {
1253 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1254 f.debug_struct("LinearDeque")
1255 .field("values", &&**self)
1256 .field(
1257 "reserved_spaces",
1258 &(self.reserved_front_space(), self.reserved_back_space()),
1259 )
1260 .finish()
1261 }
1262}
1263
1264#[derive(Clone, Copy, Debug)]
1265#[must_use]
1266struct PendingCopy {
1267 src: usize,
1268 dst: usize,
1269 count: usize,
1270}
1271
1272impl PendingCopy {
1273 unsafe fn perform<T>(self, ptr: *mut T) {
1274 unsafe {
1275 if self.count > 0 && self.src != self.dst {
1276 ptr::copy(ptr.add(self.src), ptr.add(self.dst), self.count);
1277 }
1278 }
1279 }
1280
1281 fn split(self, index: usize) -> (PendingCopy, PendingCopy) {
1282 let low = PendingCopy {
1283 count: index,
1284 ..self
1285 };
1286 let high = PendingCopy {
1287 src: self.src + index,
1288 dst: self.dst + index,
1289 count: self.count - index,
1290 };
1291 (low, high)
1292 }
1293}
1294
1295#[derive(Clone, Copy, PartialEq, Eq, Debug)]
1300pub enum SetReservedSpace {
1301 Keep,
1303
1304 ShrinkTo(usize),
1308
1309 GrowTo(usize),
1313
1314 Exact(usize),
1316}
1317
1318pub struct IntoIter<T> {
1326 _buf: Buffer<T>,
1327 iter: RawValIter<T>,
1328}
1329
1330impl<T> Iterator for IntoIter<T> {
1331 type Item = T;
1332
1333 fn next(&mut self) -> Option<Self::Item> {
1334 self.iter.next()
1335 }
1336
1337 fn size_hint(&self) -> (usize, Option<usize>) {
1338 self.iter.size_hint()
1339 }
1340}
1341
1342impl<T> DoubleEndedIterator for IntoIter<T> {
1343 fn next_back(&mut self) -> Option<Self::Item> {
1344 self.iter.next_back()
1345 }
1346}
1347
1348impl<T> Drop for IntoIter<T> {
1349 fn drop(&mut self) {
1350 for _ in &mut *self {}
1351 }
1352}
1353
1354pub struct Drain<'a, T: 'a> {
1361 vec: PhantomData<&'a mut LinearDeque<T>>,
1362 iter: RawValIter<T>,
1363 pending_copy: PendingCopy,
1364 ptr: *mut T,
1365}
1366
1367impl<T> Iterator for Drain<'_, T> {
1368 type Item = T;
1369
1370 fn next(&mut self) -> Option<Self::Item> {
1371 self.iter.next()
1372 }
1373
1374 fn size_hint(&self) -> (usize, Option<usize>) {
1375 self.iter.size_hint()
1376 }
1377}
1378
1379impl<T> Drop for Drain<'_, T> {
1380 fn drop(&mut self) {
1381 for _ in &mut *self {}
1382 unsafe {
1383 self.pending_copy.perform(self.ptr);
1384 }
1385 }
1386}
1387
1388fn is_zst<T>() -> bool {
1389 mem::size_of::<T>() == 0
1390}
1391
1392#[cfg(test)]
1393mod tests {
1394 use core::fmt::Debug;
1395 use core::hash::{Hash as _, Hasher};
1396 use core::{mem, ptr};
1397 use std::collections::hash_map::DefaultHasher;
1398 use std::io::{Read as _, Write as _};
1399
1400 use crate::drop_tracker::DropTracker;
1401 use crate::{LinearDeque, SetReservedSpace};
1402
1403 macro_rules! assert_deque {
1404 ($deque:ident, $expected_reserved_front_space:expr, $expected_elems:expr, $expected_reserved_back_space:expr $(,)?) => {{
1405 let expected_reserved_front_space = $expected_reserved_front_space;
1406 let expected_elems: Vec<_> = $expected_elems.into_iter().collect();
1407 let expected_reserved_back_space = $expected_reserved_back_space;
1408
1409 let expected_len = expected_elems.len();
1410 let expected_capacity =
1411 expected_reserved_front_space + expected_len + expected_reserved_back_space;
1412 let expected_off = expected_reserved_front_space;
1413
1414 assert_eq!($deque.cap(), expected_capacity, "cap");
1415 assert_eq!($deque.len, expected_len, "len");
1416 assert_eq!($deque.off, expected_off, "off");
1417 for (i, expected_elem) in expected_elems.into_iter().enumerate() {
1418 let elem = unsafe { ptr::read($deque.ptr().add($deque.off + i)) };
1419 assert_eq!(elem, expected_elem, "index {i}");
1420 }
1421 assert_eq!(
1422 $deque.reserved_front_space(),
1423 expected_reserved_front_space,
1424 "front space"
1425 );
1426 assert_eq!(
1427 $deque.reserved_back_space(),
1428 expected_reserved_back_space,
1429 "back_space"
1430 );
1431 }};
1432 }
1433
1434 fn prepare_deque<T: Clone + Eq + Debug>(
1435 reserved_front_space: usize,
1436 elems: impl IntoIterator<Item = T>,
1437 reserved_back_space: usize,
1438 ) -> LinearDeque<T> {
1439 let elems: Vec<_> = elems.into_iter().collect();
1440 let capacity = reserved_front_space + elems.len() + reserved_back_space;
1441
1442 let mut deque: LinearDeque<T> = LinearDeque::new();
1443 if capacity != 0 {
1444 deque.buf.realloc(capacity);
1445 deque.len = elems.len();
1446 deque.off = reserved_front_space;
1447 for (i, elem) in elems.iter().enumerate() {
1448 unsafe {
1449 ptr::write(deque.ptr().add(deque.off + i), elem.clone());
1450 }
1451 }
1452 }
1453
1454 assert_deque!(deque, reserved_front_space, elems, reserved_back_space);
1455
1456 deque
1457 }
1458
1459 macro_rules! assert_zst_deque {
1460 ($deque:ident, $expected_len:expr) => {{
1461 fn assert_zst_deque<T>(_: &LinearDeque<T>) {
1462 assert_eq!(mem::size_of::<T>(), 0);
1463 }
1464 assert_zst_deque(&$deque);
1465 }
1466 assert_eq!($deque.cap(), usize::MAX);
1467 assert_eq!($deque.len, $expected_len);};
1468 }
1469
1470 fn prepare_zst_deque<T>(len: usize) -> LinearDeque<T> {
1471 assert_eq!(mem::size_of::<T>(), 0);
1472 let mut deque = LinearDeque::new();
1473 deque.len = len;
1474 deque
1475 }
1476
1477 #[test]
1478 fn new_zst() {
1479 let deque: LinearDeque<()> = LinearDeque::new();
1480
1481 assert_zst_deque!(deque, 0);
1482 }
1483
1484 #[test]
1485 fn with_reserved_space() {
1486 let deque: LinearDeque<char> = LinearDeque::with_reserved_space(3, 4);
1487
1488 assert_deque!(deque, 3, [], 4);
1489 }
1490
1491 #[test]
1492 fn with_reserved_space_zst() {
1493 let deque: LinearDeque<()> = LinearDeque::with_reserved_space(3, 4);
1494
1495 assert_zst_deque!(deque, 0);
1496 }
1497
1498 #[test]
1499 fn front_zst() {
1500 let deque: LinearDeque<()> = prepare_zst_deque(0);
1501 assert_eq!(deque.front(), None);
1502
1503 let deque: LinearDeque<()> = prepare_zst_deque(2);
1504 assert_eq!(deque.front(), Some(&()));
1505 }
1506
1507 #[test]
1508 fn back_zst() {
1509 let deque: LinearDeque<()> = prepare_zst_deque(0);
1510 assert_eq!(deque.back(), None);
1511
1512 let deque: LinearDeque<()> = prepare_zst_deque(2);
1513 assert_eq!(deque.back(), Some(&()));
1514 }
1515
1516 #[test]
1517 fn push_front() {
1518 let mut deque: LinearDeque<char> = prepare_deque(2, [], 1);
1519 deque.push_front('A');
1522
1523 assert_deque!(deque, 1, ['A'], 1);
1525
1526 deque.push_front('B');
1527
1528 assert_deque!(deque, 0, ['B', 'A'], 1);
1530
1531 deque.push_front('C');
1532
1533 assert_deque!(deque, 0, ['C', 'B', 'A'], 0);
1535
1536 deque.push_front('D');
1537
1538 assert_deque!(deque, 2, ['D', 'C', 'B', 'A'], 0);
1540
1541 deque.push_front('E');
1542
1543 assert_deque!(deque, 1, ['E', 'D', 'C', 'B', 'A'], 0);
1545 }
1546
1547 #[test]
1548 fn push_front_zst() {
1549 let mut deque = prepare_zst_deque(0);
1550
1551 deque.push_front(());
1552 deque.push_front(());
1553
1554 assert_zst_deque!(deque, 2);
1555 }
1556
1557 #[test]
1558 fn push_back() {
1559 let mut deque: LinearDeque<char> = prepare_deque(1, [], 2);
1560 deque.push_back('A');
1563
1564 assert_deque!(deque, 1, ['A'], 1);
1566
1567 deque.push_back('B');
1568
1569 assert_deque!(deque, 1, ['A', 'B'], 0);
1571
1572 deque.push_back('C');
1573
1574 assert_deque!(deque, 0, ['A', 'B', 'C'], 0);
1576
1577 deque.push_back('D');
1578
1579 assert_deque!(deque, 0, ['A', 'B', 'C', 'D'], 2);
1581
1582 deque.push_back('E');
1583
1584 assert_deque!(deque, 0, ['A', 'B', 'C', 'D', 'E'], 1);
1586 }
1587
1588 #[test]
1589 fn push_back_zst() {
1590 let mut deque = prepare_zst_deque(0);
1591
1592 deque.push_back(());
1593 deque.push_back(());
1594
1595 assert_zst_deque!(deque, 2);
1596 }
1597
1598 #[test]
1599 fn pop_front() {
1600 let mut deque = prepare_deque(1, ['B', 'A'], 2);
1601 let popped = deque.pop_front();
1604
1605 assert_eq!(popped, Some('B'));
1606 assert_deque!(deque, 2, ['A'], 2);
1608
1609 let popped = deque.pop_front();
1610
1611 assert_eq!(popped, Some('A'));
1612 assert_deque!(deque, 3, [], 2);
1614
1615 let popped = deque.pop_front();
1616
1617 assert_eq!(popped, None);
1618 assert_deque!(deque, 3, [], 2);
1619 }
1620
1621 #[test]
1622 fn pop_front_zst() {
1623 let mut deque = prepare_zst_deque(2);
1624
1625 let popped = deque.pop_front();
1626 assert_eq!(popped, Some(()));
1627 assert_zst_deque!(deque, 1);
1628
1629 let popped = deque.pop_front();
1630 assert_eq!(popped, Some(()));
1631 assert_zst_deque!(deque, 0);
1632
1633 let popped = deque.pop_front();
1634 assert_eq!(popped, None);
1635 assert_zst_deque!(deque, 0);
1636 }
1637
1638 #[test]
1639 fn pop_back() {
1640 let mut deque = prepare_deque(2, ['A', 'B'], 1);
1641 let popped = deque.pop_back();
1644
1645 assert_eq!(popped, Some('B'));
1646 assert_deque!(deque, 2, ['A'], 2);
1648
1649 let popped = deque.pop_back();
1650
1651 assert_eq!(popped, Some('A'));
1652 assert_deque!(deque, 2, [], 3);
1654
1655 let popped = deque.pop_back();
1656
1657 assert_eq!(popped, None);
1658 assert_deque!(deque, 2, [], 3);
1659 }
1660
1661 #[test]
1662 fn pop_back_zst() {
1663 let mut deque = prepare_zst_deque(2);
1664
1665 let popped = deque.pop_back();
1666 assert_eq!(popped, Some(()));
1667 assert_zst_deque!(deque, 1);
1668
1669 let popped = deque.pop_back();
1670 assert_eq!(popped, Some(()));
1671 assert_zst_deque!(deque, 0);
1672
1673 let popped = deque.pop_back();
1674 assert_eq!(popped, None);
1675 assert_zst_deque!(deque, 0);
1676 }
1677
1678 #[test]
1679 fn insert_near_front() {
1680 let mut deque = prepare_deque(1, ['A', 'B', 'C'], 1);
1681 deque.insert(1, 'x');
1684
1685 assert_deque!(deque, 0, ['A', 'x', 'B', 'C'], 1);
1687
1688 deque.insert(1, 'y');
1689
1690 assert_deque!(deque, 0, ['A', 'y', 'x', 'B', 'C'], 0);
1692
1693 deque.insert(1, 'z');
1694
1695 assert_deque!(deque, 4, ['A', 'z', 'y', 'x', 'B', 'C'], 0);
1697 }
1698
1699 #[test]
1700 fn insert_near_back() {
1701 let mut deque = prepare_deque(1, ['A', 'B', 'C'], 1);
1702 deque.insert(2, 'x');
1705
1706 assert_deque!(deque, 1, ['A', 'B', 'x', 'C'], 0);
1708
1709 deque.insert(3, 'y');
1710
1711 assert_deque!(deque, 0, ['A', 'B', 'x', 'y', 'C'], 0);
1713
1714 deque.insert(4, 'z');
1715
1716 assert_deque!(deque, 0, ['A', 'B', 'x', 'y', 'z', 'C'], 4);
1718 }
1719
1720 #[test]
1721 fn insert_zst() {
1722 let mut deque = LinearDeque::new();
1723
1724 deque.insert(0, ());
1725 deque.insert(0, ());
1726 deque.insert(2, ());
1727 deque.insert(2, ());
1728
1729 assert_zst_deque!(deque, 4);
1730 }
1731
1732 #[test]
1733 fn remove_near_front() {
1734 let mut deque = prepare_deque(0, ['A', 'B', 'C', 'D'], 0);
1735 let removed = deque.remove(1);
1738
1739 assert_eq!(removed, Some('B'));
1740 assert_deque!(deque, 1, ['A', 'C', 'D'], 0);
1742 }
1743
1744 #[test]
1745 fn remove_near_back() {
1746 let mut deque = prepare_deque(0, ['A', 'B', 'C', 'D'], 0);
1747 let removed = deque.remove(2);
1750
1751 assert_eq!(removed, Some('C'));
1752 assert_deque!(deque, 0, ['A', 'B', 'D'], 1);
1754 }
1755
1756 #[test]
1757 fn remove_zst() {
1758 let mut deque = prepare_zst_deque(3);
1759
1760 let removed = deque.remove(1);
1761 assert_eq!(removed, Some(()));
1762 assert_zst_deque!(deque, 2);
1763
1764 let removed = deque.remove(1);
1765 assert_eq!(removed, Some(()));
1766 assert_zst_deque!(deque, 1);
1767
1768 let removed = deque.remove(0);
1769 assert_eq!(removed, Some(()));
1770 assert_zst_deque!(deque, 0);
1771
1772 let removed = deque.remove(0);
1773 assert_eq!(removed, None);
1774 assert_zst_deque!(deque, 0);
1775 }
1776
1777 #[test]
1778 fn drain_all() {
1779 let mut deque = prepare_deque(2, 'A'..='H', 2);
1780 let drained = deque.drain(..);
1783
1784 assert_eq!(drained.collect::<Vec<_>>(), Vec::from_iter('A'..='H'));
1785 assert_eq!(deque.cap(), 12);
1788 assert!(deque.reserved_front_space() >= 2);
1789 assert!(deque.reserved_back_space() >= 2);
1790 assert!(deque.is_empty());
1791 }
1792
1793 #[test]
1794 fn drain_start() {
1795 let mut deque = prepare_deque(2, 'A'..='H', 2);
1796 let drained = deque.drain(..3);
1799
1800 assert_eq!(drained.collect::<Vec<_>>(), Vec::from_iter('A'..='C'));
1801 assert_deque!(deque, 5, 'D'..='H', 2);
1803 }
1804
1805 #[test]
1806 fn drain_end() {
1807 let mut deque = prepare_deque(2, 'A'..='H', 2);
1808 let drained = deque.drain(5..);
1811
1812 assert_eq!(drained.collect::<Vec<_>>(), Vec::from_iter('F'..='H'));
1813 assert_deque!(deque, 2, 'A'..='E', 5);
1815 }
1816
1817 #[test]
1818 fn drain_near_start() {
1819 let mut deque = prepare_deque(2, 'A'..='H', 2);
1820 let drained = deque.drain(1..5);
1823
1824 assert_eq!(drained.collect::<Vec<_>>(), Vec::from_iter('B'..='E'));
1825 assert_deque!(deque, 6, ['A', 'F', 'G', 'H'], 2);
1827 }
1828
1829 #[test]
1830 fn drain_near_end() {
1831 let mut deque = prepare_deque(2, 'A'..='H', 2);
1832 let drained = deque.drain(3..7);
1835
1836 assert_eq!(drained.collect::<Vec<_>>(), Vec::from_iter('D'..='G'));
1837 assert_deque!(deque, 2, ['A', 'B', 'C', 'H'], 6);
1839 }
1840
1841 #[test]
1842 fn drain_nothing() {
1843 let mut deque = prepare_deque(2, 'A'..='H', 2);
1844 let drained = deque.drain(3..3);
1847
1848 assert_eq!(drained.count(), 0);
1849 assert_deque!(deque, 2, 'A'..='H', 2);
1851 }
1852
1853 #[test]
1854 fn drain_not_fully_consumed() {
1855 let mut deque = prepare_deque(2, 'A'..='H', 2);
1856 let mut drained = deque.drain(3..7);
1859 assert_eq!(drained.next(), Some('D'));
1860 drop(drained);
1861
1862 assert_deque!(deque, 2, ['A', 'B', 'C', 'H'], 6);
1864 }
1865
1866 #[test]
1867 fn drain_zst() {
1868 let mut deque: LinearDeque<()> = prepare_zst_deque(8);
1869
1870 let iter = deque.drain(3..5);
1871 assert_eq!(iter.count(), 2);
1872 assert_zst_deque!(deque, 6);
1873
1874 let iter = deque.drain(4..);
1875 assert_eq!(iter.count(), 2);
1876 assert_zst_deque!(deque, 4);
1877
1878 let iter = deque.drain(..2);
1879 assert_eq!(iter.count(), 2);
1880 assert_zst_deque!(deque, 2);
1881
1882 let iter = deque.drain(..);
1883 assert_eq!(iter.count(), 2);
1884 assert_zst_deque!(deque, 0);
1885 }
1886
1887 #[test]
1888 fn extend_at_front() {
1889 let mut deque = prepare_deque(1, ['C', 'D'], 1);
1890 deque.extend_at_front(['B', 'A']);
1893
1894 assert_deque!(deque, 0, 'A'..='D', 0);
1896 }
1897
1898 #[test]
1899 fn extend_at_front_zst() {
1900 let mut deque = prepare_zst_deque(2);
1901
1902 deque.extend_at_front(std::iter::repeat(()).take(4));
1903
1904 assert_zst_deque!(deque, 6);
1905 }
1906
1907 #[test]
1908 fn extend_at_back() {
1909 let mut deque = prepare_deque(1, ['A', 'B'], 1);
1910 deque.extend_at_back(['C', 'D']);
1913
1914 assert_deque!(deque, 0, 'A'..='D', 0);
1916 }
1917
1918 #[test]
1919 fn extend_at_back_zst() {
1920 let mut deque = prepare_zst_deque(2);
1921
1922 deque.extend_at_back(std::iter::repeat(()).take(4));
1923
1924 assert_zst_deque!(deque, 6);
1925 }
1926
1927 #[test]
1928 fn reserved_front_space() {
1929 let deque = prepare_deque(3, 'A'..='D', 4);
1930
1931 assert_eq!(deque.reserved_front_space(), 3);
1932 }
1933
1934 #[test]
1935 fn reserved_front_space_zst() {
1936 let deque: LinearDeque<()> = prepare_zst_deque(5);
1937
1938 assert_eq!(deque.reserved_front_space(), usize::MAX);
1939 }
1940
1941 #[test]
1942 fn reserved_back_space() {
1943 let deque = prepare_deque(3, 'A'..='D', 4);
1944
1945 assert_eq!(deque.reserved_back_space(), 4);
1946 }
1947
1948 #[test]
1949 fn reserved_back_space_zst() {
1950 let deque: LinearDeque<()> = prepare_zst_deque(5);
1951
1952 assert_eq!(deque.reserved_back_space(), usize::MAX);
1953 }
1954
1955 #[test]
1956 fn deref_empty() {
1957 let deque: LinearDeque<char> = prepare_deque(6, [], 4);
1958
1959 assert!(deque.is_empty());
1960 assert_eq!(deque.len(), 0);
1961 }
1962
1963 #[test]
1964 fn deref_non_empty() {
1965 let deque = prepare_deque(2, ['A', 'B', 'C'], 4);
1966
1967 assert!(!deque.is_empty());
1968 assert_eq!(deque.len(), 3);
1969 assert_eq!(deque[0], 'A');
1970 assert_eq!(deque[1], 'B');
1971 assert_eq!(deque[2], 'C');
1972 }
1973
1974 #[test]
1975 fn deref_zst() {
1976 let deque: LinearDeque<()> = prepare_zst_deque(4);
1977
1978 assert!(!deque.is_empty());
1979 assert_eq!(deque.len(), 4);
1980 assert_eq!(deque[0], ());
1981 assert_zst_deque!(deque, 4);
1982 }
1983
1984 #[test]
1985 fn into_iter() {
1986 let deque = prepare_deque(2, ['A', 'B', 'C'], 4);
1987
1988 let mut iter = deque.into_iter();
1989
1990 assert_eq!(iter.next(), Some('A'));
1991 assert_eq!(iter.next(), Some('B'));
1992 assert_eq!(iter.next(), Some('C'));
1993 assert_eq!(iter.next(), None);
1994 }
1995
1996 #[test]
1997 fn into_iter_double_ended() {
1998 let deque = prepare_deque(2, ['A', 'B', 'C'], 4);
1999
2000 let mut iter = deque.into_iter();
2001
2002 assert_eq!(iter.next_back(), Some('C'));
2003 assert_eq!(iter.next_back(), Some('B'));
2004 assert_eq!(iter.next_back(), Some('A'));
2005 assert_eq!(iter.next_back(), None);
2006 }
2007
2008 #[test]
2009 fn into_iter_mixed() {
2010 let deque = prepare_deque(2, ['A', 'B', 'C'], 4);
2011
2012 let mut iter = deque.into_iter();
2013
2014 assert_eq!(iter.next_back(), Some('C'));
2015 assert_eq!(iter.next(), Some('A'));
2016 assert_eq!(iter.next_back(), Some('B'));
2017 assert_eq!(iter.next(), None);
2018 assert_eq!(iter.next_back(), None);
2019 }
2020
2021 #[test]
2022 fn into_iter_zst() {
2023 let deque: LinearDeque<()> = prepare_zst_deque(4);
2024
2025 let iter = deque.into_iter();
2026
2027 assert_eq!(iter.count(), 4);
2028 }
2029
2030 #[test]
2031 fn resize_at_front_larger() {
2032 let mut deque = prepare_deque(2, ['A', 'B', 'C', 'D'], 3);
2033 deque.resize_at_front(10, 'x');
2036
2037 assert_deque!(
2039 deque,
2040 0,
2041 ['x', 'x', 'x', 'x', 'x', 'x', 'A', 'B', 'C', 'D'],
2042 3
2043 );
2044 }
2045
2046 #[test]
2047 fn resize_at_front_smaller() {
2048 let mut deque = prepare_deque(2, ['A', 'B', 'C', 'D'], 3);
2049 deque.resize_at_front(3, 'x');
2052
2053 assert_deque!(deque, 3, ['B', 'C', 'D'], 3);
2055 }
2056
2057 #[test]
2058 fn resize_at_front_zst() {
2059 let mut deque = prepare_zst_deque(5);
2060
2061 deque.resize_at_front(2, ());
2062 assert_zst_deque!(deque, 2);
2063
2064 deque.resize_at_front(4, ());
2065 assert_zst_deque!(deque, 4);
2066 }
2067
2068 #[test]
2069 fn resize_at_back_larger() {
2070 let mut deque = prepare_deque(3, ['A', 'B', 'C', 'D'], 2);
2071 deque.resize_at_back(10, 'x');
2074
2075 assert_deque!(
2077 deque,
2078 3,
2079 ['A', 'B', 'C', 'D', 'x', 'x', 'x', 'x', 'x', 'x'],
2080 0
2081 );
2082 }
2083
2084 #[test]
2085 fn resize_at_back_smaller() {
2086 let mut deque = prepare_deque(3, ['A', 'B', 'C', 'D'], 2);
2087 deque.resize_at_back(3, 'x');
2090
2091 assert_deque!(deque, 3, ['A', 'B', 'C'], 3);
2093 }
2094
2095 #[test]
2096 fn resize_at_back_zst() {
2097 let mut deque = prepare_zst_deque(5);
2098
2099 deque.resize_at_back(2, ());
2100 assert_zst_deque!(deque, 2);
2101
2102 deque.resize_at_back(4, ());
2103 assert_zst_deque!(deque, 4);
2104 }
2105
2106 #[test]
2107 fn resize_at_front_with_larger() {
2108 let mut deque = prepare_deque(2, 'A'..='D', 3);
2109 let mut chars = 'a'..;
2111
2112 deque.resize_at_front_with(7, || chars.next().unwrap());
2113
2114 assert_deque!(deque, 0, ['c', 'b', 'a', 'A', 'B', 'C', 'D'], 3);
2116 }
2117
2118 #[test]
2119 fn resize_at_front_with_smaller() {
2120 let mut deque = prepare_deque(2, 'A'..='D', 3);
2121 let mut chars = 'a'..;
2123
2124 deque.resize_at_front_with(3, || chars.next().unwrap());
2125
2126 assert_deque!(deque, 3, ['B', 'C', 'D'], 3);
2128 }
2129
2130 #[test]
2131 fn resize_at_front_with_zst() {
2132 let mut deque = prepare_zst_deque(5);
2133
2134 deque.resize_at_front_with(2, || ());
2135 assert_zst_deque!(deque, 2);
2136
2137 deque.resize_at_front_with(4, || ());
2138 assert_zst_deque!(deque, 4);
2139 }
2140
2141 #[test]
2142 fn resize_at_back_with_larger() {
2143 let mut deque = prepare_deque(3, 'A'..='D', 2);
2144 let mut chars = 'a'..;
2146
2147 deque.resize_at_back_with(7, || chars.next().unwrap());
2148
2149 assert_deque!(deque, 3, ['A', 'B', 'C', 'D', 'a', 'b', 'c'], 0);
2151 }
2152
2153 #[test]
2154 fn resize_at_back_with_smaller() {
2155 let mut deque = prepare_deque(2, 'A'..='D', 3);
2156 let mut chars = 'a'..;
2158
2159 deque.resize_at_back_with(3, || chars.next().unwrap());
2160
2161 assert_deque!(deque, 2, ['A', 'B', 'C'], 4);
2163 }
2164
2165 #[test]
2166 fn resize_at_back_with_zst() {
2167 let mut deque = prepare_zst_deque(5);
2168
2169 deque.resize_at_back_with(2, || ());
2170 assert_zst_deque!(deque, 2);
2171
2172 deque.resize_at_back_with(4, || ());
2173 assert_zst_deque!(deque, 4);
2174 }
2175
2176 #[test]
2177 fn retain() {
2178 let mut drop_tracker = DropTracker::new();
2179 let mut deque = prepare_deque(2, drop_tracker.wrap_iter(['A', 'b', 'c', 'D', 'e']), 1);
2180 let (dropped, _) = drop_tracker.track(|| {
2183 deque.retain(|c| c.value.is_lowercase());
2184 });
2185
2186 assert_deque!(deque, 2, drop_tracker.wrap_iter(['b', 'c', 'e']), 3);
2188 assert_eq!(dropped, ['A', 'D']);
2189 }
2190
2191 #[test]
2192 fn retain_mut() {
2193 let mut drop_tracker = DropTracker::new();
2194 let mut deque = prepare_deque(2, drop_tracker.wrap_iter(['A', 'b', 'c', 'D', 'e']), 1);
2195 let (dropped, _) = drop_tracker.track(|| {
2198 deque.retain_mut(|c| {
2199 if c.value.is_lowercase() {
2200 c.value = c.value.to_uppercase().next().unwrap();
2201 true
2202 } else {
2203 false
2204 }
2205 });
2206 });
2207
2208 assert_deque!(deque, 2, drop_tracker.wrap_iter(['B', 'C', 'E']), 3);
2210 assert_eq!(dropped, ['A', 'D']);
2211 }
2212
2213 #[test]
2214 fn retain_mut_drop_none() {
2215 let mut drop_tracker = DropTracker::new();
2216 let mut deque = prepare_deque(2, drop_tracker.wrap_iter('A'..='E'), 1);
2217 let (dropped, _) = drop_tracker.track(|| {
2220 deque.retain_mut(|_| true);
2221 });
2222
2223 assert_deque!(deque, 2, drop_tracker.wrap_iter('A'..='E'), 1);
2225 assert!(dropped.is_empty());
2226 }
2227
2228 #[test]
2229 fn retain_mut_drop_all() {
2230 let mut drop_tracker = DropTracker::new();
2231 let mut deque = prepare_deque(2, drop_tracker.wrap_iter('A'..='E'), 1);
2232 let (dropped, _) = drop_tracker.track(|| {
2235 deque.retain_mut(|_| false);
2236 });
2237
2238 assert_deque!(deque, 2, [], 6);
2240 assert_eq!(dropped, Vec::from_iter('A'..='E'));
2241 }
2242
2243 #[test]
2244 fn retain_mut_zst() {
2245 let mut deque: LinearDeque<()> = prepare_zst_deque(4);
2246
2247 let mut p = false;
2248 deque.retain(|_| {
2249 p = !p;
2250 p
2251 });
2252
2253 assert_zst_deque!(deque, 2);
2254 }
2255
2256 #[test]
2257 fn truncate_at_front() {
2258 let mut drop_tracker = DropTracker::new();
2259 let mut deque = prepare_deque(5, drop_tracker.wrap_iter('A'..='F'), 1);
2260 let (dropped, _) = drop_tracker.track(|| {
2263 deque.truncate_at_front(2);
2264 });
2265
2266 assert_deque!(deque, 9, drop_tracker.wrap_iter('E'..='F'), 1);
2268 assert_eq!(dropped, Vec::from_iter('A'..='D'));
2269 }
2270
2271 #[test]
2272 fn truncate_at_front_zst() {
2273 let mut deque: LinearDeque<()> = prepare_zst_deque(4);
2274
2275 deque.truncate_at_front(3);
2276
2277 assert_zst_deque!(deque, 3);
2278 }
2279
2280 #[test]
2281 fn truncate_at_back() {
2282 let mut drop_tracker = DropTracker::new();
2283 let mut deque = prepare_deque(1, drop_tracker.wrap_iter('A'..='F'), 5);
2284 let (dropped, _) = drop_tracker.track(|| {
2287 deque.truncate_at_back(2);
2288 });
2289
2290 assert_deque!(deque, 1, drop_tracker.wrap_iter('A'..='B'), 9);
2292 assert_eq!(dropped, Vec::from_iter('C'..='F'));
2293 }
2294
2295 #[test]
2296 fn truncate_at_back_zst() {
2297 let mut deque: LinearDeque<()> = prepare_zst_deque(4);
2298
2299 deque.truncate_at_back(3);
2300
2301 assert_zst_deque!(deque, 3);
2302 }
2303
2304 #[test]
2305 fn clear() {
2306 let mut deque = prepare_deque(2, 'A'..='D', 4);
2307 deque.clear();
2310
2311 assert_deque!(deque, 5, [], 5);
2313 }
2314
2315 #[test]
2316 fn clear_zst() {
2317 let mut deque: LinearDeque<()> = prepare_zst_deque(4);
2318
2319 deque.clear();
2320
2321 assert_zst_deque!(deque, 0);
2322 }
2323
2324 #[test]
2325 fn set_reserved_space_keeping() {
2326 let mut deque = prepare_deque(2, 'A'..='D', 5);
2327 deque.set_reserved_space(SetReservedSpace::Keep, SetReservedSpace::Keep);
2330
2331 assert_deque!(deque, 2, 'A'..='D', 5);
2333 }
2334
2335 #[test]
2336 fn set_reserved_space_growing() {
2337 let mut deque = prepare_deque(3, 'A'..='D', 1);
2338 deque.set_reserved_space(SetReservedSpace::GrowTo(6), SetReservedSpace::GrowTo(2));
2341
2342 assert_deque!(deque, 6, 'A'..='D', 2);
2344 }
2345
2346 #[test]
2347 fn set_reserved_space_not_growing() {
2348 let mut deque = prepare_deque(3, 'A'..='D', 1);
2349 deque.set_reserved_space(SetReservedSpace::GrowTo(2), SetReservedSpace::GrowTo(1));
2352
2353 assert_deque!(deque, 3, 'A'..='D', 1);
2355 }
2356
2357 #[test]
2358 fn set_reserved_space_shrinking() {
2359 let mut deque = prepare_deque(5, 'A'..='D', 2);
2360 deque.set_reserved_space(SetReservedSpace::ShrinkTo(2), SetReservedSpace::ShrinkTo(1));
2363
2364 assert_deque!(deque, 2, 'A'..='D', 1);
2366 }
2367
2368 #[test]
2369 fn set_reserved_space_not_shrinking() {
2370 let mut deque = prepare_deque(5, 'A'..='D', 2);
2371 deque.set_reserved_space(SetReservedSpace::ShrinkTo(6), SetReservedSpace::ShrinkTo(3));
2374
2375 assert_deque!(deque, 5, 'A'..='D', 2);
2377 }
2378
2379 #[test]
2380 fn set_reserved_space_exactly_growing() {
2381 let mut deque = prepare_deque(2, 'A'..='D', 1);
2382 deque.set_reserved_space(SetReservedSpace::Exact(5), SetReservedSpace::Exact(2));
2385
2386 assert_deque!(deque, 5, 'A'..='D', 2);
2388 }
2389
2390 #[test]
2391 fn set_reserved_space_exactly_shrinking() {
2392 let mut deque = prepare_deque(5, 'A'..='D', 2);
2393 deque.set_reserved_space(SetReservedSpace::Exact(2), SetReservedSpace::Exact(1));
2396
2397 assert_deque!(deque, 2, 'A'..='D', 1);
2399 }
2400
2401 #[test]
2402 fn ensure_reserved_front_space_doing_nothing_1() {
2403 let mut deque = prepare_deque(3, 'A'..='C', 1);
2404 deque.ensure_reserved_front_space(1);
2407
2408 assert_deque!(deque, 3, 'A'..='C', 1);
2410 }
2411
2412 #[test]
2413 fn ensure_reserved_front_space_doing_nothing_2() {
2414 let mut deque = prepare_deque(3, 'A'..='C', 1);
2415 deque.ensure_reserved_front_space(3);
2418
2419 assert_deque!(deque, 3, 'A'..='C', 1);
2421 }
2422
2423 #[test]
2424 fn ensure_reserved_front_space_moving_1() {
2425 let mut deque = prepare_deque(1, 'A'..='C', 3);
2426 deque.ensure_reserved_front_space(2);
2429
2430 assert_deque!(deque, 3, 'A'..='C', 1);
2432 }
2433
2434 #[test]
2435 fn ensure_reserved_front_space_moving_2() {
2436 let mut deque = prepare_deque(1, 'A'..='C', 3);
2437 deque.ensure_reserved_front_space(4);
2440
2441 assert_deque!(deque, 4, 'A'..='C', 0);
2443 }
2444
2445 #[test]
2446 fn ensure_reserved_front_space_reallocating_1() {
2447 let mut deque = prepare_deque(2, 'A'..='C', 2);
2448 deque.ensure_reserved_front_space(5);
2451
2452 assert_deque!(deque, 7, 'A'..='C', 0);
2454 }
2455
2456 #[test]
2457 fn ensure_reserved_front_space_reallocating_2() {
2458 let mut deque = prepare_deque(2, 'A'..='C', 2);
2459 deque.ensure_reserved_front_space(8);
2462
2463 assert_deque!(deque, 8, 'A'..='C', 0);
2465 }
2466
2467 #[test]
2468 fn ensure_reserved_back_space_doing_nothing_1() {
2469 let mut deque = prepare_deque(1, 'A'..='C', 3);
2470 deque.ensure_reserved_back_space(1);
2473
2474 assert_deque!(deque, 1, 'A'..='C', 3);
2476 }
2477
2478 #[test]
2479 fn ensure_reserved_back_space_doing_nothing_2() {
2480 let mut deque = prepare_deque(1, 'A'..='C', 3);
2481 deque.ensure_reserved_back_space(3);
2484
2485 assert_deque!(deque, 1, 'A'..='C', 3);
2487 }
2488
2489 #[test]
2490 fn ensure_reserved_back_space_moving_1() {
2491 let mut deque = prepare_deque(3, 'A'..='C', 1);
2492 deque.ensure_reserved_back_space(2);
2495
2496 assert_deque!(deque, 1, 'A'..='C', 3);
2498 }
2499
2500 #[test]
2501 fn ensure_reserved_back_space_moving_2() {
2502 let mut deque = prepare_deque(3, 'A'..='C', 1);
2503 deque.ensure_reserved_back_space(4);
2506
2507 assert_deque!(deque, 0, 'A'..='C', 4);
2509 }
2510
2511 #[test]
2512 fn ensure_reserved_back_space_reallocating_1() {
2513 let mut deque = prepare_deque(2, 'A'..='C', 2);
2514 deque.ensure_reserved_back_space(5);
2517
2518 assert_deque!(deque, 0, 'A'..='C', 7);
2520 }
2521
2522 #[test]
2523 fn ensure_reserved_back_space_reallocating_2() {
2524 let mut deque = prepare_deque(2, 'A'..='C', 2);
2525 deque.ensure_reserved_back_space(8);
2528
2529 assert_deque!(deque, 0, 'A'..='C', 8);
2531 }
2532
2533 #[test]
2534 fn set_reserved_space_zst() {
2535 let mut deque: LinearDeque<()> = prepare_zst_deque(5);
2536
2537 deque.set_reserved_space(SetReservedSpace::Exact(3), SetReservedSpace::Exact(4));
2538
2539 assert_zst_deque!(deque, 5);
2540 }
2541
2542 #[test]
2543 fn eq() {
2544 let mut array = ['A', 'B'];
2545 let mut array_x = ['B', 'A'];
2546
2547 let deque = prepare_deque(1, array, 5);
2548
2549 {
2550 let slice: &[_] = &array;
2551 let slice_x: &[_] = &array_x;
2552
2553 assert!(deque == slice);
2554 assert!(deque != slice_x);
2555 }
2556
2557 assert!(deque == &array);
2558 assert!(deque != &array_x);
2559
2560 {
2561 let slice_mut: &mut [_] = &mut array;
2562 let slice_mut_x: &mut [_] = &mut array_x;
2563
2564 assert!(deque == slice_mut);
2565 assert!(deque != slice_mut_x);
2566 }
2567
2568 assert!(deque == &mut array);
2569 assert!(deque != &mut array_x);
2570
2571 assert!(deque == array);
2572 assert!(deque != array_x);
2573
2574 assert!(deque == Vec::from(array));
2575 assert!(deque != Vec::from(array_x));
2576
2577 assert!(deque == prepare_deque(5, array, 0));
2578 assert!(deque != prepare_deque(1, array_x, 5));
2579 }
2580
2581 #[test]
2582 fn hash() {
2583 let deque1 = prepare_deque(3, ['A', 'B', 'C'], 5);
2584 let deque2 = {
2585 let mut d = LinearDeque::new();
2586 d.push_back('B');
2587 d.push_front('A');
2588 d.push_back('C');
2589 d
2590 };
2591 let mut hasher1 = DefaultHasher::new();
2592 let mut hasher2 = DefaultHasher::new();
2593
2594 deque1.hash(&mut hasher1);
2595 deque2.hash(&mut hasher2);
2596
2597 assert_eq!(hasher1.finish(), hasher2.finish());
2598 }
2599
2600 #[test]
2601 fn from_iter() {
2602 let deque = LinearDeque::from_iter('A'..='D');
2603
2604 assert_deque!(deque, 0, ['A', 'B', 'C', 'D'], 0);
2605 }
2606
2607 #[test]
2608 fn from_iter_zst() {
2609 let deque = LinearDeque::from_iter(std::iter::repeat(()).take(4));
2610
2611 assert_zst_deque!(deque, 4);
2612 }
2613
2614 #[test]
2615 fn read() {
2616 let mut deque = prepare_deque(1, b'A'..=b'E', 2);
2617 let mut buf = [b'0'; 3];
2619
2620 let result = deque.read(&mut buf);
2621
2622 assert_eq!(result.unwrap(), 3);
2623 assert_eq!(buf, [b'A', b'B', b'C']);
2624 assert_deque!(deque, 4, [b'D', b'E'], 2);
2626 }
2627
2628 #[test]
2629 fn write() {
2630 let mut deque = prepare_deque(2, b'A'..=b'C', 1);
2631 let buf: Vec<_> = (b'D'..=b'H').collect();
2633
2634 let result = deque.write(&buf);
2635
2636 assert_eq!(result.unwrap(), 5);
2637 assert_deque!(deque, 0, b'A'..=b'H', 1);
2639 }
2640
2641 #[test]
2642 fn clone() {
2643 let mut deque = prepare_deque(2, 'A'..='C', 1);
2644 let mut clone = deque.clone();
2647
2648 deque[1] = 'x';
2649 clone[1] = 'y';
2650 assert_deque!(deque, 2, ['A', 'x', 'C'], 1);
2651 assert_deque!(clone, 0, ['A', 'y', 'C'], 0);
2652 }
2653}