1#![warn(missing_docs)]
2#![doc(test(attr(deny(warnings))))]
3
4use std::cmp::Ordering;
32use std::fmt::Debug;
33use std::hash::Hash;
34use std::io::{Read, Write};
35use std::marker::PhantomData;
36use std::ops::{Bound, Deref, DerefMut, RangeBounds};
37use std::ptr;
38use std::{cmp, mem};
39
40use buffer::Buffer;
41use iter::RawValIter;
42
43mod buffer;
44mod iter;
45
46#[cfg(test)]
47mod drop_tracker;
48
49pub struct LinearDeque<T> {
63 buf: Buffer<T>,
64 len: usize,
65 off: usize,
66}
67
68unsafe impl<T: Send> Send for LinearDeque<T> {}
69unsafe impl<T: Sync> Sync for LinearDeque<T> {}
70
71impl<T> LinearDeque<T> {
72 fn ptr(&self) -> *mut T {
73 self.buf.ptr.as_ptr()
74 }
75
76 fn cap(&self) -> usize {
77 self.buf.cap
78 }
79
80 pub fn new() -> Self {
90 Self::with_reserved_space(0, 0)
91 }
92
93 pub fn with_reserved_space(front: usize, back: usize) -> Self {
107 let mut buf = Buffer::new();
108
109 let cap = front + back;
110 if cap > 0 && !is_zst::<T>() {
111 buf.realloc(cap);
112 }
113
114 LinearDeque {
115 buf,
116 len: 0,
117 off: front,
118 }
119 }
120
121 pub fn front(&self) -> Option<&T> {
137 self.first()
138 }
139
140 pub fn front_mut(&mut self) -> Option<&mut T> {
160 self.first_mut()
161 }
162
163 pub fn back(&self) -> Option<&T> {
179 self.last()
180 }
181
182 pub fn back_mut(&mut self) -> Option<&mut T> {
202 self.last_mut()
203 }
204
205 pub fn push_front(&mut self, elem: T) {
218 if !is_zst::<T>() {
219 self.ensure_reserved_front_space(1);
220 unsafe {
221 self.off -= 1;
222 ptr::write(self.ptr().add(self.off), elem);
223 }
224 }
225 self.len += 1;
226 }
227
228 pub fn push_back(&mut self, elem: T) {
241 self.ensure_reserved_back_space(1);
242 unsafe {
243 ptr::write(self.ptr().add(self.off + self.len), elem);
244 }
245
246 self.len += 1;
247 }
248
249 pub fn pop_front(&mut self) -> Option<T> {
266 if self.len == 0 {
267 None
268 } else {
269 self.len -= 1;
270 self.off += 1;
271 unsafe { Some(ptr::read(self.ptr().add(self.off - 1))) }
272 }
273 }
274
275 pub fn pop_back(&mut self) -> Option<T> {
290 if self.len == 0 {
291 None
292 } else {
293 self.len -= 1;
294 unsafe { Some(ptr::read(self.ptr().add(self.off + self.len))) }
295 }
296 }
297
298 pub fn insert(&mut self, index: usize, elem: T) {
326 assert!(index <= self.len, "index out of bounds");
327
328 if !is_zst::<T>() {
329 if 2 * index < self.len {
330 unsafe {
332 let pending_copy = self.prepare_reserved_front_space(1);
333 let (mut front_copy, back_copy) = pending_copy.split(index);
334 front_copy.dst -= 1;
335 back_copy.perform(self.ptr());
336 front_copy.perform(self.ptr());
337 self.off -= 1;
338 ptr::write(self.ptr().add(self.off + index), elem);
339 }
340 } else {
341 unsafe {
343 let pending_copy = self.prepare_reserved_back_space(1);
344 let (front_copy, mut back_copy) = pending_copy.split(index);
345 back_copy.dst += 1;
346 front_copy.perform(self.ptr());
347 back_copy.perform(self.ptr());
348 ptr::write(self.ptr().add(self.off + index), elem);
349 }
350 }
351 }
352 self.len += 1;
353 }
354
355 pub fn remove(&mut self, index: usize) -> Option<T> {
377 if index < self.len {
378 unsafe {
379 let start = self.ptr().add(self.off);
380 let result = ptr::read(start.add(index));
381
382 if index < self.len / 2 {
383 ptr::copy(start, start.add(1), index);
385 self.off += 1;
386 } else {
387 ptr::copy(start.add(index + 1), start.add(index), self.len - index - 1);
389 }
390 self.len -= 1;
391
392 Some(result)
393 }
394 } else {
395 None
396 }
397 }
398
399 pub fn drain<R>(&mut self, range: R) -> Drain<T>
430 where
431 R: RangeBounds<usize>,
432 {
433 let start = match range.start_bound() {
434 Bound::Included(&start) => start,
435 Bound::Excluded(start) => start.checked_add(1).expect("invalid start index"),
436 Bound::Unbounded => 0,
437 };
438
439 let end = match range.end_bound() {
440 Bound::Included(end) => end.checked_add(1).expect("invalid end index"),
441 Bound::Excluded(&end) => end,
442 Bound::Unbounded => self.len,
443 };
444
445 if start > end || end > self.len {
446 panic!("invalid range");
447 }
448
449 let iter = unsafe { RawValIter::new(&self[start..end]) };
450
451 let front_len = start;
452 let back_len = self.len - end;
453 let count = end - start;
454
455 let pending_copy = if front_len < back_len {
456 let prev_off = self.off;
457 self.off += count;
458 PendingCopy {
459 src: prev_off,
460 dst: prev_off + count,
461 count: front_len,
462 }
463 } else {
464 PendingCopy {
465 src: self.off + end,
466 dst: self.off + start,
467 count: back_len,
468 }
469 };
470
471 self.len -= count;
472
473 Drain {
474 iter,
475 pending_copy,
476 ptr: self.ptr(),
477 vec: PhantomData,
478 }
479 }
480
481 pub fn extend_at_front(&mut self, iter: impl IntoIterator<Item = T>) {
498 let iter = iter.into_iter();
499 let (lower, upper) = iter.size_hint();
500 let count = upper.unwrap_or(lower);
501 if count < usize::MAX {
502 self.ensure_reserved_front_space(count);
503 }
504 for elem in iter {
505 self.push_front(elem);
506 }
507 }
508
509 pub fn extend_at_back(&mut self, iter: impl IntoIterator<Item = T>) {
526 let iter = iter.into_iter();
527 let (lower, upper) = iter.size_hint();
528 let count = upper.unwrap_or(lower);
529 if count < usize::MAX {
530 self.ensure_reserved_back_space(count);
531 }
532 for elem in iter {
533 self.push_back(elem);
534 }
535 }
536
537 pub fn resize_at_front_with(&mut self, new_len: usize, mut f: impl FnMut() -> T) {
569 match new_len.cmp(&self.len) {
570 Ordering::Less => self.truncate_at_front(new_len),
571 Ordering::Equal => (),
572 Ordering::Greater => {
573 let count = new_len - self.len;
574 self.set_reserved_space(SetReservedSpace::GrowTo(count), SetReservedSpace::Keep);
575 self.extend_at_front(std::iter::from_fn(|| Some(f())).take(count))
576 }
577 }
578 }
579
580 pub fn resize_at_back_with(&mut self, new_len: usize, mut f: impl FnMut() -> T) {
612 match new_len.cmp(&self.len) {
613 Ordering::Less => self.truncate_at_back(new_len),
614 Ordering::Equal => (),
615 Ordering::Greater => {
616 let count = new_len - self.len;
617 self.set_reserved_space(SetReservedSpace::Keep, SetReservedSpace::GrowTo(count));
618 self.extend_at_back(std::iter::from_fn(|| Some(f())).take(count));
619 }
620 }
621 }
622
623 #[inline]
630 pub fn resize_with(&mut self, new_len: usize, f: impl FnMut() -> T) {
631 self.resize_at_back_with(new_len, f);
632 }
633
634 pub fn retain<F>(&mut self, mut f: F)
664 where
665 F: FnMut(&T) -> bool,
666 {
667 self.retain_mut(|x| f(x));
668 }
669
670 pub fn retain_mut<F>(&mut self, mut f: F)
691 where
692 F: FnMut(&mut T) -> bool,
693 {
694 unsafe {
695 let mut dropped_index_option = None;
696
697 let base = self.ptr().add(self.off);
698 for i in 0..self.len {
699 let p = base.add(i);
700 if f(&mut *p) {
701 if let Some(dropped_index) = dropped_index_option {
702 ptr::copy_nonoverlapping(p, base.add(dropped_index), 1);
703 dropped_index_option = Some(dropped_index + 1);
704 }
705 } else {
706 p.drop_in_place();
707 if dropped_index_option.is_none() {
708 dropped_index_option = Some(i);
709 }
710 }
711 }
712
713 if let Some(dropped_index) = dropped_index_option {
714 self.len = dropped_index;
715 }
716 }
717 }
718
719 pub fn truncate_at_front(&mut self, len: usize) {
739 if len < self.len {
740 unsafe {
741 let count = self.len() - len;
742 let front = self.get_unchecked_mut(..count);
743 ptr::drop_in_place(front);
744 self.off += count;
745 self.len = len;
746 }
747 }
748 }
749
750 pub fn truncate_at_back(&mut self, len: usize) {
770 if len < self.len {
771 unsafe {
772 let back = self.get_unchecked_mut(len..);
773 ptr::drop_in_place(back);
774 self.len = len;
775 }
776 }
777 }
778
779 #[inline]
786 pub fn truncate(&mut self, len: usize) {
787 self.truncate_at_back(len);
788 }
789
790 pub fn clear(&mut self) {
806 self.truncate_at_back(0);
807 self.off = self.cap() / 2;
808 }
809
810 pub fn set_reserved_space(&mut self, front: SetReservedSpace, back: SetReservedSpace) {
828 if is_zst::<T>() {
829 return;
830 }
831
832 let front_space = self.reserved_front_space();
833 let back_space = self.reserved_back_space();
834 let cap = self.cap();
835
836 fn new_space(current: usize, set: SetReservedSpace) -> usize {
837 match set {
838 SetReservedSpace::Keep => current,
839 SetReservedSpace::ShrinkTo(new) => current.min(new),
840 SetReservedSpace::GrowTo(new) => current.max(new),
841 SetReservedSpace::Exact(new) => new,
842 }
843 }
844
845 let new_front_space = new_space(front_space, front);
846 let new_back_space = new_space(back_space, back);
847 let new_cap = new_front_space + self.len + new_back_space;
848
849 if new_cap > cap {
850 self.buf.realloc(new_cap);
851 }
852
853 if new_front_space != front_space {
854 unsafe {
855 ptr::copy(
856 self.ptr().add(front_space),
857 self.ptr().add(new_front_space),
858 self.len,
859 );
860 }
861 self.off = new_front_space;
862 }
863
864 if new_cap < cap {
865 self.buf.realloc(new_cap);
866 }
867 }
868
869 fn ensure_reserved_front_space(&mut self, count: usize) {
870 unsafe {
871 let pending_copy = self.prepare_reserved_front_space(count);
872 pending_copy.perform(self.ptr());
873 }
874 }
875
876 unsafe fn prepare_reserved_front_space(&mut self, count: usize) -> PendingCopy {
877 let mut pending_copy = PendingCopy {
878 src: self.off,
879 dst: self.off,
880 count: self.len,
881 };
882
883 if self.reserved_front_space() >= count {
884 } else {
886 let total_reserved_space = self.cap() - self.len;
887 self.off = if total_reserved_space >= count {
888 (total_reserved_space + count) / 2
889 } else {
890 let growth = cmp::max(1, self.len);
891 let new_cap = if count > total_reserved_space + growth {
892 self.len + count
893 } else {
894 self.cap() + growth
895 };
896 self.buf.realloc(new_cap);
897 new_cap - self.len
898 };
899 pending_copy.dst = self.off;
900 }
901
902 debug_assert!(self.reserved_front_space() >= count);
903
904 pending_copy
905 }
906
907 fn ensure_reserved_back_space(&mut self, count: usize) {
908 unsafe {
909 let pending_copy = self.prepare_reserved_back_space(count);
910 pending_copy.perform(self.ptr());
911 }
912 }
913
914 unsafe fn prepare_reserved_back_space(&mut self, count: usize) -> PendingCopy {
915 let mut pending_copy = PendingCopy {
916 src: self.off,
917 dst: self.off,
918 count: self.len,
919 };
920
921 if self.reserved_back_space() >= count {
922 } else {
924 let total_reserved_space = self.cap() - self.len;
925 self.off = if total_reserved_space >= count {
926 (total_reserved_space - count) / 2
927 } else {
928 let growth = cmp::max(1, self.len);
929 let new_cap = if count > total_reserved_space + growth {
930 self.len + count
931 } else {
932 self.cap() + growth
933 };
934 self.buf.realloc(new_cap);
935 0
936 };
937 pending_copy.dst = self.off;
938 }
939
940 debug_assert!(self.reserved_back_space() >= count);
941
942 pending_copy
943 }
944
945 pub fn reserved_front_space(&self) -> usize {
957 if is_zst::<T>() {
958 usize::MAX
959 } else {
960 self.off
961 }
962 }
963
964 pub fn reserved_back_space(&self) -> usize {
976 if is_zst::<T>() {
977 usize::MAX
978 } else {
979 self.cap() - self.len - self.off
980 }
981 }
982}
983
984impl<T: Clone> LinearDeque<T> {
985 pub fn resize_at_front(&mut self, new_len: usize, value: T) {
1014 self.resize_at_front_with(new_len, || value.clone());
1015 }
1016
1017 pub fn resize_at_back(&mut self, new_len: usize, value: T) {
1046 self.resize_at_back_with(new_len, || value.clone());
1047 }
1048
1049 #[inline]
1056 pub fn resize(&mut self, new_len: usize, value: T) {
1057 self.resize_at_back(new_len, value);
1058 }
1059}
1060
1061impl<T> Default for LinearDeque<T> {
1062 fn default() -> Self {
1063 Self::new()
1064 }
1065}
1066
1067impl<T> Drop for LinearDeque<T> {
1068 fn drop(&mut self) {
1069 while self.pop_back().is_some() {}
1070 }
1071}
1072
1073impl<T> Deref for LinearDeque<T> {
1074 type Target = [T];
1075
1076 fn deref(&self) -> &Self::Target {
1077 unsafe { std::slice::from_raw_parts(self.ptr().add(self.off), self.len) }
1078 }
1079}
1080
1081impl<T> DerefMut for LinearDeque<T> {
1082 fn deref_mut(&mut self) -> &mut Self::Target {
1083 unsafe { std::slice::from_raw_parts_mut(self.ptr().add(self.off), self.len) }
1084 }
1085}
1086
1087impl<T> Extend<T> for LinearDeque<T> {
1088 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
1094 self.extend_at_back(iter);
1095 }
1096}
1097
1098impl<'a, T> Extend<&'a T> for LinearDeque<T>
1099where
1100 T: 'a + Copy,
1101{
1102 fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
1103 self.extend(iter.into_iter().copied());
1104 }
1105}
1106
1107impl<T> IntoIterator for LinearDeque<T> {
1108 type Item = T;
1109
1110 type IntoIter = IntoIter<T>;
1111
1112 fn into_iter(self) -> Self::IntoIter {
1113 unsafe {
1114 let iter = RawValIter::new(&self);
1115
1116 let buf = ptr::read(&self.buf);
1117 mem::forget(self);
1118
1119 IntoIter { iter, _buf: buf }
1120 }
1121 }
1122}
1123
1124macro_rules! impl_partial_eq {
1125 ([$($n:tt)*] $rhs:ty) => {
1126 impl<T, U, $($n)*> PartialEq<$rhs> for LinearDeque<T>
1127 where
1128 T: PartialEq<U>,
1129 {
1130 fn eq(&self, other: & $rhs) -> bool {
1131 self.deref() == other.deref()
1132 }
1133 }
1134 };
1135}
1136
1137impl_partial_eq!([const N: usize] [U; N]);
1138impl_partial_eq!([const N: usize] &[U; N]);
1139impl_partial_eq!([const N: usize] &mut [U; N]);
1140impl_partial_eq!([] & [U]);
1141impl_partial_eq!([] &mut [U]);
1142impl_partial_eq!([] Vec<U>);
1143impl_partial_eq!([] LinearDeque<U>);
1144
1145impl<T: Eq> Eq for LinearDeque<T> {}
1146
1147impl<T: PartialOrd> PartialOrd for LinearDeque<T> {
1148 fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
1149 self.iter().partial_cmp(other.iter())
1150 }
1151}
1152
1153impl<T: Ord> Ord for LinearDeque<T> {
1154 fn cmp(&self, other: &Self) -> std::cmp::Ordering {
1155 self.iter().cmp(other.iter())
1156 }
1157}
1158
1159impl<T: Hash> Hash for LinearDeque<T> {
1160 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
1161 self.deref().hash(state);
1162 }
1163}
1164
1165impl<T, const N: usize> From<[T; N]> for LinearDeque<T> {
1166 fn from(value: [T; N]) -> Self {
1175 Self::from_iter(value)
1176 }
1177}
1178
1179impl<T> From<Vec<T>> for LinearDeque<T> {
1180 fn from(value: Vec<T>) -> Self {
1182 Self::from_iter(value)
1183 }
1184}
1185
1186impl<T> FromIterator<T> for LinearDeque<T> {
1187 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
1188 let iter = iter.into_iter();
1189 let (lower, upper) = iter.size_hint();
1190 let size = upper.unwrap_or(lower);
1191 let mut deque = Self::with_reserved_space(0, size);
1192 for elem in iter {
1193 deque.push_back(elem);
1194 }
1195 deque
1196 }
1197}
1198
1199impl Read for LinearDeque<u8> {
1200 fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
1201 let result = (self.deref() as &[u8]).read(buf);
1202 if let Ok(ref count) = result {
1203 self.truncate_at_front(self.len - count);
1204 }
1205 result
1206 }
1207}
1208
1209impl Write for LinearDeque<u8> {
1210 fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
1211 self.extend(buf);
1212 Ok(buf.len())
1213 }
1214
1215 fn flush(&mut self) -> std::io::Result<()> {
1216 Ok(())
1217 }
1218}
1219
1220impl<T: Clone> Clone for LinearDeque<T> {
1221 fn clone(&self) -> Self {
1222 let mut clone = Self::with_reserved_space(0, self.len);
1223 for elem in self.iter() {
1224 clone.push_back(elem.clone());
1225 }
1226 clone
1227 }
1228}
1229
1230impl<T: Debug> Debug for LinearDeque<T> {
1231 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1232 f.debug_struct("LinearDeque")
1233 .field("values", &self.deref())
1234 .field(
1235 "reserved_spaces",
1236 &(self.reserved_front_space(), self.reserved_back_space()),
1237 )
1238 .finish()
1239 }
1240}
1241
1242#[derive(Clone, Copy, Debug)]
1243#[must_use]
1244struct PendingCopy {
1245 src: usize,
1246 dst: usize,
1247 count: usize,
1248}
1249
1250impl PendingCopy {
1251 unsafe fn perform<T>(self, ptr: *mut T) {
1252 if self.count > 0 && self.src != self.dst {
1253 ptr::copy(ptr.add(self.src), ptr.add(self.dst), self.count);
1254 }
1255 }
1256
1257 fn split(self, index: usize) -> (PendingCopy, PendingCopy) {
1258 let low = PendingCopy {
1259 count: index,
1260 ..self
1261 };
1262 let high = PendingCopy {
1263 src: self.src + index,
1264 dst: self.dst + index,
1265 count: self.count - index,
1266 };
1267 (low, high)
1268 }
1269}
1270
1271#[derive(Clone, Copy, PartialEq, Eq, Debug)]
1276pub enum SetReservedSpace {
1277 Keep,
1279
1280 ShrinkTo(usize),
1284
1285 GrowTo(usize),
1289
1290 Exact(usize),
1292}
1293
1294pub struct IntoIter<T> {
1302 _buf: Buffer<T>,
1303 iter: RawValIter<T>,
1304}
1305
1306impl<T> Iterator for IntoIter<T> {
1307 type Item = T;
1308
1309 fn next(&mut self) -> Option<Self::Item> {
1310 self.iter.next()
1311 }
1312
1313 fn size_hint(&self) -> (usize, Option<usize>) {
1314 self.iter.size_hint()
1315 }
1316}
1317
1318impl<T> DoubleEndedIterator for IntoIter<T> {
1319 fn next_back(&mut self) -> Option<Self::Item> {
1320 self.iter.next_back()
1321 }
1322}
1323
1324impl<T> Drop for IntoIter<T> {
1325 fn drop(&mut self) {
1326 for _ in &mut *self {}
1327 }
1328}
1329
1330pub struct Drain<'a, T: 'a> {
1337 vec: PhantomData<&'a mut LinearDeque<T>>,
1338 iter: RawValIter<T>,
1339 pending_copy: PendingCopy,
1340 ptr: *mut T,
1341}
1342
1343impl<'a, T> Iterator for Drain<'a, T> {
1344 type Item = T;
1345
1346 fn next(&mut self) -> Option<Self::Item> {
1347 self.iter.next()
1348 }
1349
1350 fn size_hint(&self) -> (usize, Option<usize>) {
1351 self.iter.size_hint()
1352 }
1353}
1354
1355impl<'a, T> Drop for Drain<'a, T> {
1356 fn drop(&mut self) {
1357 for _ in &mut *self {}
1358 unsafe {
1359 self.pending_copy.perform(self.ptr);
1360 }
1361 }
1362}
1363
1364fn is_zst<T>() -> bool {
1365 mem::size_of::<T>() == 0
1366}
1367
1368#[cfg(test)]
1369mod tests {
1370 use std::collections::hash_map::DefaultHasher;
1371 use std::fmt::Debug;
1372 use std::hash::{Hash, Hasher};
1373 use std::io::{Read, Write};
1374 use std::{mem, ptr};
1375
1376 use crate::drop_tracker::DropTracker;
1377 use crate::{LinearDeque, SetReservedSpace};
1378
1379 macro_rules! assert_deque {
1380 ($deque:ident, $expected_reserved_front_space:expr, $expected_elems:expr, $expected_reserved_back_space:expr $(,)?) => {{
1381 let expected_reserved_front_space = $expected_reserved_front_space;
1382 let expected_elems: Vec<_> = $expected_elems.into_iter().collect();
1383 let expected_reserved_back_space = $expected_reserved_back_space;
1384
1385 let expected_len = expected_elems.len();
1386 let expected_capacity =
1387 expected_reserved_front_space + expected_len + expected_reserved_back_space;
1388 let expected_off = expected_reserved_front_space;
1389
1390 assert_eq!($deque.cap(), expected_capacity, "cap");
1391 assert_eq!($deque.len, expected_len, "len");
1392 assert_eq!($deque.off, expected_off, "off");
1393 for (i, expected_elem) in expected_elems.into_iter().enumerate() {
1394 let elem = unsafe { ptr::read($deque.ptr().add($deque.off + i)) };
1395 assert_eq!(elem, expected_elem, "index {i}");
1396 }
1397 assert_eq!(
1398 $deque.reserved_front_space(),
1399 expected_reserved_front_space,
1400 "front space"
1401 );
1402 assert_eq!(
1403 $deque.reserved_back_space(),
1404 expected_reserved_back_space,
1405 "back_space"
1406 );
1407 }};
1408 }
1409
1410 fn prepare_deque<T: Clone + Eq + Debug>(
1411 reserved_front_space: usize,
1412 elems: impl IntoIterator<Item = T>,
1413 reserved_back_space: usize,
1414 ) -> LinearDeque<T> {
1415 let elems: Vec<_> = elems.into_iter().collect();
1416 let capacity = reserved_front_space + elems.len() + reserved_back_space;
1417
1418 let mut deque: LinearDeque<T> = LinearDeque::new();
1419 if capacity != 0 {
1420 deque.buf.realloc(capacity);
1421 deque.len = elems.len();
1422 deque.off = reserved_front_space;
1423 for (i, elem) in elems.iter().enumerate() {
1424 unsafe {
1425 ptr::write(deque.ptr().add(deque.off + i), elem.clone());
1426 }
1427 }
1428 }
1429
1430 assert_deque!(deque, reserved_front_space, elems, reserved_back_space);
1431
1432 deque
1433 }
1434
1435 macro_rules! assert_zst_deque {
1436 ($deque:ident, $expected_len:expr) => {{
1437 fn assert_zst_deque<T>(_: &LinearDeque<T>) {
1438 assert_eq!(mem::size_of::<T>(), 0);
1439 }
1440 assert_zst_deque(&$deque);
1441 }
1442 assert_eq!($deque.cap(), usize::MAX);
1443 assert_eq!($deque.len, $expected_len);};
1444 }
1445
1446 fn prepare_zst_deque<T>(len: usize) -> LinearDeque<T> {
1447 assert_eq!(mem::size_of::<T>(), 0);
1448 let mut deque = LinearDeque::new();
1449 deque.len = len;
1450 deque
1451 }
1452
1453 #[test]
1454 fn new_zst() {
1455 let deque: LinearDeque<()> = LinearDeque::new();
1456
1457 assert_zst_deque!(deque, 0);
1458 }
1459
1460 #[test]
1461 fn with_reserved_space() {
1462 let deque: LinearDeque<char> = LinearDeque::with_reserved_space(3, 4);
1463
1464 assert_deque!(deque, 3, [], 4);
1465 }
1466
1467 #[test]
1468 fn with_reserved_space_zst() {
1469 let deque: LinearDeque<()> = LinearDeque::with_reserved_space(3, 4);
1470
1471 assert_zst_deque!(deque, 0);
1472 }
1473
1474 #[test]
1475 fn front_zst() {
1476 let deque: LinearDeque<()> = prepare_zst_deque(0);
1477 assert_eq!(deque.front(), None);
1478
1479 let deque: LinearDeque<()> = prepare_zst_deque(2);
1480 assert_eq!(deque.front(), Some(&()));
1481 }
1482
1483 #[test]
1484 fn back_zst() {
1485 let deque: LinearDeque<()> = prepare_zst_deque(0);
1486 assert_eq!(deque.back(), None);
1487
1488 let deque: LinearDeque<()> = prepare_zst_deque(2);
1489 assert_eq!(deque.back(), Some(&()));
1490 }
1491
1492 #[test]
1493 fn push_front() {
1494 let mut deque: LinearDeque<char> = prepare_deque(2, [], 1);
1495 deque.push_front('A');
1498
1499 assert_deque!(deque, 1, ['A'], 1);
1501
1502 deque.push_front('B');
1503
1504 assert_deque!(deque, 0, ['B', 'A'], 1);
1506
1507 deque.push_front('C');
1508
1509 assert_deque!(deque, 0, ['C', 'B', 'A'], 0);
1511
1512 deque.push_front('D');
1513
1514 assert_deque!(deque, 2, ['D', 'C', 'B', 'A'], 0);
1516
1517 deque.push_front('E');
1518
1519 assert_deque!(deque, 1, ['E', 'D', 'C', 'B', 'A'], 0);
1521 }
1522
1523 #[test]
1524 fn push_front_zst() {
1525 let mut deque = prepare_zst_deque(0);
1526
1527 deque.push_front(());
1528 deque.push_front(());
1529
1530 assert_zst_deque!(deque, 2);
1531 }
1532
1533 #[test]
1534 fn push_back() {
1535 let mut deque: LinearDeque<char> = prepare_deque(1, [], 2);
1536 deque.push_back('A');
1539
1540 assert_deque!(deque, 1, ['A'], 1);
1542
1543 deque.push_back('B');
1544
1545 assert_deque!(deque, 1, ['A', 'B'], 0);
1547
1548 deque.push_back('C');
1549
1550 assert_deque!(deque, 0, ['A', 'B', 'C'], 0);
1552
1553 deque.push_back('D');
1554
1555 assert_deque!(deque, 0, ['A', 'B', 'C', 'D'], 2);
1557
1558 deque.push_back('E');
1559
1560 assert_deque!(deque, 0, ['A', 'B', 'C', 'D', 'E'], 1);
1562 }
1563
1564 #[test]
1565 fn push_back_zst() {
1566 let mut deque = prepare_zst_deque(0);
1567
1568 deque.push_back(());
1569 deque.push_back(());
1570
1571 assert_zst_deque!(deque, 2);
1572 }
1573
1574 #[test]
1575 fn pop_front() {
1576 let mut deque = prepare_deque(1, ['B', 'A'], 2);
1577 let popped = deque.pop_front();
1580
1581 assert_eq!(popped, Some('B'));
1582 assert_deque!(deque, 2, ['A'], 2);
1584
1585 let popped = deque.pop_front();
1586
1587 assert_eq!(popped, Some('A'));
1588 assert_deque!(deque, 3, [], 2);
1590
1591 let popped = deque.pop_front();
1592
1593 assert_eq!(popped, None);
1594 assert_deque!(deque, 3, [], 2);
1595 }
1596
1597 #[test]
1598 fn pop_front_zst() {
1599 let mut deque = prepare_zst_deque(2);
1600
1601 let popped = deque.pop_front();
1602 assert_eq!(popped, Some(()));
1603 assert_zst_deque!(deque, 1);
1604
1605 let popped = deque.pop_front();
1606 assert_eq!(popped, Some(()));
1607 assert_zst_deque!(deque, 0);
1608
1609 let popped = deque.pop_front();
1610 assert_eq!(popped, None);
1611 assert_zst_deque!(deque, 0);
1612 }
1613
1614 #[test]
1615 fn pop_back() {
1616 let mut deque = prepare_deque(2, ['A', 'B'], 1);
1617 let popped = deque.pop_back();
1620
1621 assert_eq!(popped, Some('B'));
1622 assert_deque!(deque, 2, ['A'], 2);
1624
1625 let popped = deque.pop_back();
1626
1627 assert_eq!(popped, Some('A'));
1628 assert_deque!(deque, 2, [], 3);
1630
1631 let popped = deque.pop_back();
1632
1633 assert_eq!(popped, None);
1634 assert_deque!(deque, 2, [], 3);
1635 }
1636
1637 #[test]
1638 fn pop_back_zst() {
1639 let mut deque = prepare_zst_deque(2);
1640
1641 let popped = deque.pop_back();
1642 assert_eq!(popped, Some(()));
1643 assert_zst_deque!(deque, 1);
1644
1645 let popped = deque.pop_back();
1646 assert_eq!(popped, Some(()));
1647 assert_zst_deque!(deque, 0);
1648
1649 let popped = deque.pop_back();
1650 assert_eq!(popped, None);
1651 assert_zst_deque!(deque, 0);
1652 }
1653
1654 #[test]
1655 fn insert_near_front() {
1656 let mut deque = prepare_deque(1, ['A', 'B', 'C'], 1);
1657 deque.insert(1, 'x');
1660
1661 assert_deque!(deque, 0, ['A', 'x', 'B', 'C'], 1);
1663
1664 deque.insert(1, 'y');
1665
1666 assert_deque!(deque, 0, ['A', 'y', 'x', 'B', 'C'], 0);
1668
1669 deque.insert(1, 'z');
1670
1671 assert_deque!(deque, 4, ['A', 'z', 'y', 'x', 'B', 'C'], 0);
1673 }
1674
1675 #[test]
1676 fn insert_near_back() {
1677 let mut deque = prepare_deque(1, ['A', 'B', 'C'], 1);
1678 deque.insert(2, 'x');
1681
1682 assert_deque!(deque, 1, ['A', 'B', 'x', 'C'], 0);
1684
1685 deque.insert(3, 'y');
1686
1687 assert_deque!(deque, 0, ['A', 'B', 'x', 'y', 'C'], 0);
1689
1690 deque.insert(4, 'z');
1691
1692 assert_deque!(deque, 0, ['A', 'B', 'x', 'y', 'z', 'C'], 4);
1694 }
1695
1696 #[test]
1697 fn insert_zst() {
1698 let mut deque = LinearDeque::new();
1699
1700 deque.insert(0, ());
1701 deque.insert(0, ());
1702 deque.insert(2, ());
1703 deque.insert(2, ());
1704
1705 assert_zst_deque!(deque, 4);
1706 }
1707
1708 #[test]
1709 fn remove_near_front() {
1710 let mut deque = prepare_deque(0, ['A', 'B', 'C', 'D'], 0);
1711 let removed = deque.remove(1);
1714
1715 assert_eq!(removed, Some('B'));
1716 assert_deque!(deque, 1, ['A', 'C', 'D'], 0);
1718 }
1719
1720 #[test]
1721 fn remove_near_back() {
1722 let mut deque = prepare_deque(0, ['A', 'B', 'C', 'D'], 0);
1723 let removed = deque.remove(2);
1726
1727 assert_eq!(removed, Some('C'));
1728 assert_deque!(deque, 0, ['A', 'B', 'D'], 1);
1730 }
1731
1732 #[test]
1733 fn remove_zst() {
1734 let mut deque = prepare_zst_deque(3);
1735
1736 let removed = deque.remove(1);
1737 assert_eq!(removed, Some(()));
1738 assert_zst_deque!(deque, 2);
1739
1740 let removed = deque.remove(1);
1741 assert_eq!(removed, Some(()));
1742 assert_zst_deque!(deque, 1);
1743
1744 let removed = deque.remove(0);
1745 assert_eq!(removed, Some(()));
1746 assert_zst_deque!(deque, 0);
1747
1748 let removed = deque.remove(0);
1749 assert_eq!(removed, None);
1750 assert_zst_deque!(deque, 0);
1751 }
1752
1753 #[test]
1754 fn drain_all() {
1755 let mut deque = prepare_deque(2, 'A'..='H', 2);
1756 let drained = deque.drain(..);
1759
1760 assert_eq!(drained.collect::<Vec<_>>(), Vec::from_iter('A'..='H'));
1761 assert_eq!(deque.cap(), 12);
1764 assert!(deque.reserved_front_space() >= 2);
1765 assert!(deque.reserved_back_space() >= 2);
1766 assert!(deque.is_empty());
1767 }
1768
1769 #[test]
1770 fn drain_start() {
1771 let mut deque = prepare_deque(2, 'A'..='H', 2);
1772 let drained = deque.drain(..3);
1775
1776 assert_eq!(drained.collect::<Vec<_>>(), Vec::from_iter('A'..='C'));
1777 assert_deque!(deque, 5, 'D'..='H', 2);
1779 }
1780
1781 #[test]
1782 fn drain_end() {
1783 let mut deque = prepare_deque(2, 'A'..='H', 2);
1784 let drained = deque.drain(5..);
1787
1788 assert_eq!(drained.collect::<Vec<_>>(), Vec::from_iter('F'..='H'));
1789 assert_deque!(deque, 2, 'A'..='E', 5);
1791 }
1792
1793 #[test]
1794 fn drain_near_start() {
1795 let mut deque = prepare_deque(2, 'A'..='H', 2);
1796 let drained = deque.drain(1..5);
1799
1800 assert_eq!(drained.collect::<Vec<_>>(), Vec::from_iter('B'..='E'));
1801 assert_deque!(deque, 6, ['A', 'F', 'G', 'H'], 2);
1803 }
1804
1805 #[test]
1806 fn drain_near_end() {
1807 let mut deque = prepare_deque(2, 'A'..='H', 2);
1808 let drained = deque.drain(3..7);
1811
1812 assert_eq!(drained.collect::<Vec<_>>(), Vec::from_iter('D'..='G'));
1813 assert_deque!(deque, 2, ['A', 'B', 'C', 'H'], 6);
1815 }
1816
1817 #[test]
1818 fn drain_nothing() {
1819 let mut deque = prepare_deque(2, 'A'..='H', 2);
1820 let drained = deque.drain(3..3);
1823
1824 assert_eq!(drained.count(), 0);
1825 assert_deque!(deque, 2, 'A'..='H', 2);
1827 }
1828
1829 #[test]
1830 fn drain_not_fully_consumed() {
1831 let mut deque = prepare_deque(2, 'A'..='H', 2);
1832 let mut drained = deque.drain(3..7);
1835 assert_eq!(drained.next(), Some('D'));
1836 drop(drained);
1837
1838 assert_deque!(deque, 2, ['A', 'B', 'C', 'H'], 6);
1840 }
1841
1842 #[test]
1843 fn drain_zst() {
1844 let mut deque: LinearDeque<()> = prepare_zst_deque(8);
1845
1846 let iter = deque.drain(3..5);
1847 assert_eq!(iter.count(), 2);
1848 assert_zst_deque!(deque, 6);
1849
1850 let iter = deque.drain(4..);
1851 assert_eq!(iter.count(), 2);
1852 assert_zst_deque!(deque, 4);
1853
1854 let iter = deque.drain(..2);
1855 assert_eq!(iter.count(), 2);
1856 assert_zst_deque!(deque, 2);
1857
1858 let iter = deque.drain(..);
1859 assert_eq!(iter.count(), 2);
1860 assert_zst_deque!(deque, 0);
1861 }
1862
1863 #[test]
1864 fn extend_at_front() {
1865 let mut deque = prepare_deque(1, ['C', 'D'], 1);
1866 deque.extend_at_front(['B', 'A']);
1869
1870 assert_deque!(deque, 0, 'A'..='D', 0);
1872 }
1873
1874 #[test]
1875 fn extend_at_front_zst() {
1876 let mut deque = prepare_zst_deque(2);
1877
1878 deque.extend_at_front(std::iter::repeat(()).take(4));
1879
1880 assert_zst_deque!(deque, 6);
1881 }
1882
1883 #[test]
1884 fn extend_at_back() {
1885 let mut deque = prepare_deque(1, ['A', 'B'], 1);
1886 deque.extend_at_back(['C', 'D']);
1889
1890 assert_deque!(deque, 0, 'A'..='D', 0);
1892 }
1893
1894 #[test]
1895 fn extend_at_back_zst() {
1896 let mut deque = prepare_zst_deque(2);
1897
1898 deque.extend_at_back(std::iter::repeat(()).take(4));
1899
1900 assert_zst_deque!(deque, 6);
1901 }
1902
1903 #[test]
1904 fn reserved_front_space() {
1905 let deque = prepare_deque(3, 'A'..='D', 4);
1906
1907 assert_eq!(deque.reserved_front_space(), 3);
1908 }
1909
1910 #[test]
1911 fn reserved_front_space_zst() {
1912 let deque: LinearDeque<()> = prepare_zst_deque(5);
1913
1914 assert_eq!(deque.reserved_front_space(), usize::MAX);
1915 }
1916
1917 #[test]
1918 fn reserved_back_space() {
1919 let deque = prepare_deque(3, 'A'..='D', 4);
1920
1921 assert_eq!(deque.reserved_back_space(), 4);
1922 }
1923
1924 #[test]
1925 fn reserved_back_space_zst() {
1926 let deque: LinearDeque<()> = prepare_zst_deque(5);
1927
1928 assert_eq!(deque.reserved_back_space(), usize::MAX);
1929 }
1930
1931 #[test]
1932 fn deref_empty() {
1933 let deque: LinearDeque<char> = prepare_deque(6, [], 4);
1934
1935 assert!(deque.is_empty());
1936 assert_eq!(deque.len(), 0);
1937 }
1938
1939 #[test]
1940 fn deref_non_empty() {
1941 let deque = prepare_deque(2, ['A', 'B', 'C'], 4);
1942
1943 assert!(!deque.is_empty());
1944 assert_eq!(deque.len(), 3);
1945 assert_eq!(deque[0], 'A');
1946 assert_eq!(deque[1], 'B');
1947 assert_eq!(deque[2], 'C');
1948 }
1949
1950 #[test]
1951 fn deref_zst() {
1952 let deque: LinearDeque<()> = prepare_zst_deque(4);
1953
1954 assert!(!deque.is_empty());
1955 assert_eq!(deque.len(), 4);
1956 assert_eq!(deque[0], ());
1957 assert_zst_deque!(deque, 4);
1958 }
1959
1960 #[test]
1961 fn into_iter() {
1962 let deque = prepare_deque(2, ['A', 'B', 'C'], 4);
1963
1964 let mut iter = deque.into_iter();
1965
1966 assert_eq!(iter.next(), Some('A'));
1967 assert_eq!(iter.next(), Some('B'));
1968 assert_eq!(iter.next(), Some('C'));
1969 assert_eq!(iter.next(), None);
1970 }
1971
1972 #[test]
1973 fn into_iter_double_ended() {
1974 let deque = prepare_deque(2, ['A', 'B', 'C'], 4);
1975
1976 let mut iter = deque.into_iter();
1977
1978 assert_eq!(iter.next_back(), Some('C'));
1979 assert_eq!(iter.next_back(), Some('B'));
1980 assert_eq!(iter.next_back(), Some('A'));
1981 assert_eq!(iter.next_back(), None);
1982 }
1983
1984 #[test]
1985 fn into_iter_mixed() {
1986 let deque = prepare_deque(2, ['A', 'B', 'C'], 4);
1987
1988 let mut iter = deque.into_iter();
1989
1990 assert_eq!(iter.next_back(), Some('C'));
1991 assert_eq!(iter.next(), Some('A'));
1992 assert_eq!(iter.next_back(), Some('B'));
1993 assert_eq!(iter.next(), None);
1994 assert_eq!(iter.next_back(), None);
1995 }
1996
1997 #[test]
1998 fn into_iter_zst() {
1999 let deque: LinearDeque<()> = prepare_zst_deque(4);
2000
2001 let iter = deque.into_iter();
2002
2003 assert_eq!(iter.count(), 4);
2004 }
2005
2006 #[test]
2007 fn resize_at_front_larger() {
2008 let mut deque = prepare_deque(2, ['A', 'B', 'C', 'D'], 3);
2009 deque.resize_at_front(10, 'x');
2012
2013 assert_deque!(
2015 deque,
2016 0,
2017 ['x', 'x', 'x', 'x', 'x', 'x', 'A', 'B', 'C', 'D'],
2018 3
2019 );
2020 }
2021
2022 #[test]
2023 fn resize_at_front_smaller() {
2024 let mut deque = prepare_deque(2, ['A', 'B', 'C', 'D'], 3);
2025 deque.resize_at_front(3, 'x');
2028
2029 assert_deque!(deque, 3, ['B', 'C', 'D'], 3);
2031 }
2032
2033 #[test]
2034 fn resize_at_front_zst() {
2035 let mut deque = prepare_zst_deque(5);
2036
2037 deque.resize_at_front(2, ());
2038 assert_zst_deque!(deque, 2);
2039
2040 deque.resize_at_front(4, ());
2041 assert_zst_deque!(deque, 4);
2042 }
2043
2044 #[test]
2045 fn resize_at_back_larger() {
2046 let mut deque = prepare_deque(3, ['A', 'B', 'C', 'D'], 2);
2047 deque.resize_at_back(10, 'x');
2050
2051 assert_deque!(
2053 deque,
2054 3,
2055 ['A', 'B', 'C', 'D', 'x', 'x', 'x', 'x', 'x', 'x'],
2056 0
2057 );
2058 }
2059
2060 #[test]
2061 fn resize_at_back_smaller() {
2062 let mut deque = prepare_deque(3, ['A', 'B', 'C', 'D'], 2);
2063 deque.resize_at_back(3, 'x');
2066
2067 assert_deque!(deque, 3, ['A', 'B', 'C'], 3);
2069 }
2070
2071 #[test]
2072 fn resize_at_back_zst() {
2073 let mut deque = prepare_zst_deque(5);
2074
2075 deque.resize_at_back(2, ());
2076 assert_zst_deque!(deque, 2);
2077
2078 deque.resize_at_back(4, ());
2079 assert_zst_deque!(deque, 4);
2080 }
2081
2082 #[test]
2083 fn resize_at_front_with_larger() {
2084 let mut deque = prepare_deque(2, 'A'..='D', 3);
2085 let mut chars = 'a'..;
2087
2088 deque.resize_at_front_with(7, || chars.next().unwrap());
2089
2090 assert_deque!(deque, 0, ['c', 'b', 'a', 'A', 'B', 'C', 'D'], 3);
2092 }
2093
2094 #[test]
2095 fn resize_at_front_with_smaller() {
2096 let mut deque = prepare_deque(2, 'A'..='D', 3);
2097 let mut chars = 'a'..;
2099
2100 deque.resize_at_front_with(3, || chars.next().unwrap());
2101
2102 assert_deque!(deque, 3, ['B', 'C', 'D'], 3);
2104 }
2105
2106 #[test]
2107 fn resize_at_front_with_zst() {
2108 let mut deque = prepare_zst_deque(5);
2109
2110 deque.resize_at_front_with(2, || ());
2111 assert_zst_deque!(deque, 2);
2112
2113 deque.resize_at_front_with(4, || ());
2114 assert_zst_deque!(deque, 4);
2115 }
2116
2117 #[test]
2118 fn resize_at_back_with_larger() {
2119 let mut deque = prepare_deque(3, 'A'..='D', 2);
2120 let mut chars = 'a'..;
2122
2123 deque.resize_at_back_with(7, || chars.next().unwrap());
2124
2125 assert_deque!(deque, 3, ['A', 'B', 'C', 'D', 'a', 'b', 'c'], 0);
2127 }
2128
2129 #[test]
2130 fn resize_at_back_with_smaller() {
2131 let mut deque = prepare_deque(2, 'A'..='D', 3);
2132 let mut chars = 'a'..;
2134
2135 deque.resize_at_back_with(3, || chars.next().unwrap());
2136
2137 assert_deque!(deque, 2, ['A', 'B', 'C'], 4);
2139 }
2140
2141 #[test]
2142 fn resize_at_back_with_zst() {
2143 let mut deque = prepare_zst_deque(5);
2144
2145 deque.resize_at_back_with(2, || ());
2146 assert_zst_deque!(deque, 2);
2147
2148 deque.resize_at_back_with(4, || ());
2149 assert_zst_deque!(deque, 4);
2150 }
2151
2152 #[test]
2153 fn retain() {
2154 let mut drop_tracker = DropTracker::new();
2155 let mut deque = prepare_deque(2, drop_tracker.wrap_iter(['A', 'b', 'c', 'D', 'e']), 1);
2156 let (dropped, _) = drop_tracker.track(|| {
2159 deque.retain(|c| c.value.is_lowercase());
2160 });
2161
2162 assert_deque!(deque, 2, drop_tracker.wrap_iter(['b', 'c', 'e']), 3);
2164 assert_eq!(dropped, ['A', 'D']);
2165 }
2166
2167 #[test]
2168 fn retain_mut() {
2169 let mut drop_tracker = DropTracker::new();
2170 let mut deque = prepare_deque(2, drop_tracker.wrap_iter(['A', 'b', 'c', 'D', 'e']), 1);
2171 let (dropped, _) = drop_tracker.track(|| {
2174 deque.retain_mut(|c| {
2175 if c.value.is_lowercase() {
2176 c.value = c.value.to_uppercase().next().unwrap();
2177 true
2178 } else {
2179 false
2180 }
2181 });
2182 });
2183
2184 assert_deque!(deque, 2, drop_tracker.wrap_iter(['B', 'C', 'E']), 3);
2186 assert_eq!(dropped, ['A', 'D']);
2187 }
2188
2189 #[test]
2190 fn retain_mut_drop_none() {
2191 let mut drop_tracker = DropTracker::new();
2192 let mut deque = prepare_deque(2, drop_tracker.wrap_iter('A'..='E'), 1);
2193 let (dropped, _) = drop_tracker.track(|| {
2196 deque.retain_mut(|_| true);
2197 });
2198
2199 assert_deque!(deque, 2, drop_tracker.wrap_iter('A'..='E'), 1);
2201 assert!(dropped.is_empty());
2202 }
2203
2204 #[test]
2205 fn retain_mut_drop_all() {
2206 let mut drop_tracker = DropTracker::new();
2207 let mut deque = prepare_deque(2, drop_tracker.wrap_iter('A'..='E'), 1);
2208 let (dropped, _) = drop_tracker.track(|| {
2211 deque.retain_mut(|_| false);
2212 });
2213
2214 assert_deque!(deque, 2, [], 6);
2216 assert_eq!(dropped, Vec::from_iter('A'..='E'));
2217 }
2218
2219 #[test]
2220 fn retain_mut_zst() {
2221 let mut deque: LinearDeque<()> = prepare_zst_deque(4);
2222
2223 let mut p = false;
2224 deque.retain(|_| {
2225 p = !p;
2226 p
2227 });
2228
2229 assert_zst_deque!(deque, 2);
2230 }
2231
2232 #[test]
2233 fn truncate_at_front() {
2234 let mut drop_tracker = DropTracker::new();
2235 let mut deque = prepare_deque(5, drop_tracker.wrap_iter('A'..='F'), 1);
2236 let (dropped, _) = drop_tracker.track(|| {
2239 deque.truncate_at_front(2);
2240 });
2241
2242 assert_deque!(deque, 9, drop_tracker.wrap_iter('E'..='F'), 1);
2244 assert_eq!(dropped, Vec::from_iter('A'..='D'));
2245 }
2246
2247 #[test]
2248 fn truncate_at_front_zst() {
2249 let mut deque: LinearDeque<()> = prepare_zst_deque(4);
2250
2251 deque.truncate_at_front(3);
2252
2253 assert_zst_deque!(deque, 3);
2254 }
2255
2256 #[test]
2257 fn truncate_at_back() {
2258 let mut drop_tracker = DropTracker::new();
2259 let mut deque = prepare_deque(1, drop_tracker.wrap_iter('A'..='F'), 5);
2260 let (dropped, _) = drop_tracker.track(|| {
2263 deque.truncate_at_back(2);
2264 });
2265
2266 assert_deque!(deque, 1, drop_tracker.wrap_iter('A'..='B'), 9);
2268 assert_eq!(dropped, Vec::from_iter('C'..='F'));
2269 }
2270
2271 #[test]
2272 fn truncate_at_back_zst() {
2273 let mut deque: LinearDeque<()> = prepare_zst_deque(4);
2274
2275 deque.truncate_at_back(3);
2276
2277 assert_zst_deque!(deque, 3);
2278 }
2279
2280 #[test]
2281 fn clear() {
2282 let mut deque = prepare_deque(2, 'A'..='D', 4);
2283 deque.clear();
2286
2287 assert_deque!(deque, 5, [], 5);
2289 }
2290
2291 #[test]
2292 fn clear_zst() {
2293 let mut deque: LinearDeque<()> = prepare_zst_deque(4);
2294
2295 deque.clear();
2296
2297 assert_zst_deque!(deque, 0);
2298 }
2299
2300 #[test]
2301 fn set_reserved_space_keeping() {
2302 let mut deque = prepare_deque(2, 'A'..='D', 5);
2303 deque.set_reserved_space(SetReservedSpace::Keep, SetReservedSpace::Keep);
2306
2307 assert_deque!(deque, 2, 'A'..='D', 5);
2309 }
2310
2311 #[test]
2312 fn set_reserved_space_growing() {
2313 let mut deque = prepare_deque(3, 'A'..='D', 1);
2314 deque.set_reserved_space(SetReservedSpace::GrowTo(6), SetReservedSpace::GrowTo(2));
2317
2318 assert_deque!(deque, 6, 'A'..='D', 2);
2320 }
2321
2322 #[test]
2323 fn set_reserved_space_not_growing() {
2324 let mut deque = prepare_deque(3, 'A'..='D', 1);
2325 deque.set_reserved_space(SetReservedSpace::GrowTo(2), SetReservedSpace::GrowTo(1));
2328
2329 assert_deque!(deque, 3, 'A'..='D', 1);
2331 }
2332
2333 #[test]
2334 fn set_reserved_space_shrinking() {
2335 let mut deque = prepare_deque(5, 'A'..='D', 2);
2336 deque.set_reserved_space(SetReservedSpace::ShrinkTo(2), SetReservedSpace::ShrinkTo(1));
2339
2340 assert_deque!(deque, 2, 'A'..='D', 1);
2342 }
2343
2344 #[test]
2345 fn set_reserved_space_not_shrinking() {
2346 let mut deque = prepare_deque(5, 'A'..='D', 2);
2347 deque.set_reserved_space(SetReservedSpace::ShrinkTo(6), SetReservedSpace::ShrinkTo(3));
2350
2351 assert_deque!(deque, 5, 'A'..='D', 2);
2353 }
2354
2355 #[test]
2356 fn set_reserved_space_exactly_growing() {
2357 let mut deque = prepare_deque(2, 'A'..='D', 1);
2358 deque.set_reserved_space(SetReservedSpace::Exact(5), SetReservedSpace::Exact(2));
2361
2362 assert_deque!(deque, 5, 'A'..='D', 2);
2364 }
2365
2366 #[test]
2367 fn set_reserved_space_exactly_shrinking() {
2368 let mut deque = prepare_deque(5, 'A'..='D', 2);
2369 deque.set_reserved_space(SetReservedSpace::Exact(2), SetReservedSpace::Exact(1));
2372
2373 assert_deque!(deque, 2, 'A'..='D', 1);
2375 }
2376
2377 #[test]
2378 fn ensure_reserved_front_space_doing_nothing_1() {
2379 let mut deque = prepare_deque(3, 'A'..='C', 1);
2380 deque.ensure_reserved_front_space(1);
2383
2384 assert_deque!(deque, 3, 'A'..='C', 1);
2386 }
2387
2388 #[test]
2389 fn ensure_reserved_front_space_doing_nothing_2() {
2390 let mut deque = prepare_deque(3, 'A'..='C', 1);
2391 deque.ensure_reserved_front_space(3);
2394
2395 assert_deque!(deque, 3, 'A'..='C', 1);
2397 }
2398
2399 #[test]
2400 fn ensure_reserved_front_space_moving_1() {
2401 let mut deque = prepare_deque(1, 'A'..='C', 3);
2402 deque.ensure_reserved_front_space(2);
2405
2406 assert_deque!(deque, 3, 'A'..='C', 1);
2408 }
2409
2410 #[test]
2411 fn ensure_reserved_front_space_moving_2() {
2412 let mut deque = prepare_deque(1, 'A'..='C', 3);
2413 deque.ensure_reserved_front_space(4);
2416
2417 assert_deque!(deque, 4, 'A'..='C', 0);
2419 }
2420
2421 #[test]
2422 fn ensure_reserved_front_space_reallocating_1() {
2423 let mut deque = prepare_deque(2, 'A'..='C', 2);
2424 deque.ensure_reserved_front_space(5);
2427
2428 assert_deque!(deque, 7, 'A'..='C', 0);
2430 }
2431
2432 #[test]
2433 fn ensure_reserved_front_space_reallocating_2() {
2434 let mut deque = prepare_deque(2, 'A'..='C', 2);
2435 deque.ensure_reserved_front_space(8);
2438
2439 assert_deque!(deque, 8, 'A'..='C', 0);
2441 }
2442
2443 #[test]
2444 fn ensure_reserved_back_space_doing_nothing_1() {
2445 let mut deque = prepare_deque(1, 'A'..='C', 3);
2446 deque.ensure_reserved_back_space(1);
2449
2450 assert_deque!(deque, 1, 'A'..='C', 3);
2452 }
2453
2454 #[test]
2455 fn ensure_reserved_back_space_doing_nothing_2() {
2456 let mut deque = prepare_deque(1, 'A'..='C', 3);
2457 deque.ensure_reserved_back_space(3);
2460
2461 assert_deque!(deque, 1, 'A'..='C', 3);
2463 }
2464
2465 #[test]
2466 fn ensure_reserved_back_space_moving_1() {
2467 let mut deque = prepare_deque(3, 'A'..='C', 1);
2468 deque.ensure_reserved_back_space(2);
2471
2472 assert_deque!(deque, 1, 'A'..='C', 3);
2474 }
2475
2476 #[test]
2477 fn ensure_reserved_back_space_moving_2() {
2478 let mut deque = prepare_deque(3, 'A'..='C', 1);
2479 deque.ensure_reserved_back_space(4);
2482
2483 assert_deque!(deque, 0, 'A'..='C', 4);
2485 }
2486
2487 #[test]
2488 fn ensure_reserved_back_space_reallocating_1() {
2489 let mut deque = prepare_deque(2, 'A'..='C', 2);
2490 deque.ensure_reserved_back_space(5);
2493
2494 assert_deque!(deque, 0, 'A'..='C', 7);
2496 }
2497
2498 #[test]
2499 fn ensure_reserved_back_space_reallocating_2() {
2500 let mut deque = prepare_deque(2, 'A'..='C', 2);
2501 deque.ensure_reserved_back_space(8);
2504
2505 assert_deque!(deque, 0, 'A'..='C', 8);
2507 }
2508
2509 #[test]
2510 fn set_reserved_space_zst() {
2511 let mut deque: LinearDeque<()> = prepare_zst_deque(5);
2512
2513 deque.set_reserved_space(SetReservedSpace::Exact(3), SetReservedSpace::Exact(4));
2514
2515 assert_zst_deque!(deque, 5);
2516 }
2517
2518 #[test]
2519 fn eq() {
2520 let mut array = ['A', 'B'];
2521 let mut array_x = ['B', 'A'];
2522
2523 let deque = prepare_deque(1, array, 5);
2524
2525 {
2526 let slice: &[_] = &array;
2527 let slice_x: &[_] = &array_x;
2528
2529 assert!(deque == slice);
2530 assert!(deque != slice_x);
2531 }
2532
2533 assert!(deque == &array);
2534 assert!(deque != &array_x);
2535
2536 {
2537 let slice_mut: &mut [_] = &mut array;
2538 let slice_mut_x: &mut [_] = &mut array_x;
2539
2540 assert!(deque == slice_mut);
2541 assert!(deque != slice_mut_x);
2542 }
2543
2544 assert!(deque == &mut array);
2545 assert!(deque != &mut array_x);
2546
2547 assert!(deque == array);
2548 assert!(deque != array_x);
2549
2550 assert!(deque == Vec::from(array));
2551 assert!(deque != Vec::from(array_x));
2552
2553 assert!(deque == prepare_deque(5, array, 0));
2554 assert!(deque != prepare_deque(1, array_x, 5));
2555 }
2556
2557 #[test]
2558 fn hash() {
2559 let deque1 = prepare_deque(3, ['A', 'B', 'C'], 5);
2560 let deque2 = {
2561 let mut d = LinearDeque::new();
2562 d.push_back('B');
2563 d.push_front('A');
2564 d.push_back('C');
2565 d
2566 };
2567 let mut hasher1 = DefaultHasher::new();
2568 let mut hasher2 = DefaultHasher::new();
2569
2570 deque1.hash(&mut hasher1);
2571 deque2.hash(&mut hasher2);
2572
2573 assert_eq!(hasher1.finish(), hasher2.finish());
2574 }
2575
2576 #[test]
2577 fn from_iter() {
2578 let deque = LinearDeque::from_iter('A'..='D');
2579
2580 assert_deque!(deque, 0, ['A', 'B', 'C', 'D'], 0);
2581 }
2582
2583 #[test]
2584 fn from_iter_zst() {
2585 let deque = LinearDeque::from_iter(std::iter::repeat(()).take(4));
2586
2587 assert_zst_deque!(deque, 4);
2588 }
2589
2590 #[test]
2591 fn read() {
2592 let mut deque = prepare_deque(1, b'A'..=b'E', 2);
2593 let mut buf = [b'0'; 3];
2595
2596 let result = deque.read(&mut buf);
2597
2598 assert_eq!(result.unwrap(), 3);
2599 assert_eq!(buf, [b'A', b'B', b'C']);
2600 assert_deque!(deque, 4, [b'D', b'E'], 2);
2602 }
2603
2604 #[test]
2605 fn write() {
2606 let mut deque = prepare_deque(2, b'A'..=b'C', 1);
2607 let buf: Vec<_> = (b'D'..=b'H').collect();
2609
2610 let result = deque.write(&buf);
2611
2612 assert_eq!(result.unwrap(), 5);
2613 assert_deque!(deque, 0, b'A'..=b'H', 1);
2615 }
2616
2617 #[test]
2618 fn clone() {
2619 let mut deque = prepare_deque(2, 'A'..='C', 1);
2620 let mut clone = deque.clone();
2623
2624 deque[1] = 'x';
2625 clone[1] = 'y';
2626 assert_deque!(deque, 2, ['A', 'x', 'C'], 1);
2627 assert_deque!(clone, 0, ['A', 'y', 'C'], 0);
2628 }
2629}