1#![cfg_attr(
122 feature = "unstable",
123 feature(
124 core_intrinsics,
125 exact_size_is_empty,
126 dropck_eyepatch,
127 trusted_len,
128 ptr_wrapping_offset_from,
129 specialization,
130 )
131)]
132#![cfg_attr(all(test, feature = "unstable"), feature(box_syntax))]
133#![allow(
134 clippy::len_without_is_empty,
135 clippy::shadow_reuse,
136 clippy::cast_possible_wrap,
137 clippy::cast_sign_loss,
138 clippy::cast_possible_truncation,
139 clippy::inline_always,
140 clippy::indexing_slicing
141)]
142#![cfg_attr(not(any(feature = "use_std", test)), no_std)]
143
144#[macro_use]
145mod macros;
146
147#[cfg(any(feature = "use_std", test))]
148extern crate core;
149
150#[cfg(all(
151 any(target_os = "macos", target_os = "ios"),
152 not(feature = "unix_sysv")
153))]
154extern crate mach;
155
156#[cfg(unix)]
157extern crate libc;
158
159#[cfg(target_os = "windows")]
160extern crate winapi;
161
162#[cfg(all(feature = "bytes_buf", feature = "use_std"))]
163extern crate bytes;
164
165mod mirrored;
166pub use mirrored::{AllocError, Buffer};
167
168#[cfg(all(feature = "bytes_buf", feature = "use_std"))]
169use std::io;
170
171use core::{cmp, convert, fmt, hash, iter, mem, ops, ptr, slice, str};
172
173use core::ptr::NonNull;
174
175#[cfg(feature = "unstable")]
176use core::intrinsics;
177
178#[cfg(not(feature = "unstable"))]
180mod intrinsics {
181 #[inline(always)]
183 pub unsafe fn unlikely<T>(x: T) -> T {
184 x
185 }
186
187 #[inline(always)]
189 pub unsafe fn assume<T>(x: T) -> T {
190 x
191 }
192
193 #[inline(always)]
196 pub unsafe fn arith_offset<T>(dst: *const T, offset: isize) -> *const T {
197 let r = if offset >= 0 {
198 (dst as usize).wrapping_add(offset as usize)
199 } else {
200 (dst as usize).wrapping_sub((-offset) as usize)
201 };
202 r as *const T
203 }
204}
205
206trait WrappingOffsetFrom {
208 fn wrapping_offset_from_(self, other: Self) -> Option<isize>;
210}
211
212#[cfg(not(feature = "unstable"))]
213impl<T: Sized> WrappingOffsetFrom for *const T {
214 #[inline(always)]
215 fn wrapping_offset_from_(self, other: Self) -> Option<isize>
216 where
217 T: Sized,
218 {
219 let size = mem::size_of::<T>();
220 if size == 0 {
221 None
222 } else {
223 let diff = (other as isize).wrapping_sub(self as isize);
224 Some(diff / size as isize)
225 }
226 }
227}
228
229#[cfg(feature = "unstable")]
230impl<T: Sized> WrappingOffsetFrom for *const T {
231 #[inline(always)]
232 fn wrapping_offset_from_(self, other: Self) -> Option<isize>
233 where
234 T: Sized,
235 {
236 let size = mem::size_of::<T>();
237 if size == 0 {
238 None
239 } else {
240 Some(other.wrapping_offset_from(self))
241 }
242 }
243}
244
245fn in_bounds<T>(s: &[T], p: *mut T) -> bool {
250 let p = p as usize;
251 let s_begin = s.as_ptr() as usize;
252 let s_end = s_begin + mem::size_of::<T>() * s.len();
253 s_begin <= p && p < s_end
254}
255
256unsafe fn nonnull_raw_slice<T>(ptr: *mut T, len: usize) -> NonNull<[T]> {
257 NonNull::new_unchecked(slice::from_raw_parts_mut(ptr, len))
258}
259
260pub struct SliceDeque<T> {
264 elems_: NonNull<[T]>,
266 buf: Buffer<T>,
268}
269
270unsafe impl<T> Send for SliceDeque<T> where T: Send {}
272unsafe impl<T> Sync for SliceDeque<T> where T: Sync {}
274
275#[doc(hidden)]
277pub use mem::forget as __mem_forget;
278
279#[macro_export]
333macro_rules! sdeq {
334 ($elem:expr; $n:expr) => (
335 {
336 let mut deq = $crate::SliceDeque::with_capacity($n);
337 deq.resize($n, $elem);
338 deq
339 }
340 );
341 () => ( $crate::SliceDeque::new() );
342 ($($x:expr),*) => (
343 {
344 unsafe {
345 let array = [$($x),*];
346 let deq = $crate::SliceDeque::steal_from_slice(&array);
347 #[allow(clippy::forget_copy)]
348 $crate::__mem_forget(array);
349 deq
350 }
351 }
352 );
353 ($($x:expr,)*) => (sdeq![$($x),*])
354}
355
356impl<T> SliceDeque<T> {
357 #[inline]
367 pub fn new() -> Self {
368 unsafe {
369 let buf = Buffer::new();
370 Self {
371 elems_: nonnull_raw_slice(buf.ptr(), 0),
372 buf,
373 }
374 }
375 }
376
377 #[inline]
383 pub unsafe fn from_raw_parts(
384 ptr: *mut T, capacity: usize, elems: &mut [T],
385 ) -> Self {
386 let begin = elems.as_mut_ptr();
387 debug_assert!(in_bounds(slice::from_raw_parts(ptr, capacity), begin));
388 debug_assert!(elems.len() < capacity);
389
390 Self {
391 elems_: NonNull::new_unchecked(elems),
392 buf: Buffer::from_raw_parts(ptr, capacity * 2),
393 }
394 }
395
396 #[inline]
406 pub fn with_capacity(n: usize) -> Self {
407 unsafe {
408 let buf = Buffer::uninitialized(2 * n).unwrap_or_else(|e| {
409 let s = tiny_str!(
410 "failed to allocate a buffer with capacity \"{}\" due to \"{:?}\"",
411 n, e
412 );
413 panic!("{}", s.as_str())
414 });
415 Self {
416 elems_: nonnull_raw_slice(buf.ptr(), 0),
417 buf,
418 }
419 }
420 }
421
422 #[inline]
434 pub fn capacity(&self) -> usize {
435 self.buf.len() / 2
438 }
439
440 #[inline]
452 pub fn len(&self) -> usize {
453 let l = self.as_slice().len();
454 debug_assert!(l <= self.capacity());
455 l
456 }
457
458 #[inline]
469 pub fn is_full(&self) -> bool {
470 self.len() == self.capacity()
471 }
472
473 #[inline]
475 pub fn as_slice(&self) -> &[T] {
476 unsafe { self.elems_.as_ref() }
477 }
478
479 #[inline]
481 pub fn as_mut_slice(&mut self) -> &mut [T] {
482 unsafe { self.elems_.as_mut() }
483 }
484
485 #[inline]
488 pub fn as_slices(&self) -> (&[T], &[T]) {
489 unsafe {
490 let left = self.as_slice();
491 let right =
492 slice::from_raw_parts(usize::max_value() as *const _, 0);
493 (left, right)
494 }
495 }
496
497 #[inline]
500 pub fn as_mut_slices(&mut self) -> (&mut [T], &mut [T]) {
501 unsafe {
502 let left = self.as_mut_slice();
503 let right =
504 slice::from_raw_parts_mut(usize::max_value() as *mut _, 0);
505 (left, right)
506 }
507 }
508
509 pub unsafe fn tail_head_slice(&mut self) -> &mut [T] {
537 let ptr = self.as_mut_slice().as_mut_ptr().add(self.len());
538 slice::from_raw_parts_mut(ptr, self.capacity() - self.len())
539 }
540
541 #[inline]
551 pub fn try_reserve(
552 &mut self, additional: usize,
553 ) -> Result<(), AllocError> {
554 let old_len = self.len();
555 let new_cap = self.grow_policy(additional);
556 self.reserve_capacity(new_cap)?;
557 debug_assert!(self.capacity() >= old_len + additional);
558 Ok(())
559 }
560
561 #[inline]
570 pub fn reserve(&mut self, additional: usize) {
571 self.try_reserve(additional).unwrap();
572 }
573
574 #[inline]
577 fn reserve_capacity(
578 &mut self, new_capacity: usize,
579 ) -> Result<(), AllocError> {
580 unsafe {
581 if new_capacity <= self.capacity() {
582 return Ok(());
583 }
584
585 let mut new_buffer = Buffer::uninitialized(2 * new_capacity)?;
586 debug_assert!(new_buffer.len() >= 2 * new_capacity);
587
588 let len = self.len();
589 {
592 let from_ptr = self.as_mut_ptr();
593 let to_ptr = new_buffer.as_mut_slice().as_mut_ptr();
594 crate::ptr::copy_nonoverlapping(from_ptr, to_ptr, len);
595 }
596
597 crate::mem::swap(&mut self.buf, &mut new_buffer);
599
600 self.elems_ = nonnull_raw_slice(self.buf.ptr(), len);
603 Ok(())
604 }
605 }
606
607 #[inline]
631 pub fn reserve_exact(&mut self, additional: usize) {
632 let old_len = self.len();
633 let new_cap = old_len.checked_add(additional).expect("overflow");
634 self.reserve_capacity(new_cap).unwrap();
635 debug_assert!(self.capacity() >= old_len + additional);
636 }
637
638 #[inline]
641 fn grow_policy(&self, additional: usize) -> usize {
642 let cur_cap = self.capacity();
643 let old_len = self.len();
644 let req_cap = old_len.checked_add(additional).expect("overflow");
645 if req_cap > cur_cap {
646 let dbl_cap = cur_cap.saturating_mul(2);
647 cmp::max(req_cap, dbl_cap)
648 } else {
649 req_cap
650 }
651 }
652
653 #[inline]
667 pub unsafe fn move_head_unchecked(&mut self, x: isize) {
668 let cap = self.capacity();
669 let len = self.len();
670 debug_assert!(x >= -((cap - len) as isize));
672 debug_assert!(x <= len as isize);
673
674 let mut new_begin = self.as_mut_ptr().offset(x) as usize;
676
677 let first_region_begin = self.buf.ptr() as usize;
679 let region_size = Buffer::<T>::size_in_bytes(self.buf.len()) / 2;
680 debug_assert!(cap * mem::size_of::<T>() <= region_size);
681 let second_region_begin = first_region_begin + region_size;
682
683 if new_begin < first_region_begin {
686 new_begin += region_size;
687 } else if new_begin >= second_region_begin {
688 debug_assert!(new_begin < second_region_begin + region_size);
690 new_begin -= region_size;
691 }
692 debug_assert!(new_begin >= first_region_begin);
693 debug_assert!(new_begin < second_region_begin);
694
695 let new_begin = new_begin as *mut T;
697 debug_assert!(in_bounds(
698 slice::from_raw_parts(self.buf.ptr() as *mut u8, region_size),
699 new_begin as *mut u8
700 ));
701
702 let new_len = len as isize - x;
703 debug_assert!(
704 new_len >= 0,
705 "len = {}, x = {}, new_len = {}",
706 len,
707 x,
708 new_len
709 );
710 debug_assert!(new_len <= cap as isize);
711 self.elems_ = nonnull_raw_slice(new_begin, new_len as usize);
712 }
713
714 #[inline]
726 pub unsafe fn move_head(&mut self, x: isize) {
727 assert!(
728 x >= -((self.capacity() - self.len()) as isize)
729 && x <= self.len() as isize
730 );
731 self.move_head_unchecked(x)
732 }
733
734 #[inline]
748 pub unsafe fn move_tail_unchecked(&mut self, x: isize) {
749 let len = self.len();
751 let cap = self.capacity();
752 debug_assert!(x >= -(len as isize));
753 debug_assert!(x <= (cap - len) as isize);
754
755 let new_len = len as isize + x;
756 debug_assert!(new_len >= 0);
757 debug_assert!(new_len <= cap as isize);
758
759 self.elems_ = nonnull_raw_slice(self.as_mut_ptr(), new_len as usize);
760 }
761
762 #[inline]
774 pub unsafe fn move_tail(&mut self, x: isize) {
775 assert!(
776 x >= -(self.len() as isize)
777 && x <= (self.capacity() - self.len()) as isize
778 );
779 self.move_tail_unchecked(x);
780 }
781
782 #[inline]
784 unsafe fn append_elements(&mut self, other: *const [T]) {
785 let count = (*other).len();
786 self.reserve(count);
787 let len = self.len();
788 ptr::copy_nonoverlapping(
789 other as *const T,
790 self.get_unchecked_mut(len),
791 count,
792 );
793 self.move_tail_unchecked(count as isize);
794 }
795
796 pub unsafe fn steal_from_slice(s: &[T]) -> Self {
799 let mut deq = Self::new();
800 deq.append_elements(s as *const _);
801 deq
802 }
803
804 #[inline]
824 pub fn append(&mut self, other: &mut Self) {
825 unsafe {
826 self.append_elements(other.as_slice() as _);
827 other.elems_ = nonnull_raw_slice(other.buf.ptr(), 0);
828 }
829 }
830
831 #[inline]
848 pub fn front(&self) -> Option<&T> {
849 self.get(0)
850 }
851
852 #[inline]
869 pub fn front_mut(&mut self) -> Option<&mut T> {
870 self.get_mut(0)
871 }
872
873 #[inline]
890 pub fn back(&self) -> Option<&T> {
891 let last_idx = self.len().wrapping_sub(1);
892 self.get(last_idx)
893 }
894
895 #[inline]
912 pub fn back_mut(&mut self) -> Option<&mut T> {
913 let last_idx = self.len().wrapping_sub(1);
914 self.get_mut(last_idx)
915 }
916
917 #[inline]
929 pub fn try_push_front(&mut self, value: T) -> Result<(), (T, AllocError)> {
930 unsafe {
931 if intrinsics::unlikely(self.is_full()) {
932 if let Err(e) = self.try_reserve(1) {
933 return Err((value, e));
934 }
935 }
936
937 self.move_head_unchecked(-1);
938 ptr::write(self.get_mut(0).unwrap(), value);
939 Ok(())
940 }
941 }
942
943 #[inline]
959 pub fn push_front(&mut self, value: T) {
960 if let Err(e) = self.try_push_front(value) {
961 panic!("{:?}", e.1);
962 }
963 }
964
965 #[inline]
977 pub fn try_push_back(&mut self, value: T) -> Result<(), (T, AllocError)> {
978 unsafe {
979 if intrinsics::unlikely(self.is_full()) {
980 if let Err(e) = self.try_reserve(1) {
981 return Err((value, e));
982 }
983 }
984 self.move_tail_unchecked(1);
985 let len = self.len();
986 ptr::write(self.get_mut(len - 1).unwrap(), value);
987 Ok(())
988 }
989 }
990
991 #[inline]
1007 pub fn push_back(&mut self, value: T) {
1008 if let Err(e) = self.try_push_back(value) {
1009 panic!("{:?}", e.1);
1010 }
1011 }
1012
1013 #[inline]
1031 pub fn pop_front(&mut self) -> Option<T> {
1032 unsafe {
1033 let v = match self.get_mut(0) {
1034 None => return None,
1035 Some(v) => ptr::read(v),
1036 };
1037 self.move_head_unchecked(1);
1038 Some(v)
1039 }
1040 }
1041
1042 #[inline]
1060 pub fn pop_back(&mut self) -> Option<T> {
1061 unsafe {
1062 let len = self.len();
1063 let v = match self.get_mut(len.wrapping_sub(1)) {
1064 None => return None,
1065 Some(v) => ptr::read(v),
1066 };
1067 self.move_tail_unchecked(-1);
1068 Some(v)
1069 }
1070 }
1071
1072 #[inline]
1091 pub fn shrink_to_fit(&mut self) {
1092 if unsafe { intrinsics::unlikely(self.is_empty()) } {
1093 return;
1094 }
1095
1096 let mut new_sdeq = Self::with_capacity(self.len());
1099 if new_sdeq.capacity() < self.capacity() {
1100 unsafe {
1101 crate::ptr::copy_nonoverlapping(
1102 self.as_mut_ptr(),
1103 new_sdeq.as_mut_ptr(),
1104 self.len(),
1105 );
1106 new_sdeq.elems_ =
1107 nonnull_raw_slice(new_sdeq.buf.ptr(), self.len());
1108 mem::swap(self, &mut new_sdeq);
1109 }
1110 }
1111 }
1112
1113 #[inline]
1131 pub fn truncate_back(&mut self, len: usize) {
1132 unsafe {
1133 if len >= self.len() {
1134 return;
1135 }
1136
1137 let diff = self.len() - len;
1138 let s = &mut self[len..] as *mut [_];
1139 self.move_tail(-(diff as isize));
1142 ptr::drop_in_place(&mut *s);
1143 debug_assert_eq!(self.len(), len);
1144 }
1145 }
1146
1147 #[inline]
1152 pub fn truncate(&mut self, len: usize) {
1153 self.truncate_back(len);
1154 }
1155
1156 #[inline]
1174 pub fn truncate_front(&mut self, len: usize) {
1175 unsafe {
1176 if len >= self.len() {
1177 return;
1178 }
1179
1180 let diff = self.len() - len;
1181 let s = &mut self[..diff] as *mut [_];
1182 self.move_head(diff as isize);
1185 ptr::drop_in_place(&mut *s);
1186 debug_assert_eq!(self.len(), len);
1187 }
1188 }
1189
1190 #[inline]
1221 #[allow(clippy::needless_pass_by_value)]
1222 pub fn drain<R>(&mut self, range: R) -> Drain<T>
1223 where
1224 R: ops::RangeBounds<usize>,
1225 {
1226 use ops::Bound::{Excluded, Included, Unbounded};
1227 let len = self.len();
1239 let start = match range.start_bound() {
1240 Included(&n) => n,
1241 Excluded(&n) => n + 1,
1242 Unbounded => 0,
1243 };
1244 let end = match range.end_bound() {
1245 Included(&n) => n + 1,
1246 Excluded(&n) => n,
1247 Unbounded => len,
1248 };
1249 assert!(start <= end);
1250 assert!(end <= len);
1251
1252 unsafe {
1253 self.elems_ = nonnull_raw_slice(self.as_mut_ptr(), start);
1256 let range_slice = slice::from_raw_parts_mut(
1259 if mem::size_of::<T>() == 0 {
1260 intrinsics::arith_offset(
1261 self.as_mut_ptr() as *mut i8,
1262 start as _,
1263 ) as *mut _
1264 } else {
1265 self.as_mut_ptr().add(start)
1266 },
1267 end - start,
1268 );
1269 Drain {
1270 tail_start: end,
1271 tail_len: len - end,
1272 iter: range_slice.iter(),
1273 deq: NonNull::from(self),
1274 }
1275 }
1276 }
1277
1278 #[inline]
1293 pub fn clear(&mut self) {
1294 self.truncate(0);
1295 }
1296
1297 #[inline]
1313 pub fn swap_remove_back(&mut self, index: usize) -> Option<T> {
1314 let len = self.len();
1315 if self.is_empty() {
1316 None
1317 } else {
1318 self.swap(index, len - 1);
1319 self.pop_back()
1320 }
1321 }
1322
1323 #[inline]
1339 pub fn swap_remove_front(&mut self, index: usize) -> Option<T> {
1340 if self.is_empty() {
1341 None
1342 } else {
1343 self.swap(index, 0);
1344 self.pop_front()
1345 }
1346 }
1347
1348 #[inline]
1371 pub fn insert(&mut self, index: usize, element: T) {
1372 unsafe {
1373 let len = self.len();
1374 assert!(index <= len);
1375
1376 if intrinsics::unlikely(self.is_full()) {
1377 self.reserve(1);
1378 }
1383
1384 let p = if index > self.len() / 2 {
1385 let p = self.as_mut_ptr().add(index);
1386 ptr::copy(p, p.add(1), len - index);
1388 self.move_tail_unchecked(1);
1389 p
1390 } else {
1391 self.move_head_unchecked(-1);
1393 let p = self.as_mut_ptr().add(index);
1394 ptr::copy(p, p.sub(1), index);
1395 p
1396 };
1397 ptr::write(p, element); }
1399 }
1400
1401 #[inline]
1419 #[allow(clippy::shadow_unrelated)] pub fn remove(&mut self, index: usize) -> T {
1421 let len = self.len();
1422 assert!(index < len);
1423 unsafe {
1424 let ptr = self.as_mut_ptr().add(index);
1426 let ret = ptr::read(ptr);
1427 if index > self.len() / 2 {
1428 ptr::copy(ptr.add(1), ptr, len - index - 1);
1431 self.move_tail_unchecked(-1);
1432 } else {
1433 let ptr = self.as_mut_ptr();
1436 ptr::copy(ptr, ptr.add(1), index);
1437 self.move_head_unchecked(1);
1438 }
1439
1440 ret
1441 }
1442 }
1443
1444 #[inline]
1468 pub fn split_off(&mut self, at: usize) -> Self {
1469 assert!(at <= self.len(), "`at` out of bounds");
1470
1471 let other_len = self.len() - at;
1472 let mut other = Self::with_capacity(other_len);
1473
1474 unsafe {
1475 self.move_tail_unchecked(-(other_len as isize));
1476 other.move_tail_unchecked(other_len as isize);
1477
1478 ptr::copy_nonoverlapping(
1479 self.as_ptr().add(at),
1480 other.as_mut_ptr(),
1481 other.len(),
1482 );
1483 }
1484 other
1485 }
1486
1487 #[inline]
1505 pub fn retain<F>(&mut self, mut f: F)
1506 where
1507 F: FnMut(&T) -> bool,
1508 {
1509 let len = self.len();
1510 let mut del = 0;
1511 {
1512 let v = &mut **self;
1513
1514 for i in 0..len {
1515 if !f(&v[i]) {
1516 del += 1;
1517 } else if del > 0 {
1518 v.swap(i - del, i);
1519 }
1520 }
1521 }
1522 if del > 0 {
1523 self.truncate(len - del);
1524 }
1525 }
1526
1527 #[inline]
1545 pub fn dedup_by_key<F, K>(&mut self, mut key: F)
1546 where
1547 F: FnMut(&mut T) -> K,
1548 K: PartialEq,
1549 {
1550 self.dedup_by(|a, b| key(a) == key(b))
1551 }
1552
1553 #[inline]
1578 pub fn dedup_by<F>(&mut self, mut same_bucket: F)
1579 where
1580 F: FnMut(&mut T, &mut T) -> bool,
1581 {
1582 unsafe {
1583 let ln = self.len();
1641 if intrinsics::unlikely(ln <= 1) {
1642 return;
1643 }
1644
1645 let p = self.as_mut_ptr();
1647 let mut r: usize = 1;
1648 let mut w: usize = 1;
1649
1650 while r < ln {
1651 let p_r = p.add(r);
1652 let p_wm1 = p.add(w - 1);
1653 if !same_bucket(&mut *p_r, &mut *p_wm1) {
1654 if r != w {
1655 let p_w = p_wm1.add(1);
1656 mem::swap(&mut *p_r, &mut *p_w);
1657 }
1658 w += 1;
1659 }
1660 r += 1;
1661 }
1662
1663 self.truncate(w);
1664 }
1665 }
1666
1667 #[inline]
1669 fn extend_with<E: ExtendWith<T>>(&mut self, n: usize, value: E) {
1670 self.reserve(n);
1671
1672 unsafe {
1673 let mut ptr = self.as_mut_ptr().add(self.len());
1674
1675 for _ in 1..n {
1677 ptr::write(ptr, value.next());
1678 ptr = ptr.add(1);
1679 self.move_tail_unchecked(1);
1681 }
1682
1683 if n > 0 {
1684 ptr::write(ptr, value.last());
1687 self.move_tail_unchecked(1);
1688 }
1689
1690 }
1692 }
1693
1694 #[inline]
1702 fn extend_desugared<I: Iterator<Item = T>>(&mut self, mut iterator: I) {
1703 #[allow(clippy::while_let_on_iterator)]
1704 while let Some(element) = iterator.next() {
1705 let len = self.len();
1706 let cap = self.capacity();
1707 if len == cap {
1708 let (lower, upper) = iterator.size_hint();
1709 let additional_cap = if let Some(upper) = upper {
1710 upper
1711 } else {
1712 lower
1713 }
1714 .checked_add(1)
1715 .expect("overflow");
1716 self.reserve(additional_cap);
1717 }
1718 debug_assert!(self.len() < self.capacity());
1719 unsafe {
1720 ptr::write(self.get_unchecked_mut(len), element);
1721 self.move_tail_unchecked(1);
1724 }
1725 }
1726 }
1727
1728 #[inline]
1769 pub fn splice<R, I>(
1770 &mut self, range: R, replace_with: I,
1771 ) -> Splice<I::IntoIter>
1772 where
1773 R: ops::RangeBounds<usize>,
1774 I: IntoIterator<Item = T>,
1775 {
1776 Splice {
1777 drain: self.drain(range),
1778 replace_with: replace_with.into_iter(),
1779 }
1780 }
1781
1782 #[inline]
1842 pub fn drain_filter<F>(&mut self, filter: F) -> DrainFilter<T, F>
1843 where
1844 F: FnMut(&mut T) -> bool,
1845 {
1846 let old_len = self.len();
1847
1848 unsafe {
1850 self.move_tail_unchecked(-(old_len as isize));
1851 }
1852
1853 DrainFilter {
1854 deq: self,
1855 idx: 0,
1856 del: 0,
1857 old_len,
1858 pred: filter,
1859 }
1860 }
1861}
1862
1863impl<T> SliceDeque<T>
1864where
1865 T: Clone,
1866{
1867 #[inline]
1887 pub fn extend_from_slice(&mut self, other: &[T]) {
1888 #[cfg(feature = "unstable")]
1889 {
1890 self.spec_extend(other.iter())
1891 }
1892 #[cfg(not(feature = "unstable"))]
1893 {
1894 self.reserve(other.len());
1895 unsafe {
1896 let len = self.len();
1897 self.move_tail_unchecked(other.len() as isize);
1898 self.get_unchecked_mut(len..).clone_from_slice(other);
1899 }
1900 }
1901 }
1902
1903 #[inline]
1924 pub fn resize(&mut self, new_len: usize, value: T) {
1925 let len = self.len();
1926
1927 if new_len > len {
1928 self.reserve(new_len - len);
1929 while self.len() < new_len {
1930 self.push_back(value.clone());
1931 }
1932 } else {
1933 self.truncate(new_len);
1934 }
1935 debug_assert!(self.len() == new_len);
1936 }
1937}
1938
1939impl<T: Default> SliceDeque<T> {
1940 #[inline]
1967 pub fn resize_default(&mut self, new_len: usize) {
1968 let len = self.len();
1969
1970 if new_len > len {
1971 self.extend_with(new_len - len, ExtendDefault);
1972 } else {
1973 self.truncate(new_len);
1974 }
1975 }
1976}
1977
1978impl<T: PartialEq> SliceDeque<T> {
1979 #[inline]
2002 pub fn dedup(&mut self) {
2003 self.dedup_by(|a, b| a == b)
2004 }
2005
2006 #[inline]
2023 pub fn remove_item(&mut self, item: &T) -> Option<T> {
2024 let pos = match self.iter().position(|x| *x == *item) {
2025 Some(x) => x,
2026 None => return None,
2027 };
2028 Some(self.remove(pos))
2029 }
2030}
2031
2032impl<T: fmt::Debug> fmt::Debug for SliceDeque<T> {
2033 fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
2034 write!(f, "{:?}", self.as_slice())
2035 }
2048}
2049
2050impl<T> Drop for SliceDeque<T> {
2051 #[inline]
2052 fn drop(&mut self) {
2053 unsafe {
2057 ptr::drop_in_place(&mut self[..]);
2059 }
2060 }
2062}
2063
2064impl<T> ops::Deref for SliceDeque<T> {
2065 type Target = [T];
2066 #[inline]
2067 fn deref(&self) -> &Self::Target {
2068 self.as_slice()
2069 }
2070}
2071
2072impl<T> ops::DerefMut for SliceDeque<T> {
2073 #[inline]
2074 fn deref_mut(&mut self) -> &mut Self::Target {
2075 self.as_mut_slice()
2076 }
2077}
2078
2079impl<T> Default for SliceDeque<T> {
2080 #[inline]
2081 fn default() -> Self {
2082 Self::new()
2083 }
2084}
2085
2086impl<T: Clone> Clone for SliceDeque<T> {
2087 #[inline]
2088 fn clone(&self) -> Self {
2089 let mut new = Self::with_capacity(self.len());
2090 for i in self.iter() {
2091 new.push_back(i.clone());
2092 }
2093 new
2094 }
2095 #[inline]
2096 fn clone_from(&mut self, other: &Self) {
2097 self.clear();
2098 for i in other.iter() {
2099 self.push_back(i.clone());
2100 }
2101 }
2102}
2103
2104impl<'a, T: Clone> From<&'a [T]> for SliceDeque<T> {
2105 #[inline]
2106 fn from(s: &'a [T]) -> Self {
2107 let mut new = Self::with_capacity(s.len());
2108 for i in s {
2109 new.push_back(i.clone());
2110 }
2111 new
2112 }
2113}
2114
2115impl<'a, T: Clone> From<&'a mut [T]> for SliceDeque<T> {
2116 #[inline]
2117 fn from(s: &'a mut [T]) -> Self {
2118 let mut new = Self::with_capacity(s.len());
2119 for i in s {
2120 new.push_back(i.clone());
2121 }
2122 new
2123 }
2124}
2125
2126impl<T: hash::Hash> hash::Hash for SliceDeque<T> {
2127 #[inline]
2128 fn hash<H: hash::Hasher>(&self, state: &mut H) {
2129 hash::Hash::hash(&**self, state)
2130 }
2131}
2132
2133macro_rules! __impl_slice_eq1 {
2137 ($Lhs:ty, $Rhs:ty) => {
2138 __impl_slice_eq1! { $Lhs, $Rhs, Sized }
2139 };
2140 ($Lhs:ty, $Rhs:ty, $Bound:ident) => {
2141 impl<'a, 'b, A: $Bound, B> PartialEq<$Rhs> for $Lhs
2142 where
2143 A: PartialEq<B>,
2144 {
2145 #[inline]
2146 fn eq(&self, other: &$Rhs) -> bool {
2147 self[..] == other[..]
2148 }
2149 }
2150 };
2151}
2152
2153__impl_slice_eq1! { SliceDeque<A>, SliceDeque<B> }
2154__impl_slice_eq1! { SliceDeque<A>, &'b [B] }
2155__impl_slice_eq1! { SliceDeque<A>, &'b mut [B] }
2156
2157#[cfg(feature = "use_std")]
2158__impl_slice_eq1! { SliceDeque<A>, Vec<B> }
2159
2160macro_rules! array_impls {
2161 ($($N: expr)+) => {
2162 $(
2163 __impl_slice_eq1! { SliceDeque<A>, [B; $N] }
2165 __impl_slice_eq1! { SliceDeque<A>, &'b [B; $N] }
2166 )+
2167 }
2168}
2169
2170array_impls! {
2171 0 1 2 3 4 5 6 7 8 9
2172 10 11 12 13 14 15 16 17 18 19
2173 20 21 22 23 24 25 26 27 28 29
2174 30 31 32
2175}
2176
2177impl<T: Eq> Eq for SliceDeque<T> {}
2180
2181impl<T: PartialOrd> PartialOrd for SliceDeque<T> {
2182 #[inline]
2183 fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
2184 PartialOrd::partial_cmp(&**self, &**other)
2185 }
2186}
2187
2188impl<'a, T: PartialOrd> PartialOrd<&'a [T]> for SliceDeque<T> {
2189 #[inline]
2190 fn partial_cmp(&self, other: &&'a [T]) -> Option<cmp::Ordering> {
2191 PartialOrd::partial_cmp(&**self, other)
2192 }
2193}
2194
2195pub struct Drain<'a, T: 'a> {
2202 tail_start: usize,
2204 tail_len: usize,
2206 iter: slice::Iter<'a, T>,
2208 deq: NonNull<SliceDeque<T>>,
2210}
2211
2212impl<'a, T: 'a + fmt::Debug> fmt::Debug for Drain<'a, T> {
2213 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2214 f.debug_tuple("Drain").field(&self.iter.as_slice()).finish()
2215 }
2216}
2217
2218unsafe impl<'a, T: Sync> Sync for Drain<'a, T> {}
2219unsafe impl<'a, T: Send> Send for Drain<'a, T> {}
2220
2221impl<'a, T> Iterator for Drain<'a, T> {
2222 type Item = T;
2223
2224 #[inline]
2225 fn next(&mut self) -> Option<T> {
2226 self.iter
2227 .next()
2228 .map(|elt| unsafe { ptr::read(elt as *const _) })
2229 }
2230 #[inline]
2231 fn size_hint(&self) -> (usize, Option<usize>) {
2232 self.iter.size_hint()
2233 }
2234}
2235
2236impl<'a, T> DoubleEndedIterator for Drain<'a, T> {
2237 #[inline]
2238 fn next_back(&mut self) -> Option<T> {
2239 self.iter
2240 .next_back()
2241 .map(|elt| unsafe { ptr::read(elt as *const _) })
2242 }
2243}
2244
2245impl<'a, T> Drop for Drain<'a, T> {
2246 #[inline]
2247 fn drop(&mut self) {
2248 self.for_each(|_| {});
2250
2251 if self.tail_len > 0 {
2252 unsafe {
2253 let source_deq = self.deq.as_mut();
2254 let start = source_deq.len();
2256 let tail = self.tail_start;
2257 let src = source_deq.as_ptr().add(tail);
2258 let dst = source_deq.as_mut_ptr().add(start);
2259 ptr::copy(src, dst, self.tail_len);
2260 source_deq.move_tail_unchecked(self.tail_len as isize);
2261 }
2262 }
2263 }
2264}
2265
2266#[cfg(feature = "unstable")]
2267impl<'a, T> ExactSizeIterator for Drain<'a, T> {
2268 #[inline]
2269 fn is_empty(&self) -> bool {
2270 self.iter.is_empty()
2271 }
2272}
2273
2274#[cfg(feature = "unstable")]
2275impl<'a, T> iter::FusedIterator for Drain<'a, T> {}
2276
2277pub struct IntoIter<T> {
2285 buf: NonNull<T>,
2287 cap: usize,
2289 ptr: *const T,
2291 end: *const T,
2293}
2294
2295impl<T: fmt::Debug> fmt::Debug for IntoIter<T> {
2296 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2297 f.debug_tuple("IntoIter").field(&self.as_slice()).finish()
2298 }
2299}
2300
2301impl<T> IntoIter<T> {
2302 #[cfg(feature = "unstable")]
2304 #[allow(clippy::option_unwrap_used)]
2305 #[inline]
2306 fn elems(&mut self) -> &mut [T] {
2307 unsafe {
2308 slice::from_raw_parts_mut(
2309 self.ptr as *mut _,
2310 (self.end as usize - self.ptr as usize) / mem::size_of::<T>(),
2311 )
2312 }
2313 }
2314
2315 #[inline]
2331 pub fn as_slice(&self) -> &[T] {
2332 unsafe { slice::from_raw_parts(self.ptr, self.size_hint().0) }
2333 }
2334
2335 #[inline]
2353 pub fn as_mut_slice(&mut self) -> &mut [T] {
2354 unsafe {
2355 slice::from_raw_parts_mut(self.ptr as *mut T, self.size_hint().0)
2356 }
2357 }
2358}
2359
2360unsafe impl<T: Send> Send for IntoIter<T> {}
2361unsafe impl<T: Sync> Sync for IntoIter<T> {}
2362
2363impl<T> Iterator for IntoIter<T> {
2364 type Item = T;
2365
2366 #[inline]
2367 fn next(&mut self) -> Option<T> {
2368 unsafe {
2369 if self.ptr as *const _ == self.end {
2370 None
2371 } else if mem::size_of::<T>() == 0 {
2372 self.ptr = intrinsics::arith_offset(self.ptr as *const i8, 1)
2376 as *mut T;
2377
2378 Some(ptr::read(1 as *mut T))
2381 } else {
2382 let old = self.ptr;
2383 self.ptr = self.ptr.add(1);
2384
2385 Some(ptr::read(old))
2386 }
2387 }
2388 }
2389
2390 #[inline]
2391 fn size_hint(&self) -> (usize, Option<usize>) {
2392 let exact = match self.ptr.wrapping_offset_from_(self.end) {
2393 Some(x) => x as usize,
2394 None => (self.end as usize).wrapping_sub(self.ptr as usize),
2395 };
2396 (exact, Some(exact))
2397 }
2398
2399 #[inline]
2400 fn count(self) -> usize {
2401 self.size_hint().0
2402 }
2403}
2404
2405impl<T> DoubleEndedIterator for IntoIter<T> {
2406 #[inline]
2407 fn next_back(&mut self) -> Option<T> {
2408 unsafe {
2409 if self.end == self.ptr {
2410 None
2411 } else if mem::size_of::<T>() == 0 {
2412 self.end = intrinsics::arith_offset(self.end as *const i8, -1)
2414 as *mut T;
2415
2416 Some(ptr::read(1 as *mut T))
2419 } else {
2420 self.end = self.end.offset(-1);
2421
2422 Some(ptr::read(self.end))
2423 }
2424 }
2425 }
2426}
2427
2428#[cfg(feature = "unstable")]
2429impl<T> ExactSizeIterator for IntoIter<T> {
2430 #[inline]
2431 fn is_empty(&self) -> bool {
2432 self.ptr == self.end
2433 }
2434}
2435
2436#[cfg(feature = "unstable")]
2437impl<T> iter::FusedIterator for IntoIter<T> {}
2438
2439#[cfg(feature = "unstable")]
2440unsafe impl<T> iter::TrustedLen for IntoIter<T> {}
2441
2442impl<T: Clone> Clone for IntoIter<T> {
2443 #[inline]
2444 fn clone(&self) -> Self {
2445 let mut deq = SliceDeque::<T>::with_capacity(self.size_hint().0);
2446 unsafe {
2447 deq.append_elements(self.as_slice());
2448 }
2449 deq.into_iter()
2450 }
2451}
2452
2453#[cfg(feature = "unstable")]
2454unsafe impl<#[may_dangle] T> Drop for IntoIter<T> {
2455 #[inline]
2456 fn drop(&mut self) {
2457 for _x in self.by_ref() {}
2459
2460 let _ =
2462 unsafe { Buffer::from_raw_parts(self.buf.as_ptr(), 2 * self.cap) };
2463 }
2464}
2465
2466#[cfg(not(feature = "unstable"))]
2467impl<T> Drop for IntoIter<T> {
2468 #[inline]
2469 fn drop(&mut self) {
2470 for _x in self.by_ref() {}
2472
2473 let _ =
2475 unsafe { Buffer::from_raw_parts(self.buf.as_ptr(), 2 * self.cap) };
2476 }
2477}
2478
2479impl<T> IntoIterator for SliceDeque<T> {
2480 type Item = T;
2481 type IntoIter = IntoIter<T>;
2482
2483 #[inline]
2503 fn into_iter(self) -> IntoIter<T> {
2504 unsafe {
2505 let buf_ptr = self.buf.ptr();
2506 intrinsics::assume(!buf_ptr.is_null());
2507 let begin = self.as_ptr();
2508 let end = if mem::size_of::<T>() == 0 {
2509 intrinsics::arith_offset(begin as *const i8, self.len() as _)
2510 as *const _
2511 } else {
2512 begin.add(self.len())
2513 };
2514 assert!(begin as usize <= end as usize);
2515 let it = IntoIter {
2516 buf: NonNull::new_unchecked(buf_ptr),
2517 cap: self.capacity(),
2518 ptr: begin,
2519 end,
2520 };
2521 debug_assert_eq!(self.len(), it.size_hint().0);
2522 #[allow(clippy::mem_forget)]
2523 mem::forget(self);
2524 it
2525 }
2526 }
2527}
2528
2529impl<'a, T> IntoIterator for &'a SliceDeque<T> {
2530 type Item = &'a T;
2531 type IntoIter = slice::Iter<'a, T>;
2532 #[inline]
2533 fn into_iter(self) -> slice::Iter<'a, T> {
2534 self.iter()
2535 }
2536}
2537
2538impl<'a, T> IntoIterator for &'a mut SliceDeque<T> {
2539 type Item = &'a mut T;
2540 type IntoIter = slice::IterMut<'a, T>;
2541 #[inline]
2542 fn into_iter(self) -> slice::IterMut<'a, T> {
2543 self.iter_mut()
2544 }
2545}
2546
2547impl<T> Extend<T> for SliceDeque<T> {
2548 #[inline]
2549 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
2550 <Self as SpecExtend<T, I::IntoIter>>::spec_extend(
2551 self,
2552 iter.into_iter(),
2553 )
2554 }
2555}
2556
2557trait SpecExtend<T, I> {
2560 fn from_iter(iter: I) -> Self;
2562 fn spec_extend(&mut self, iter: I);
2564}
2565
2566#[inline(always)]
2568fn from_iter_default<T, I: Iterator<Item = T>>(
2569 mut iterator: I,
2570) -> SliceDeque<T> {
2571 let mut deque = match iterator.next() {
2577 None => return SliceDeque::<T>::new(),
2578 Some(element) => {
2579 let (lower, _) = iterator.size_hint();
2580 let mut deque =
2581 SliceDeque::<T>::with_capacity(lower.saturating_add(1));
2582 unsafe {
2583 ptr::write(deque.get_unchecked_mut(0), element);
2584 deque.move_tail_unchecked(1);
2585 }
2586 deque
2587 }
2588 };
2589 <SliceDeque<T> as SpecExtend<T, I>>::spec_extend(&mut deque, iterator);
2590 deque
2591}
2592
2593impl<T, I> SpecExtend<T, I> for SliceDeque<T>
2594where
2595 I: Iterator<Item = T>,
2596{
2597 #[cfg(feature = "unstable")]
2598 default fn from_iter(iterator: I) -> Self {
2599 from_iter_default(iterator)
2600 }
2601
2602 #[cfg(feature = "unstable")]
2603 default fn spec_extend(&mut self, iter: I) {
2604 self.extend_desugared(iter)
2605 }
2606
2607 #[cfg(not(feature = "unstable"))]
2608 fn from_iter(iterator: I) -> Self {
2609 from_iter_default(iterator)
2610 }
2611
2612 #[cfg(not(feature = "unstable"))]
2613 fn spec_extend(&mut self, iter: I) {
2614 self.extend_desugared(iter)
2615 }
2616}
2617
2618#[cfg(feature = "unstable")]
2619impl<T, I> SpecExtend<T, I> for SliceDeque<T>
2620where
2621 I: iter::TrustedLen<Item = T>,
2622{
2623 default fn from_iter(iterator: I) -> Self {
2624 let mut deque = Self::new();
2625 <Self as SpecExtend<T, I>>::spec_extend(&mut deque, iterator);
2626 deque
2627 }
2628
2629 #[allow(clippy::use_debug)]
2630 default fn spec_extend(&mut self, iterator: I) {
2631 let (low, high) = iterator.size_hint();
2633 if let Some(high_value) = high {
2634 debug_assert_eq!(
2635 low,
2636 high_value,
2637 "TrustedLen iterator's size hint is not exact: {:?}",
2638 (low, high)
2639 );
2640 }
2641 if let Some(additional) = high {
2642 self.reserve(additional);
2643 unsafe {
2644 let mut ptr = self.as_mut_ptr().add(self.len());
2645 for element in iterator {
2646 ptr::write(ptr, element);
2647 ptr = ptr.add(1);
2648 self.move_tail_unchecked(1);
2651 }
2652 }
2653 } else {
2654 self.extend_desugared(iterator)
2655 }
2656 }
2657}
2658
2659#[cfg(feature = "unstable")]
2660impl<T> SpecExtend<T, IntoIter<T>> for SliceDeque<T> {
2661 fn from_iter(mut iterator: IntoIter<T>) -> Self {
2662 if iterator.buf.as_ptr() as *const _ == iterator.ptr {
2666 unsafe {
2667 let deq = Self::from_raw_parts(
2668 iterator.buf.as_ptr(),
2669 iterator.cap,
2670 iterator.elems(),
2671 );
2672 #[allow(clippy::mem_forget)]
2673 mem::forget(iterator);
2674 deq
2675 }
2676 } else {
2677 let mut deque = Self::new();
2678 deque.spec_extend(iterator);
2679 deque
2680 }
2681 }
2682
2683 fn spec_extend(&mut self, mut iterator: IntoIter<T>) {
2684 unsafe {
2685 self.append_elements(iterator.as_slice() as _);
2686 }
2687 iterator.ptr = iterator.end;
2688 }
2689}
2690
2691#[cfg(not(feature = "unstable"))]
2692impl<'a, T: 'a, I> SpecExtend<&'a T, I> for SliceDeque<T>
2693where
2694 I: Iterator<Item = &'a T>,
2695 T: Clone,
2696{
2697 fn from_iter(iterator: I) -> Self {
2698 SpecExtend::from_iter(iterator.cloned())
2699 }
2700
2701 fn spec_extend(&mut self, iterator: I) {
2702 self.spec_extend(iterator.cloned())
2703 }
2704}
2705
2706#[cfg(feature = "unstable")]
2707impl<'a, T: 'a, I> SpecExtend<&'a T, I> for SliceDeque<T>
2708where
2709 I: Iterator<Item = &'a T>,
2710 T: Clone,
2711{
2712 default fn from_iter(iterator: I) -> Self {
2713 SpecExtend::from_iter(iterator.cloned())
2714 }
2715
2716 default fn spec_extend(&mut self, iterator: I) {
2717 self.spec_extend(iterator.cloned())
2718 }
2719}
2720
2721#[cfg(feature = "unstable")]
2722impl<'a, T: 'a> SpecExtend<&'a T, slice::Iter<'a, T>> for SliceDeque<T>
2723where
2724 T: Copy,
2725{
2726 fn spec_extend(&mut self, iterator: slice::Iter<'a, T>) {
2727 let slice = iterator.as_slice();
2728 self.reserve(slice.len());
2729 unsafe {
2730 let len = self.len();
2731 self.move_tail_unchecked(slice.len() as isize);
2732 self.get_unchecked_mut(len..).copy_from_slice(slice);
2733 }
2734 }
2735}
2736
2737impl<T> iter::FromIterator<T> for SliceDeque<T> {
2738 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
2739 <Self as SpecExtend<T, I::IntoIter>>::from_iter(iter.into_iter())
2740 }
2741}
2742
2743trait ExtendWith<T> {
2745 fn next(&self) -> T;
2747 fn last(self) -> T;
2749}
2750
2751struct ExtendElement<T>(T);
2753impl<T: Clone> ExtendWith<T> for ExtendElement<T> {
2754 fn next(&self) -> T {
2755 self.0.clone()
2756 }
2757 fn last(self) -> T {
2758 self.0
2759 }
2760}
2761
2762struct ExtendDefault;
2764impl<T: Default> ExtendWith<T> for ExtendDefault {
2765 fn next(&self) -> T {
2766 Default::default()
2767 }
2768 fn last(self) -> T {
2769 Default::default()
2770 }
2771}
2772
2773#[doc(hidden)]
2776pub fn from_elem<T: Clone>(elem: T, n: usize) -> SliceDeque<T> {
2777 <T as SpecFromElem>::from_elem(elem, n)
2778}
2779
2780trait SpecFromElem: Sized {
2782 fn from_elem(elem: Self, n: usize) -> SliceDeque<Self>;
2784}
2785
2786impl<T: Clone> SpecFromElem for T {
2787 #[cfg(feature = "unstable")]
2788 default fn from_elem(elem: Self, n: usize) -> SliceDeque<Self> {
2789 let mut v = SliceDeque::with_capacity(n);
2790 v.extend_with(n, ExtendElement(elem));
2791 v
2792 }
2793
2794 #[cfg(not(feature = "unstable"))]
2795 fn from_elem(elem: Self, n: usize) -> SliceDeque<Self> {
2796 let mut v = SliceDeque::with_capacity(n);
2797 v.extend_with(n, ExtendElement(elem));
2798 v
2799 }
2800}
2801
2802#[cfg(feature = "unstable")]
2803impl SpecFromElem for u8 {
2804 #[inline]
2805 fn from_elem(elem: Self, n: usize) -> SliceDeque<Self> {
2806 unsafe {
2807 let mut v = SliceDeque::with_capacity(n);
2808 ptr::write_bytes(v.as_mut_ptr(), elem, n);
2809 v.move_tail_unchecked(n as isize);
2810 v
2811 }
2812 }
2813}
2814
2815macro_rules! impl_spec_from_elem {
2816 ($t:ty, $is_zero:expr) => {
2817 #[cfg(feature = "unstable")]
2818 impl SpecFromElem for $t {
2819 #[inline]
2820 fn from_elem(elem: Self, n: usize) -> SliceDeque<Self> {
2821 let mut v = SliceDeque::with_capacity(n);
2822 v.extend_with(n, ExtendElement(elem));
2823 v
2824 }
2825 }
2826 };
2827}
2828
2829impl_spec_from_elem!(i8, |x| x == 0);
2830impl_spec_from_elem!(i16, |x| x == 0);
2831impl_spec_from_elem!(i32, |x| x == 0);
2832impl_spec_from_elem!(i64, |x| x == 0);
2833#[cfg(feature = "unstable")]
2834impl_spec_from_elem!(i128, |x| x == 0);
2835impl_spec_from_elem!(isize, |x| x == 0);
2836
2837impl_spec_from_elem!(u16, |x| x == 0);
2838impl_spec_from_elem!(u32, |x| x == 0);
2839impl_spec_from_elem!(u64, |x| x == 0);
2840#[cfg(feature = "unstable")]
2841impl_spec_from_elem!(u128, |x| x == 0);
2842impl_spec_from_elem!(usize, |x| x == 0);
2843
2844impl_spec_from_elem!(f32, |x: f32| x == 0. && x.is_sign_positive());
2845impl_spec_from_elem!(f64, |x: f64| x == 0. && x.is_sign_positive());
2846
2847impl<'a, T: 'a + Copy> Extend<&'a T> for SliceDeque<T> {
2855 fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
2856 self.spec_extend(iter.into_iter())
2857 }
2858}
2859
2860#[derive(Debug)]
2868pub struct Splice<'a, I: Iterator + 'a> {
2869 drain: Drain<'a, I::Item>,
2871 replace_with: I,
2873}
2874
2875impl<'a, I: Iterator> Iterator for Splice<'a, I> {
2876 type Item = I::Item;
2877 #[inline]
2878 fn next(&mut self) -> Option<Self::Item> {
2879 self.drain.next()
2880 }
2881 #[inline]
2882 fn size_hint(&self) -> (usize, Option<usize>) {
2883 self.drain.size_hint()
2884 }
2885}
2886
2887impl<'a, I: Iterator> DoubleEndedIterator for Splice<'a, I> {
2888 #[inline]
2889 fn next_back(&mut self) -> Option<Self::Item> {
2890 self.drain.next_back()
2891 }
2892}
2893
2894#[cfg(feature = "unstable")]
2895impl<'a, I: Iterator> ExactSizeIterator for Splice<'a, I> {}
2896
2897#[cfg(feature = "unstable")]
2899impl<'a, I: Iterator> iter::FusedIterator for Splice<'a, I> {}
2900
2901impl<'a, I: Iterator> Drop for Splice<'a, I> {
2902 fn drop(&mut self) {
2903 while let Some(_) = self.drain.next() {}
2905
2906 unsafe {
2907 if self.drain.tail_len == 0 {
2908 self.drain.deq.as_mut().extend(self.replace_with.by_ref());
2909 return;
2910 }
2911
2912 if !self.drain.fill(&mut self.replace_with) {
2914 return;
2915 }
2916
2917 let (lower_bound, _upper_bound) = self.replace_with.size_hint();
2920 if lower_bound > 0 {
2921 self.drain.move_tail_unchecked(lower_bound);
2922 if !self.drain.fill(&mut self.replace_with) {
2923 return;
2924 }
2925 }
2926
2927 let mut collected = self
2931 .replace_with
2932 .by_ref()
2933 .collect::<SliceDeque<I::Item>>()
2934 .into_iter();
2935 if collected.size_hint().0 > 0 {
2937 self.drain.move_tail_unchecked(collected.size_hint().0);
2938 let filled = self.drain.fill(&mut collected);
2939 debug_assert!(filled);
2940 debug_assert_eq!(collected.size_hint().0, 0);
2941 }
2942 }
2943 }
2946}
2947
2948impl<'a, T> Drain<'a, T> {
2950 unsafe fn fill<I: Iterator<Item = T>>(
2956 &mut self, replace_with: &mut I,
2957 ) -> bool {
2958 let deq = self.deq.as_mut();
2959 let range_start = deq.len();
2960 let range_end = self.tail_start;
2961 let range_slice = slice::from_raw_parts_mut(
2962 deq.as_mut_ptr().add(range_start),
2963 range_end - range_start,
2964 );
2965
2966 for place in range_slice {
2967 if let Some(new_item) = replace_with.next() {
2968 ptr::write(place, new_item);
2969 deq.move_tail_unchecked(1);
2970 } else {
2971 return false;
2972 }
2973 }
2974 true
2975 }
2976
2977 unsafe fn move_tail_unchecked(&mut self, extra_capacity: usize) {
2979 let deq = self.deq.as_mut();
2980 let used_capacity = self.tail_start + self.tail_len;
2981 deq.reserve_capacity(used_capacity + extra_capacity)
2982 .expect("oom");
2983
2984 let new_tail_start = self.tail_start + extra_capacity;
2985 let src = deq.as_ptr().add(self.tail_start);
2986 let dst = deq.as_mut_ptr().add(new_tail_start);
2987 ptr::copy(src, dst, self.tail_len);
2988 self.tail_start = new_tail_start;
2989 }
2990}
2991
2992#[derive(Debug)]
2994pub struct DrainFilter<'a, T: 'a, F>
2995where
2996 F: FnMut(&mut T) -> bool,
2997{
2998 deq: &'a mut SliceDeque<T>,
3000 idx: usize,
3002 del: usize,
3004 old_len: usize,
3006 pred: F,
3008}
3009
3010impl<'a, T, F> Iterator for DrainFilter<'a, T, F>
3011where
3012 F: FnMut(&mut T) -> bool,
3013{
3014 type Item = T;
3015
3016 fn next(&mut self) -> Option<T> {
3017 unsafe {
3018 while self.idx != self.old_len {
3019 let i = self.idx;
3020 self.idx += 1;
3021 let v = slice::from_raw_parts_mut(
3022 self.deq.as_mut_ptr(),
3023 self.old_len,
3024 );
3025 if (self.pred)(&mut v[i]) {
3026 self.del += 1;
3027 return Some(ptr::read(&v[i]));
3028 } else if self.del > 0 {
3029 let del = self.del;
3030 let src: *const T = &v[i];
3031 let dst: *mut T = &mut v[i - del];
3032 ptr::copy_nonoverlapping(src, dst, 1);
3036 }
3037 }
3038 None
3039 }
3040 }
3041
3042 fn size_hint(&self) -> (usize, Option<usize>) {
3043 (0, Some(self.old_len - self.idx))
3044 }
3045}
3046
3047impl<'a, T, F> Drop for DrainFilter<'a, T, F>
3048where
3049 F: FnMut(&mut T) -> bool,
3050{
3051 fn drop(&mut self) {
3052 for _ in self.by_ref() {}
3053
3054 unsafe {
3055 let new_len = self.old_len - self.del;
3056 self.deq.move_tail_unchecked(new_len as isize);
3057 }
3058 }
3059}
3060
3061impl<T> convert::AsRef<[T]> for SliceDeque<T> {
3062 fn as_ref(&self) -> &[T] {
3063 &*self
3064 }
3065}
3066
3067impl<T> convert::AsMut<[T]> for SliceDeque<T> {
3068 fn as_mut(&mut self) -> &mut [T] {
3069 &mut *self
3070 }
3071}
3072
3073#[cfg(all(feature = "bytes_buf", feature = "use_std"))]
3074impl ::bytes::BufMut for SliceDeque<u8> {
3075 #[inline]
3076 fn remaining_mut(&self) -> usize {
3077 usize::max_value() - self.len()
3078 }
3079 #[inline]
3080 unsafe fn bytes_mut(&mut self) -> &mut [u8] {
3081 if self.capacity() == self.len() {
3082 self.reserve(64); }
3084
3085 let cap = self.capacity();
3086 let len = self.len();
3087
3088 let ptr = self.as_mut_ptr();
3089 &mut slice::from_raw_parts_mut(ptr, cap)[len..]
3090 }
3091 #[inline]
3092 unsafe fn advance_mut(&mut self, cnt: usize) {
3093 let len = self.len();
3094 let remaining = self.capacity() - len;
3095 if cnt > remaining {
3096 self.reserve(cnt);
3099 }
3100
3101 self.move_tail_unchecked(cnt as isize);
3102 }
3103}
3104
3105#[cfg(all(feature = "bytes_buf", feature = "use_std"))]
3106impl ::bytes::IntoBuf for SliceDeque<u8> {
3107 type Buf = io::Cursor<SliceDeque<u8>>;
3108
3109 fn into_buf(self) -> Self::Buf {
3110 io::Cursor::new(self)
3111 }
3112}
3113
3114#[cfg(all(feature = "bytes_buf", feature = "use_std"))]
3115impl<'a> ::bytes::IntoBuf for &'a SliceDeque<u8> {
3116 type Buf = io::Cursor<&'a [u8]>;
3117
3118 fn into_buf(self) -> Self::Buf {
3119 io::Cursor::new(&self[..])
3120 }
3121}
3122
3123#[cfg(all(feature = "bytes_buf", feature = "use_std"))]
3124impl ::bytes::buf::FromBuf for SliceDeque<u8> {
3125 fn from_buf<T>(buf: T) -> Self
3126 where
3127 T: ::bytes::IntoBuf,
3128 {
3129 use bytes::{Buf, BufMut};
3130 let buf = buf.into_buf();
3131 let mut ret = SliceDeque::with_capacity(buf.remaining());
3132 ret.put(buf);
3133 ret
3134 }
3135}
3136
3137#[cfg(test)]
3138mod tests {
3139 use self::collections::HashMap;
3140 use super::SliceDeque;
3141 use std::cell::RefCell;
3142 use std::rc::Rc;
3143 use std::{collections, fmt, hash, mem};
3144
3145 #[derive(Clone, Debug)]
3146 struct WithDrop {
3147 counter: Rc<RefCell<usize>>,
3148 }
3149
3150 impl Drop for WithDrop {
3151 fn drop(&mut self) {
3152 *self.counter.borrow_mut() += 1;
3153 }
3154 }
3155
3156 fn sizes_to_test() -> Vec<usize> {
3157 let sample = vec![
3158 2, 4, 8, 16, 32, 64,
3159 128, ];
3174 sample.into_iter().collect()
3175 }
3176
3177 fn linear_usize_deque(size: usize) -> SliceDeque<usize> {
3178 let mut v: SliceDeque<usize> = SliceDeque::new();
3179 for i in 0..size {
3180 v.push_back(i);
3181 assert_eq!(v.len(), i + 1);
3182 for j in 0..v.len() {
3183 assert_eq!(*v.get(j).unwrap(), j);
3184 }
3185 }
3186 assert_eq!(v.len(), size);
3187 for i in 0..size {
3188 assert_eq!(*v.get(i).unwrap(), i);
3189 }
3190 v
3191 }
3192
3193 fn constant_deque<T: Clone + fmt::Debug>(
3194 size: usize, val: &T,
3195 ) -> SliceDeque<T> {
3196 let mut v: SliceDeque<T> = SliceDeque::with_capacity(size);
3197 for i in 0..size {
3198 let copy = val.clone();
3199 v.push_back(copy);
3200 assert_eq!(v.len(), i + 1);
3201 }
3202 assert_eq!(v.len(), size);
3203 v
3204 }
3205
3206 #[test]
3207 fn get() {
3208 let mut deq = SliceDeque::new();
3209 deq.push_back(3);
3210 deq.push_back(4);
3211 deq.push_back(5);
3212 assert_eq!(deq.get(1), Some(&4));
3213 }
3214
3215 #[test]
3216 fn get_mut() {
3217 let mut deq = SliceDeque::new();
3218 deq.push_back(3);
3219 deq.push_back(4);
3220 deq.push_back(5);
3221 assert_eq!(deq.get(1), Some(&4));
3222 if let Some(elem) = deq.get_mut(1) {
3223 *elem = 7;
3224 }
3225 assert_eq!(deq[1], 7);
3226 }
3227
3228 #[test]
3229 fn is_empty() {
3230 let mut deq = SliceDeque::new();
3231 assert!(deq.is_empty());
3232 deq.push_back(4);
3233 assert!(!deq.is_empty());
3234 deq.pop_front();
3235 assert!(deq.is_empty());
3236 }
3237
3238 #[test]
3239 fn push_pop_front() {
3240 for size in sizes_to_test() {
3241 let mut v: SliceDeque<usize> = SliceDeque::new();
3242 for i in 0..size {
3243 v.push_front(i);
3244 assert_eq!(v.len(), i + 1);
3245 for j in 0..v.len() {
3246 assert_eq!(*v.get(v.len() - j - 1).unwrap(), j);
3247 }
3248 }
3249 assert_eq!(v.len(), size);
3250 for i in 0..size {
3251 assert_eq!(*v.get(i).unwrap(), size - i - 1);
3252 }
3253 for i in 0..size {
3254 assert_eq!(v.len(), size - i);
3255 v.pop_front();
3256 for j in 0..v.len() {
3257 assert_eq!(*v.get(v.len() - j - 1).unwrap(), j);
3258 }
3259 }
3260 assert_eq!(v.len(), 0);
3261 }
3262 }
3263
3264 #[test]
3265 fn push_pop_back() {
3266 for size in sizes_to_test() {
3267 let mut v = linear_usize_deque(size);
3268 for i in 0..size {
3269 assert_eq!(v.len(), size - i);
3270 v.pop_back();
3271 for j in 0..v.len() {
3272 assert_eq!(*v.get(j).unwrap(), j);
3273 }
3274 }
3275 assert_eq!(v.len(), 0);
3276 }
3277 }
3278
3279 #[test]
3280 fn all_head_tails() {
3281 for size in sizes_to_test() {
3282 let mut v = linear_usize_deque(size);
3283 let permutations = 6 * v.capacity();
3284
3285 for _ in 0..permutations {
3287 v.push_back(0);
3288 for j in (0..v.len() - 1).rev() {
3289 *v.get_mut(j + 1).unwrap() = *v.get(j).unwrap();
3290 }
3291 v.pop_front();
3292 assert_eq!(v.len(), size);
3293 for k in 0..size {
3294 assert_eq!(*v.get(k).unwrap(), k);
3295 }
3296 }
3297
3298 for _ in 0..permutations {
3300 v.push_front(0);
3301 for j in 0..v.len() - 1 {
3302 *v.get_mut(j).unwrap() = *v.get(j + 1).unwrap()
3303 }
3304 v.pop_back();
3305 assert_eq!(v.len(), size);
3306 for k in 0..size {
3307 assert_eq!(*v.get(k).unwrap(), k);
3308 }
3309 }
3310 }
3311 }
3312
3313 #[test]
3314 fn drop() {
3315 for size in sizes_to_test() {
3316 let counter = Rc::new(RefCell::new(0));
3317 let val = WithDrop {
3318 counter: counter.clone(),
3319 };
3320 {
3321 let _v = constant_deque(size, &val);
3322 }
3323 assert_eq!(*counter.borrow(), size);
3324 }
3325 }
3326
3327 #[test]
3328 fn clear() {
3329 for size in sizes_to_test() {
3330 let counter = Rc::new(RefCell::new(0));
3331 let val = WithDrop {
3332 counter: counter.clone(),
3333 };
3334 assert_eq!(*counter.borrow(), 0);
3335 let mut v = constant_deque(size, &val);
3336 assert_eq!(*counter.borrow(), 0);
3337 v.clear();
3338 assert_eq!(*counter.borrow(), size);
3339 assert_eq!(v.len(), 0);
3340 }
3341 }
3342
3343 #[test]
3344 fn reserve_no_cap_change() {
3345 let mut slice = SliceDeque::<u8>::with_capacity(4096);
3346 let cap = slice.capacity();
3347 assert!(cap >= 4096);
3348 slice.reserve(cap);
3349 assert_eq!(slice.capacity(), cap);
3352 }
3353
3354 #[test]
3355 fn resize() {
3356 for size in sizes_to_test() {
3357 let mut v = linear_usize_deque(size);
3358 let mut v_ref = linear_usize_deque(size / 2);
3359 v.resize(size / 2, 0);
3360 assert_eq!(v.len(), size / 2);
3361 assert_eq!(v.as_slice(), v_ref.as_slice());
3362 while v_ref.len() < size {
3363 v_ref.push_back(3);
3364 }
3365 v.resize(size, 3);
3366 assert_eq!(v.len(), size);
3367 assert_eq!(v_ref.len(), size);
3368 assert_eq!(v.as_slice(), v_ref.as_slice());
3369
3370 v.resize(0, 3);
3371 assert_eq!(v.len(), 0);
3372
3373 v.resize(size, 3);
3374 let v_ref = constant_deque(size, &3);
3375 assert_eq!(v.len(), size);
3376 assert_eq!(v_ref.len(), size);
3377 assert_eq!(v.as_slice(), v_ref.as_slice());
3378 }
3379 }
3380
3381 #[test]
3382 fn default() {
3383 let d = SliceDeque::<u8>::default();
3384 let r = SliceDeque::<u8>::new();
3385 assert_eq!(d.as_slice(), r.as_slice());
3386 }
3387
3388 #[test]
3389 fn shrink_to_fit() {
3390 let page_size = 4096;
3391 for size in sizes_to_test() {
3392 let mut deq = constant_deque(size, &(3 as u8));
3393 let old_cap = deq.capacity();
3394 deq.resize(size / 4, 3);
3395 deq.shrink_to_fit();
3396 if size <= page_size {
3397 assert_eq!(deq.capacity(), old_cap);
3398 } else {
3399 assert!(deq.capacity() < old_cap);
3400 }
3401 }
3402 }
3403
3404 #[test]
3405 fn iter() {
3406 let mut deq = SliceDeque::new();
3407 deq.push_back(5);
3408 deq.push_back(3);
3409 deq.push_back(4);
3410 let b: &[_] = &[&5, &3, &4];
3411 let c: Vec<&i32> = deq.iter().collect();
3412 assert_eq!(&c[..], b);
3413 }
3414
3415 #[test]
3416 fn iter_mut() {
3417 let mut deq = SliceDeque::new();
3418 deq.push_back(5);
3419 deq.push_back(3);
3420 deq.push_back(4);
3421 for num in deq.iter_mut() {
3422 *num = *num - 2;
3423 }
3424 let b: &[_] = &[&mut 3, &mut 1, &mut 2];
3425 assert_eq!(&deq.iter_mut().collect::<Vec<&mut i32>>()[..], b);
3426 }
3427
3428 #[test]
3429 fn hash_map() {
3430 let mut hm: HashMap<SliceDeque<u32>, u32> = HashMap::new();
3431 let mut a = SliceDeque::new();
3432 a.push_back(1);
3433 a.push_back(2);
3434 hm.insert(a.clone(), 3);
3435 let b = SliceDeque::new();
3436 assert_eq!(hm.get(&a), Some(&3));
3437 assert_eq!(hm.get(&b), None);
3438 }
3439
3440 #[test]
3441 fn partial_ord_eq() {
3442 let mut a = SliceDeque::new();
3443 a.push_back(1);
3444 a.push_back(2);
3445 a.push_back(3);
3446 assert!(a == a);
3447 assert!(!(a != a));
3448
3449 let mut b = SliceDeque::new();
3450 b.push_back(1);
3451 b.push_back(3);
3452 b.push_back(2);
3453 assert!(a < b);
3454 assert!(b > a);
3455 assert!(a != b);
3456
3457 let mut c = SliceDeque::new();
3458 c.push_back(2);
3459 assert!(c > a);
3460 assert!(a < c);
3461 }
3462
3463 struct DropCounter<'a> {
3464 count: &'a mut u32,
3465 }
3466
3467 impl<'a> Drop for DropCounter<'a> {
3468 fn drop(&mut self) {
3469 *self.count += 1;
3470 }
3471 }
3472
3473 #[test]
3474 fn vec_double_drop() {
3475 struct TwoSliceDeque<T> {
3476 x: SliceDeque<T>,
3477 y: SliceDeque<T>,
3478 }
3479
3480 let (mut count_x, mut count_y) = (0, 0);
3481 {
3482 let mut tv = TwoSliceDeque {
3483 x: SliceDeque::new(),
3484 y: SliceDeque::new(),
3485 };
3486 tv.x.push_back(DropCounter {
3487 count: &mut count_x,
3488 });
3489 tv.y.push_back(DropCounter {
3490 count: &mut count_y,
3491 });
3492
3493 mem::drop(tv.x);
3497
3498 }
3500
3501 assert_eq!(count_x, 1);
3502 assert_eq!(count_y, 1);
3503 }
3504
3505 #[test]
3506 fn vec_reserve() {
3507 let mut v = SliceDeque::new();
3508 assert_eq!(v.capacity(), 0);
3509
3510 v.reserve(2);
3511 assert!(v.capacity() >= 2);
3512
3513 for i in 0..16 {
3514 v.push_back(i);
3515 }
3516
3517 assert!(v.capacity() >= 16);
3518 v.reserve(16);
3519 assert!(v.capacity() >= 32);
3520
3521 v.push_back(16);
3522
3523 v.reserve(16);
3524 assert!(v.capacity() >= 33)
3525 }
3526
3527 #[test]
3528 fn vec_extend() {
3529 let mut v = SliceDeque::new();
3530 let mut w = SliceDeque::new();
3531
3532 v.extend(w.clone());
3533 assert_eq!(v, &[]);
3534
3535 v.extend(0..3);
3536 for i in 0..3 {
3537 w.push_back(i)
3538 }
3539
3540 assert_eq!(v, w);
3541
3542 v.extend(3..10);
3543 for i in 3..10 {
3544 w.push_back(i)
3545 }
3546
3547 assert_eq!(v, w);
3548
3549 v.extend(w.clone()); assert!(v.iter().eq(w.iter().chain(w.iter())));
3551
3552 let mut count_x = 0;
3554 {
3555 let mut x = SliceDeque::new();
3556 let mut y = SliceDeque::new();
3557 y.push_back(DropCounter {
3558 count: &mut count_x,
3559 });
3560 x.extend(y);
3561 }
3562 assert_eq!(count_x, 1);
3563 }
3564
3565 #[test]
3566 fn vec_extend_zst() {
3567 #[derive(PartialEq, Debug)]
3569 struct Foo;
3570
3571 let mut a = SliceDeque::new();
3572 let b = sdeq![Foo, Foo];
3573
3574 a.extend(b);
3575 assert_eq!(a, &[Foo, Foo]);
3576 }
3577
3578 #[test]
3579 fn vec_extend_ref() {
3580 let mut v = SliceDeque::new();
3581 for &i in &[1, 2] {
3582 v.push_back(i);
3583 }
3584 v.extend(&[3, 4, 5]);
3585
3586 assert_eq!(v.len(), 5);
3587 assert_eq!(v, [1, 2, 3, 4, 5]);
3588
3589 let mut w = SliceDeque::new();
3590 for &i in &[6, 7] {
3591 w.push_back(i);
3592 }
3593 v.extend(&w);
3594
3595 assert_eq!(v.len(), 7);
3596 assert_eq!(v, [1, 2, 3, 4, 5, 6, 7]);
3597 }
3598
3599 #[test]
3600 fn vec_slice_from_mut() {
3601 let mut values = sdeq![1, 2, 3, 4, 5];
3602 {
3603 let slice = &mut values[2..];
3604 assert!(slice == [3, 4, 5]);
3605 for p in slice {
3606 *p += 2;
3607 }
3608 }
3609
3610 assert!(values == [1, 2, 5, 6, 7]);
3611 }
3612
3613 #[test]
3614 fn vec_slice_to_mut() {
3615 let mut values = sdeq![1, 2, 3, 4, 5];
3616 {
3617 let slice = &mut values[..2];
3618 assert!(slice == [1, 2]);
3619 for p in slice {
3620 *p += 1;
3621 }
3622 }
3623
3624 assert!(values == [2, 3, 3, 4, 5]);
3625 }
3626
3627 #[test]
3628 fn vec_split_at_mut() {
3629 let mut values = sdeq![1, 2, 3, 4, 5];
3630 {
3631 let (left, right) = values.split_at_mut(2);
3632 {
3633 let left: &[_] = left;
3634 assert!(&left[..left.len()] == &[1, 2]);
3635 }
3636 for p in left {
3637 *p += 1;
3638 }
3639
3640 {
3641 let right: &[_] = right;
3642 assert!(&right[..right.len()] == &[3, 4, 5]);
3643 }
3644 for p in right {
3645 *p += 2;
3646 }
3647 }
3648
3649 assert_eq!(values, [2, 3, 5, 6, 7]);
3650 }
3651
3652 #[test]
3653 fn vec_clone() {
3654 let v: SliceDeque<i32> = sdeq![];
3655 let w = sdeq![1, 2, 3];
3656
3657 assert_eq!(v, v.clone());
3658
3659 let z = w.clone();
3660 assert_eq!(w, z);
3661 assert!(w.as_ptr() != z.as_ptr())
3663 }
3664
3665 #[cfg(feature = "unstable")]
3666 #[test]
3667 fn vec_clone_from() {
3668 let mut v = sdeq![];
3669 let three: SliceDeque<Box<_>> = sdeq![box 1, box 2, box 3];
3670 let two: SliceDeque<Box<_>> = sdeq![box 4, box 5];
3671
3672 v.clone_from(&three);
3674 assert_eq!(v, three);
3675
3676 v.clone_from(&three);
3678 assert_eq!(v, three);
3679
3680 v.clone_from(&two);
3682 assert_eq!(v, two);
3683
3684 v.clone_from(&three);
3686 assert_eq!(v, three)
3687 }
3688
3689 #[test]
3690 fn vec_retain() {
3691 let mut deq = sdeq![1, 2, 3, 4];
3692 deq.retain(|&x| x % 2 == 0);
3693 assert_eq!(deq, [2, 4]);
3694 }
3695
3696 #[test]
3697 fn vec_dedup() {
3698 fn case(a: SliceDeque<i32>, b: SliceDeque<i32>) {
3699 let mut v = a;
3700 v.dedup();
3701 assert_eq!(v, b);
3702 }
3703 case(sdeq![], sdeq![]);
3704 case(sdeq![1], sdeq![1]);
3705 case(sdeq![1, 1], sdeq![1]);
3706 case(sdeq![1, 2, 3], sdeq![1, 2, 3]);
3707 case(sdeq![1, 1, 2, 3], sdeq![1, 2, 3]);
3708 case(sdeq![1, 2, 2, 3], sdeq![1, 2, 3]);
3709 case(sdeq![1, 2, 3, 3], sdeq![1, 2, 3]);
3710 case(sdeq![1, 1, 2, 2, 2, 3, 3], sdeq![1, 2, 3]);
3711 }
3712
3713 #[test]
3714 fn vec_dedup_by_key() {
3715 fn case(a: SliceDeque<i32>, b: SliceDeque<i32>) {
3716 let mut v = a;
3717 v.dedup_by_key(|i| *i / 10);
3718 assert_eq!(v, b);
3719 }
3720 case(sdeq![], sdeq![]);
3721 case(sdeq![10], sdeq![10]);
3722 case(sdeq![10, 11], sdeq![10]);
3723 case(sdeq![10, 20, 30], sdeq![10, 20, 30]);
3724 case(sdeq![10, 11, 20, 30], sdeq![10, 20, 30]);
3725 case(sdeq![10, 20, 21, 30], sdeq![10, 20, 30]);
3726 case(sdeq![10, 20, 30, 31], sdeq![10, 20, 30]);
3727 case(sdeq![10, 11, 20, 21, 22, 30, 31], sdeq![10, 20, 30]);
3728 }
3729
3730 #[test]
3731 fn vec_dedup_by() {
3732 let mut deq = sdeq!["foo", "bar", "Bar", "baz", "bar"];
3733 deq.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
3734
3735 assert_eq!(deq, ["foo", "bar", "baz", "bar"]);
3736
3737 let mut deq: SliceDeque<(&'static str, i32)> =
3738 sdeq![("foo", 1), ("foo", 2), ("bar", 3), ("bar", 4), ("bar", 5)];
3739 deq.dedup_by(|a, b| {
3740 a.0 == b.0 && {
3741 b.1 += a.1;
3742 true
3743 }
3744 });
3745
3746 assert_eq!(deq, [("foo", 3), ("bar", 12)]);
3747 }
3748
3749 #[cfg(feature = "unstable")]
3750 #[test]
3751 fn vec_dedup_unique() {
3752 let mut v0: SliceDeque<Box<_>> = sdeq![box 1, box 1, box 2, box 3];
3753 v0.dedup();
3754 let mut v1: SliceDeque<Box<_>> = sdeq![box 1, box 2, box 2, box 3];
3755 v1.dedup();
3756 let mut v2: SliceDeque<Box<_>> = sdeq![box 1, box 2, box 3, box 3];
3757 v2.dedup();
3758 }
3761
3762 #[test]
3763 fn zero_sized_values() {
3764 let mut v = SliceDeque::new();
3765 assert_eq!(v.len(), 0);
3766 v.push_back(());
3767 assert_eq!(v.len(), 1);
3768 v.push_back(());
3769 assert_eq!(v.len(), 2);
3770 assert_eq!(v.pop_back(), Some(()));
3771 assert_eq!(v.pop_back(), Some(()));
3772 assert_eq!(v.pop_back(), None);
3773
3774 assert_eq!(v.iter().count(), 0);
3775 v.push_back(());
3776 assert_eq!(v.iter().count(), 1);
3777 v.push_back(());
3778 assert_eq!(v.iter().count(), 2);
3779
3780 for &() in &v {}
3781
3782 assert_eq!(v.iter_mut().count(), 2);
3783 v.push_back(());
3784 assert_eq!(v.iter_mut().count(), 3);
3785 v.push_back(());
3786 assert_eq!(v.iter_mut().count(), 4);
3787
3788 for &mut () in &mut v {}
3789 unsafe {
3790 let len = v.len() as isize;
3791 v.move_tail_unchecked(-len);
3792 }
3793 assert_eq!(v.iter_mut().count(), 0);
3794 }
3795
3796 #[test]
3797 fn vec_partition() {
3798 assert_eq!(
3799 sdeq![].into_iter().partition(|x: &i32| *x < 3),
3800 (sdeq![], sdeq![])
3801 );
3802 assert_eq!(
3803 sdeq![1, 2, 3].into_iter().partition(|x| *x < 4),
3804 (sdeq![1, 2, 3], sdeq![])
3805 );
3806 assert_eq!(
3807 sdeq![1, 2, 3].into_iter().partition(|x| *x < 2),
3808 (sdeq![1], sdeq![2, 3])
3809 );
3810 assert_eq!(
3811 sdeq![1, 2, 3].into_iter().partition(|x| *x < 0),
3812 (sdeq![], sdeq![1, 2, 3])
3813 );
3814 }
3815
3816 #[test]
3817 fn vec_zip_unzip() {
3818 let z1 = sdeq![(1, 4), (2, 5), (3, 6)];
3819
3820 let (left, right): (SliceDeque<_>, SliceDeque<_>) =
3821 z1.iter().cloned().unzip();
3822
3823 assert_eq!((1, 4), (left[0], right[0]));
3824 assert_eq!((2, 5), (left[1], right[1]));
3825 assert_eq!((3, 6), (left[2], right[2]));
3826 }
3827
3828 #[test]
3829 fn vec_vec_truncate_drop() {
3830 static mut DROPS: u32 = 0;
3831 struct Elem(i32);
3832 impl Drop for Elem {
3833 fn drop(&mut self) {
3834 unsafe {
3835 DROPS += 1;
3836 }
3837 }
3838 }
3839
3840 let mut v = sdeq![Elem(1), Elem(2), Elem(3), Elem(4), Elem(5)];
3841 assert_eq!(unsafe { DROPS }, 0);
3842 v.truncate(3);
3843 assert_eq!(unsafe { DROPS }, 2);
3844 v.truncate(0);
3845 assert_eq!(unsafe { DROPS }, 5);
3846 }
3847
3848 #[test]
3849 fn vec_vec_truncate_front_drop() {
3850 static mut DROPS: u32 = 0;
3851 struct Elem(i32);
3852 impl Drop for Elem {
3853 fn drop(&mut self) {
3854 unsafe {
3855 DROPS += 1;
3856 }
3857 }
3858 }
3859
3860 let mut v = sdeq![Elem(1), Elem(2), Elem(3), Elem(4), Elem(5)];
3861 assert_eq!(unsafe { DROPS }, 0);
3862 v.truncate_front(3);
3863 assert_eq!(unsafe { DROPS }, 2);
3864 v.truncate_front(0);
3865 assert_eq!(unsafe { DROPS }, 5);
3866 }
3867
3868 #[test]
3869 #[should_panic]
3870 fn vec_vec_truncate_fail() {
3871 struct BadElem(i32);
3872 impl Drop for BadElem {
3873 fn drop(&mut self) {
3874 let BadElem(ref mut x) = *self;
3875 if *x == 0xbadbeef {
3876 panic!("BadElem panic: 0xbadbeef")
3877 }
3878 }
3879 }
3880
3881 let mut v =
3882 sdeq![BadElem(1), BadElem(2), BadElem(0xbadbeef), BadElem(4)];
3883 v.truncate(0);
3884 }
3885
3886 #[test]
3887 fn vec_index() {
3888 let deq = sdeq![1, 2, 3];
3889 assert!(deq[1] == 2);
3890 }
3891
3892 #[test]
3893 #[should_panic]
3894 fn vec_index_out_of_bounds() {
3895 let deq = sdeq![1, 2, 3];
3896 let _ = deq[3];
3897 }
3898
3899 #[test]
3900 #[should_panic]
3901 fn vec_slice_out_of_bounds_1() {
3902 let x = sdeq![1, 2, 3, 4, 5];
3903 &x[!0..];
3904 }
3905
3906 #[test]
3907 #[should_panic]
3908 fn vec_slice_out_of_bounds_2() {
3909 let x = sdeq![1, 2, 3, 4, 5];
3910 &x[..6];
3911 }
3912
3913 #[test]
3914 #[should_panic]
3915 fn vec_slice_out_of_bounds_3() {
3916 let x = sdeq![1, 2, 3, 4, 5];
3917 &x[!0..4];
3918 }
3919
3920 #[test]
3921 #[should_panic]
3922 fn vec_slice_out_of_bounds_4() {
3923 let x = sdeq![1, 2, 3, 4, 5];
3924 &x[1..6];
3925 }
3926
3927 #[test]
3928 #[should_panic]
3929 fn vec_slice_out_of_bounds_5() {
3930 let x = sdeq![1, 2, 3, 4, 5];
3931 &x[3..2];
3932 }
3933
3934 #[test]
3935 fn vec_swap_remove_empty() {
3936 let mut deq = SliceDeque::<i32>::new();
3937 assert_eq!(deq.swap_remove_back(0), None);
3938 }
3939
3940 #[test]
3941 fn vec_move_items() {
3942 let deq = sdeq![1, 2, 3];
3943 let mut deq2 = sdeq![];
3944 for i in deq {
3945 deq2.push_back(i);
3946 }
3947 assert_eq!(deq2, [1, 2, 3]);
3948 }
3949
3950 #[test]
3951 fn vec_move_items_reverse() {
3952 let deq = sdeq![1, 2, 3];
3953 let mut deq2 = sdeq![];
3954 for i in deq.into_iter().rev() {
3955 deq2.push_back(i);
3956 }
3957 assert_eq!(deq2, [3, 2, 1]);
3958 }
3959
3960 #[test]
3961 fn vec_move_items_zero_sized() {
3962 let deq = sdeq![(), (), ()];
3963 let mut deq2 = sdeq![];
3964 for i in deq {
3965 deq2.push_back(i);
3966 }
3967 assert_eq!(deq2, [(), (), ()]);
3968 }
3969
3970 #[test]
3971 fn vec_drain_items() {
3972 let mut deq = sdeq![1, 2, 3];
3973 let mut deq2 = sdeq![];
3974 for i in deq.drain(..) {
3975 deq2.push_back(i);
3976 }
3977 assert_eq!(deq, []);
3978 assert_eq!(deq2, [1, 2, 3]);
3979 }
3980
3981 #[test]
3982 fn vec_drain_items_reverse() {
3983 let mut deq = sdeq![1, 2, 3];
3984 let mut deq2 = sdeq![];
3985 for i in deq.drain(..).rev() {
3986 deq2.push_back(i);
3987 }
3988 assert_eq!(deq, []);
3989 assert_eq!(deq2, [3, 2, 1]);
3990 }
3991
3992 #[test]
3993 fn vec_drain_items_zero_sized() {
3994 let mut deq = sdeq![(), (), ()];
3995 let mut deq2 = sdeq![];
3996 for i in deq.drain(..) {
3997 deq2.push_back(i);
3998 }
3999 assert_eq!(deq, []);
4000 assert_eq!(deq2, [(), (), ()]);
4001 }
4002
4003 #[test]
4004 #[should_panic]
4005 fn vec_drain_out_of_bounds() {
4006 let mut v = sdeq![1, 2, 3, 4, 5];
4007 v.drain(5..6);
4008 }
4009
4010 #[test]
4011 fn vec_drain_range() {
4012 let mut v = sdeq![1, 2, 3, 4, 5];
4013 for _ in v.drain(4..) {}
4014 assert_eq!(v, &[1, 2, 3, 4]);
4015
4016 let mut v: SliceDeque<_> = (1..6).map(|x| x.to_string()).collect();
4017 for _ in v.drain(1..4) {}
4018 assert_eq!(v, &[1.to_string(), 5.to_string()]);
4019
4020 let mut v: SliceDeque<_> = (1..6).map(|x| x.to_string()).collect();
4021 for _ in v.drain(1..4).rev() {}
4022 assert_eq!(v, &[1.to_string(), 5.to_string()]);
4023 }
4024
4025 #[test]
4026 fn vec_drain_range_zst() {
4027 let mut v: SliceDeque<_> = sdeq![(); 5];
4028 for _ in v.drain(1..4).rev() {}
4029 assert_eq!(v, &[(), ()]);
4030 }
4031
4032 #[test]
4033 fn vec_drain_inclusive_range() {
4034 let mut v = sdeq!['a', 'b', 'c', 'd', 'e'];
4035 for _ in v.drain(1..=3) {}
4036 assert_eq!(v, &['a', 'e']);
4037
4038 let mut v: SliceDeque<_> = (0..=5).map(|x| x.to_string()).collect();
4039 for _ in v.drain(1..=5) {}
4040 assert_eq!(v, &["0".to_string()]);
4041
4042 let mut v: SliceDeque<String> =
4043 (0..=5).map(|x| x.to_string()).collect();
4044 for _ in v.drain(0..=5) {}
4045 assert_eq!(v, SliceDeque::<String>::new());
4046
4047 let mut v: SliceDeque<_> = (0..=5).map(|x| x.to_string()).collect();
4048 for _ in v.drain(0..=3) {}
4049 assert_eq!(v, &["4".to_string(), "5".to_string()]);
4050
4051 let mut v: SliceDeque<_> = (0..=1).map(|x| x.to_string()).collect();
4052 for _ in v.drain(..=0) {}
4053 assert_eq!(v, &["1".to_string()]);
4054 }
4055
4056 #[test]
4057 fn vec_drain_max_vec_size() {
4058 const M: usize = isize::max_value() as usize;
4059 let mut v = SliceDeque::<()>::with_capacity(M);
4060 unsafe { v.move_tail_unchecked(M as isize) };
4061 assert_eq!(v.len(), M as usize);
4062 for _ in v.drain(M - 1..) {}
4063 assert_eq!(v.len(), M - 1);
4064
4065 let mut v = SliceDeque::<()>::with_capacity(M);
4066 unsafe { v.move_tail_unchecked(M as isize) };
4067 assert_eq!(v.len(), M as usize);
4068 for _ in v.drain(M - 1..=M - 1) {}
4069 assert_eq!(v.len(), M - 1);
4070 }
4071
4072 #[test]
4073 #[should_panic]
4074 fn vec_drain_inclusive_out_of_bounds() {
4075 let mut v = sdeq![1, 2, 3, 4, 5];
4076 v.drain(5..=5);
4077 }
4078
4079 #[test]
4080 fn vec_splice() {
4081 let mut v = sdeq![1, 2, 3, 4, 5];
4082 let a = [10, 11, 12];
4083 v.splice(2..4, a.iter().cloned());
4084 assert_eq!(v, &[1, 2, 10, 11, 12, 5]);
4085 v.splice(1..3, Some(20));
4086 assert_eq!(v, &[1, 20, 11, 12, 5]);
4087 }
4088
4089 #[test]
4090 fn vec_splice_inclusive_range() {
4091 let mut v = sdeq![1, 2, 3, 4, 5];
4092 let a = [10, 11, 12];
4093 let t1: SliceDeque<_> = v.splice(2..=3, a.iter().cloned()).collect();
4094 assert_eq!(v, &[1, 2, 10, 11, 12, 5]);
4095 assert_eq!(t1, &[3, 4]);
4096 let t2: SliceDeque<_> = v.splice(1..=2, Some(20)).collect();
4097 assert_eq!(v, &[1, 20, 11, 12, 5]);
4098 assert_eq!(t2, &[2, 10]);
4099 }
4100
4101 #[test]
4102 #[should_panic]
4103 fn vec_splice_out_of_bounds() {
4104 let mut v = sdeq![1, 2, 3, 4, 5];
4105 let a = [10, 11, 12];
4106 v.splice(5..6, a.iter().cloned());
4107 }
4108
4109 #[test]
4110 #[should_panic]
4111 fn vec_splice_inclusive_out_of_bounds() {
4112 let mut v = sdeq![1, 2, 3, 4, 5];
4113 let a = [10, 11, 12];
4114 v.splice(5..=5, a.iter().cloned());
4115 }
4116
4117 #[test]
4118 fn vec_splice_items_zero_sized() {
4119 let mut deq = sdeq![(), (), ()];
4120 let deq2 = sdeq![];
4121 let t: SliceDeque<_> =
4122 deq.splice(1..2, deq2.iter().cloned()).collect();
4123 assert_eq!(deq, &[(), ()]);
4124 assert_eq!(t, &[()]);
4125 }
4126
4127 #[test]
4128 fn vec_splice_unbounded() {
4129 let mut deq = sdeq![1, 2, 3, 4, 5];
4130 let t: SliceDeque<_> = deq.splice(.., None).collect();
4131 assert_eq!(deq, &[]);
4132 assert_eq!(t, &[1, 2, 3, 4, 5]);
4133 }
4134
4135 #[test]
4136 fn vec_splice_forget() {
4137 let mut v = sdeq![1, 2, 3, 4, 5];
4138 let a = [10, 11, 12];
4139 mem::forget(v.splice(2..4, a.iter().cloned()));
4140 assert_eq!(v, &[1, 2]);
4141 }
4142
4143 #[test]
4153 fn vec_append() {
4154 let mut deq = sdeq![1, 2, 3];
4155 let mut deq2 = sdeq![4, 5, 6];
4156 deq.append(&mut deq2);
4157 assert_eq!(deq, [1, 2, 3, 4, 5, 6]);
4158 assert_eq!(deq2, []);
4159 }
4160
4161 #[test]
4162 fn vec_split_off() {
4163 let mut deq = sdeq![1, 2, 3, 4, 5, 6];
4164 let deq2 = deq.split_off(4);
4165 assert_eq!(deq, [1, 2, 3, 4]);
4166 assert_eq!(deq2, [5, 6]);
4167 }
4168
4169 #[test]
4170 fn vec_into_iter_as_slice() {
4171 let deq = sdeq!['a', 'b', 'c'];
4172 let mut into_iter = deq.into_iter();
4173 assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
4174 let _ = into_iter.next().unwrap();
4175 assert_eq!(into_iter.as_slice(), &['b', 'c']);
4176 let _ = into_iter.next().unwrap();
4177 let _ = into_iter.next().unwrap();
4178 assert_eq!(into_iter.as_slice(), &[]);
4179 }
4180
4181 #[test]
4182 fn vec_into_iter_as_mut_slice() {
4183 let deq = sdeq!['a', 'b', 'c'];
4184 let mut into_iter = deq.into_iter();
4185 assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
4186 into_iter.as_mut_slice()[0] = 'x';
4187 into_iter.as_mut_slice()[1] = 'y';
4188 assert_eq!(into_iter.next().unwrap(), 'x');
4189 assert_eq!(into_iter.as_slice(), &['y', 'c']);
4190 }
4191
4192 #[test]
4193 fn vec_into_iter_debug() {
4194 let deq = sdeq!['a', 'b', 'c'];
4195 let into_iter = deq.into_iter();
4196 let debug = format!("{:?}", into_iter);
4197 assert_eq!(debug, "IntoIter(['a', 'b', 'c'])");
4198 }
4199
4200 #[test]
4201 fn vec_into_iter_count() {
4202 assert_eq!(sdeq![1, 2, 3].into_iter().count(), 3);
4203 }
4204
4205 #[test]
4206 fn vec_into_iter_clone() {
4207 fn iter_equal<I: Iterator<Item = i32>>(it: I, slice: &[i32]) {
4208 let v: SliceDeque<i32> = it.collect();
4209 assert_eq!(&v[..], slice);
4210 }
4211 let deq = sdeq![1, 2, 3];
4212 let mut it = deq.into_iter();
4213 let it_c = it.clone();
4214 iter_equal(it_c, &[1, 2, 3]);
4215 assert_eq!(it.next(), Some(1));
4216 let mut it = it.rev();
4217 iter_equal(it.clone(), &[3, 2]);
4218 assert_eq!(it.next(), Some(3));
4219 iter_equal(it.clone(), &[2]);
4220 assert_eq!(it.next(), Some(2));
4221 iter_equal(it.clone(), &[]);
4222 assert_eq!(it.next(), None);
4223 }
4224
4225 #[test]
4262 fn from_into_inner() {
4263 let deq = sdeq![1, 2, 3];
4264 #[allow(unused_variables)]
4265 let ptr = deq.as_ptr();
4266 let deq = deq.into_iter().collect::<SliceDeque<_>>();
4267 assert_eq!(deq, [1, 2, 3]);
4268 #[cfg(feature = "unstable")]
4269 {
4270 assert_eq!(deq.as_ptr(), ptr);
4271 }
4272
4273 let ptr = &deq[1] as *const _;
4274 let mut it = deq.into_iter();
4275 it.next().unwrap();
4276 let deq = it.collect::<SliceDeque<_>>();
4277 assert_eq!(deq, [2, 3]);
4278 assert!(ptr != deq.as_ptr());
4279 }
4280
4281 #[cfg(feature = "unstable")]
4282 #[test]
4283 fn overaligned_allocations() {
4284 #[repr(align(256))]
4285 struct Foo(usize);
4286 let mut v = sdeq![Foo(273)];
4287 for i in 0..0x1000 {
4288 v.reserve_exact(i);
4289 assert!(v[0].0 == 273);
4290 assert!(v.as_ptr() as usize & 0xff == 0);
4291 v.shrink_to_fit();
4292 assert!(v[0].0 == 273);
4293 assert!(v.as_ptr() as usize & 0xff == 0);
4294 }
4295 }
4296
4297 #[test]
4298 fn drain_filter_empty() {
4299 let mut deq: SliceDeque<i32> = sdeq![];
4300
4301 {
4302 let mut iter = deq.drain_filter(|_| true);
4303 assert_eq!(iter.size_hint(), (0, Some(0)));
4304 assert_eq!(iter.next(), None);
4305 assert_eq!(iter.size_hint(), (0, Some(0)));
4306 assert_eq!(iter.next(), None);
4307 assert_eq!(iter.size_hint(), (0, Some(0)));
4308 }
4309 assert_eq!(deq.len(), 0);
4310 assert_eq!(deq, sdeq![]);
4311 }
4312
4313 #[test]
4314 fn drain_filter_zst() {
4315 let mut deq = sdeq![(), (), (), (), ()];
4316 let initial_len = deq.len();
4317 let mut count = 0;
4318 {
4319 let mut iter = deq.drain_filter(|_| true);
4320 assert_eq!(iter.size_hint(), (0, Some(initial_len)));
4321 while let Some(_) = iter.next() {
4322 count += 1;
4323 assert_eq!(iter.size_hint(), (0, Some(initial_len - count)));
4324 }
4325 assert_eq!(iter.size_hint(), (0, Some(0)));
4326 assert_eq!(iter.next(), None);
4327 assert_eq!(iter.size_hint(), (0, Some(0)));
4328 }
4329
4330 assert_eq!(count, initial_len);
4331 assert_eq!(deq.len(), 0);
4332 assert_eq!(deq, sdeq![]);
4333 }
4334
4335 #[test]
4336 fn drain_filter_false() {
4337 let mut deq = sdeq![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
4338
4339 let initial_len = deq.len();
4340 let mut count = 0;
4341 {
4342 let mut iter = deq.drain_filter(|_| false);
4343 assert_eq!(iter.size_hint(), (0, Some(initial_len)));
4344 for _ in iter.by_ref() {
4345 count += 1;
4346 }
4347 assert_eq!(iter.size_hint(), (0, Some(0)));
4348 assert_eq!(iter.next(), None);
4349 assert_eq!(iter.size_hint(), (0, Some(0)));
4350 }
4351
4352 assert_eq!(count, 0);
4353 assert_eq!(deq.len(), initial_len);
4354 assert_eq!(deq, sdeq![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
4355 }
4356
4357 #[test]
4358 fn drain_filter_true() {
4359 let mut deq = sdeq![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
4360
4361 let initial_len = deq.len();
4362 let mut count = 0;
4363 {
4364 let mut iter = deq.drain_filter(|_| true);
4365 assert_eq!(iter.size_hint(), (0, Some(initial_len)));
4366 while let Some(_) = iter.next() {
4367 count += 1;
4368 assert_eq!(iter.size_hint(), (0, Some(initial_len - count)));
4369 }
4370 assert_eq!(iter.size_hint(), (0, Some(0)));
4371 assert_eq!(iter.next(), None);
4372 assert_eq!(iter.size_hint(), (0, Some(0)));
4373 }
4374
4375 assert_eq!(count, initial_len);
4376 assert_eq!(deq.len(), 0);
4377 assert_eq!(deq, sdeq![]);
4378 }
4379
4380 #[test]
4381 fn drain_filter_complex() {
4382 {
4383 let mut deq = sdeq![
4385 1, 2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29,
4386 31, 33, 34, 35, 36, 37, 39,
4387 ];
4388
4389 let removed =
4390 deq.drain_filter(|x| *x % 2 == 0).collect::<SliceDeque<_>>();
4391 assert_eq!(removed.len(), 10);
4392 assert_eq!(removed, sdeq![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
4393
4394 assert_eq!(deq.len(), 14);
4395 assert_eq!(
4396 deq,
4397 sdeq![1, 7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]
4398 );
4399 }
4400
4401 {
4402 let mut deq = sdeq![
4404 2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31,
4405 33, 34, 35, 36, 37, 39,
4406 ];
4407
4408 let removed =
4409 deq.drain_filter(|x| *x % 2 == 0).collect::<SliceDeque<_>>();
4410 assert_eq!(removed.len(), 10);
4411 assert_eq!(removed, sdeq![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
4412
4413 assert_eq!(deq.len(), 13);
4414 assert_eq!(
4415 deq,
4416 sdeq![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]
4417 );
4418 }
4419
4420 {
4421 let mut deq = sdeq![
4423 2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31,
4424 33, 34, 35, 36,
4425 ];
4426
4427 let removed =
4428 deq.drain_filter(|x| *x % 2 == 0).collect::<SliceDeque<_>>();
4429 assert_eq!(removed.len(), 10);
4430 assert_eq!(removed, sdeq![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
4431
4432 assert_eq!(deq.len(), 11);
4433 assert_eq!(deq, sdeq![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35]);
4434 }
4435
4436 {
4437 let mut deq = sdeq![
4439 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 1, 3, 5, 7, 9, 11, 13, 15,
4440 17, 19,
4441 ];
4442
4443 let removed =
4444 deq.drain_filter(|x| *x % 2 == 0).collect::<SliceDeque<_>>();
4445 assert_eq!(removed.len(), 10);
4446 assert_eq!(removed, sdeq![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
4447
4448 assert_eq!(deq.len(), 10);
4449 assert_eq!(deq, sdeq![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
4450 }
4451
4452 {
4453 let mut deq = sdeq![
4455 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 2, 4, 6, 8, 10, 12, 14, 16,
4456 18, 20,
4457 ];
4458
4459 let removed =
4460 deq.drain_filter(|x| *x % 2 == 0).collect::<SliceDeque<_>>();
4461 assert_eq!(removed.len(), 10);
4462 assert_eq!(removed, sdeq![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
4463
4464 assert_eq!(deq.len(), 10);
4465 assert_eq!(deq, sdeq![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
4466 }
4467 }
4468
4469 #[test]
4470 fn vecdeque_simple() {
4471 let mut d = SliceDeque::new();
4472 assert_eq!(d.len(), 0);
4473 d.push_front(17);
4474 d.push_front(42);
4475 d.push_back(137);
4476 assert_eq!(d.len(), 3);
4477 d.push_back(137);
4478 assert_eq!(d.len(), 4);
4479 assert_eq!(*d.front().unwrap(), 42);
4480 assert_eq!(*d.back().unwrap(), 137);
4481 let mut i = d.pop_front();
4482 assert_eq!(i, Some(42));
4483 i = d.pop_back();
4484 assert_eq!(i, Some(137));
4485 i = d.pop_back();
4486 assert_eq!(i, Some(137));
4487 i = d.pop_back();
4488 assert_eq!(i, Some(17));
4489 assert_eq!(d.len(), 0);
4490 d.push_back(3);
4491 assert_eq!(d.len(), 1);
4492 d.push_front(2);
4493 assert_eq!(d.len(), 2);
4494 d.push_back(4);
4495 assert_eq!(d.len(), 3);
4496 d.push_front(1);
4497 assert_eq!(d.len(), 4);
4498 assert_eq!(d[0], 1);
4499 assert_eq!(d[1], 2);
4500 assert_eq!(d[2], 3);
4501 assert_eq!(d[3], 4);
4502 }
4503
4504 #[cfg(test)]
4505 fn vecdeque_parameterized<T: Clone + PartialEq + fmt::Debug>(
4506 a: T, b: T, c: T, d: T,
4507 ) {
4508 let mut deq = SliceDeque::new();
4509 assert_eq!(deq.len(), 0);
4510 deq.push_front(a.clone());
4511 deq.push_front(b.clone());
4512 deq.push_back(c.clone());
4513 assert_eq!(deq.len(), 3);
4514 deq.push_back(d.clone());
4515 assert_eq!(deq.len(), 4);
4516 assert_eq!((*deq.front().unwrap()).clone(), b.clone());
4517 assert_eq!((*deq.back().unwrap()).clone(), d.clone());
4518 assert_eq!(deq.pop_front().unwrap(), b.clone());
4519 assert_eq!(deq.pop_back().unwrap(), d.clone());
4520 assert_eq!(deq.pop_back().unwrap(), c.clone());
4521 assert_eq!(deq.pop_back().unwrap(), a.clone());
4522 assert_eq!(deq.len(), 0);
4523 deq.push_back(c.clone());
4524 assert_eq!(deq.len(), 1);
4525 deq.push_front(b.clone());
4526 assert_eq!(deq.len(), 2);
4527 deq.push_back(d.clone());
4528 assert_eq!(deq.len(), 3);
4529 deq.push_front(a.clone());
4530 assert_eq!(deq.len(), 4);
4531 assert_eq!(deq[0].clone(), a.clone());
4532 assert_eq!(deq[1].clone(), b.clone());
4533 assert_eq!(deq[2].clone(), c.clone());
4534 assert_eq!(deq[3].clone(), d.clone());
4535 }
4536
4537 #[test]
4538 fn vecdeque_push_front_grow() {
4539 let mut deq = SliceDeque::new();
4540 for i in 0..66 {
4541 deq.push_front(i);
4542 }
4543 assert_eq!(deq.len(), 66);
4544
4545 for i in 0..66 {
4546 assert_eq!(deq[i], 65 - i);
4547 }
4548
4549 let mut deq = SliceDeque::new();
4550 for i in 0..66 {
4551 deq.push_back(i);
4552 }
4553
4554 for i in 0..66 {
4555 assert_eq!(deq[i], i);
4556 }
4557 }
4558
4559 #[test]
4560 fn vecdeque_index() {
4561 let mut deq = SliceDeque::new();
4562 for i in 1..4 {
4563 deq.push_front(i);
4564 }
4565 assert_eq!(deq[1], 2);
4566 }
4567
4568 #[test]
4569 #[should_panic]
4570 fn vecdeque_index_out_of_bounds() {
4571 let mut deq = SliceDeque::new();
4572 for i in 1..4 {
4573 deq.push_front(i);
4574 }
4575 deq[3];
4576 }
4577
4578 #[derive(Clone, PartialEq, Debug)]
4579 enum Taggy {
4580 One(i32),
4581 Two(i32, i32),
4582 Three(i32, i32, i32),
4583 }
4584
4585 #[derive(Clone, PartialEq, Debug)]
4586 enum Taggypar<T> {
4587 Onepar(T),
4588 Twopar(T, T),
4589 Threepar(T, T, T),
4590 }
4591
4592 #[derive(Clone, PartialEq, Debug)]
4593 struct RecCy {
4594 x: i32,
4595 y: i32,
4596 t: Taggy,
4597 }
4598
4599 use self::Taggy::*;
4600 use self::Taggypar::*;
4601
4602 fn hash<T: hash::Hash>(t: &T) -> u64 {
4603 let mut s = collections::hash_map::DefaultHasher::new();
4604 use hash::Hasher;
4605 t.hash(&mut s);
4606 s.finish()
4607 }
4608
4609 #[test]
4610 fn vecdeque_param_int() {
4611 vecdeque_parameterized::<i32>(5, 72, 64, 175);
4612 }
4613
4614 #[test]
4615 fn vecdeque_param_taggy() {
4616 vecdeque_parameterized::<Taggy>(
4617 One(1),
4618 Two(1, 2),
4619 Three(1, 2, 3),
4620 Two(17, 42),
4621 );
4622 }
4623
4624 #[test]
4625 fn vecdeque_param_taggypar() {
4626 vecdeque_parameterized::<Taggypar<i32>>(
4627 Onepar::<i32>(1),
4628 Twopar::<i32>(1, 2),
4629 Threepar::<i32>(1, 2, 3),
4630 Twopar::<i32>(17, 42),
4631 );
4632 }
4633
4634 #[test]
4635 fn vecdeque_param_reccy() {
4636 let reccy1 = RecCy {
4637 x: 1,
4638 y: 2,
4639 t: One(1),
4640 };
4641 let reccy2 = RecCy {
4642 x: 345,
4643 y: 2,
4644 t: Two(1, 2),
4645 };
4646 let reccy3 = RecCy {
4647 x: 1,
4648 y: 777,
4649 t: Three(1, 2, 3),
4650 };
4651 let reccy4 = RecCy {
4652 x: 19,
4653 y: 252,
4654 t: Two(17, 42),
4655 };
4656 vecdeque_parameterized::<RecCy>(reccy1, reccy2, reccy3, reccy4);
4657 }
4658
4659 #[test]
4660 fn vecdeque_with_capacity() {
4661 let mut d = SliceDeque::with_capacity(0);
4662 d.push_back(1);
4663 assert_eq!(d.len(), 1);
4664 let mut d = SliceDeque::with_capacity(50);
4665 d.push_back(1);
4666 assert_eq!(d.len(), 1);
4667 }
4668
4669 #[test]
4670 fn vecdeque_with_capacity_non_power_two() {
4671 let mut d3 = SliceDeque::with_capacity(3);
4672 d3.push_back(1);
4673
4674 assert_eq!(d3.pop_front(), Some(1));
4677 assert_eq!(d3.front(), None);
4679
4680 d3.push_back(3);
4682 d3.push_back(6);
4684 assert_eq!(d3.pop_front(), Some(3));
4686
4687 d3.push_back(9);
4691 d3.push_back(12);
4693
4694 d3.push_back(15);
4695 assert_eq!(d3.pop_front(), Some(6));
4703
4704 assert_eq!(d3.front(), Some(&9));
4708 }
4709
4710 #[test]
4711 fn vecdeque_reserve_exact() {
4712 let mut d = SliceDeque::new();
4713 d.push_back(0);
4714 d.reserve_exact(50);
4715 assert!(d.capacity() >= 51);
4716 }
4717
4718 #[test]
4719 fn vecdeque_reserve() {
4720 let mut d = SliceDeque::new();
4721 d.push_back(0);
4722 d.reserve(50);
4723 assert!(d.capacity() >= 51);
4724 }
4725
4726 #[test]
4727 fn vecdeque_swap() {
4728 let mut d: SliceDeque<_> = (0..5).collect();
4729 d.pop_front();
4730 d.swap(0, 3);
4731 assert_eq!(d.iter().cloned().collect::<Vec<_>>(), [4, 2, 3, 1]);
4732 }
4733
4734 #[test]
4735 fn vecdeque_iter() {
4736 let mut d = SliceDeque::new();
4737 assert_eq!(d.iter().next(), None);
4738 assert_eq!(d.iter().size_hint(), (0, Some(0)));
4739
4740 for i in 0..5 {
4741 d.push_back(i);
4742 }
4743 {
4744 let b: &[_] = &[&0, &1, &2, &3, &4];
4745 assert_eq!(d.iter().collect::<Vec<_>>(), b);
4746 }
4747
4748 for i in 6..9 {
4749 d.push_front(i);
4750 }
4751 {
4752 let b: &[_] = &[&8, &7, &6, &0, &1, &2, &3, &4];
4753 assert_eq!(d.iter().collect::<Vec<_>>(), b);
4754 }
4755
4756 let mut it = d.iter();
4757 let mut len = d.len();
4758 loop {
4759 match it.next() {
4760 None => break,
4761 _ => {
4762 len -= 1;
4763 assert_eq!(it.size_hint(), (len, Some(len)))
4764 }
4765 }
4766 }
4767 }
4768
4769 #[test]
4770 fn vecdeque_rev_iter() {
4771 let mut d = SliceDeque::new();
4772 assert_eq!(d.iter().rev().next(), None);
4773
4774 for i in 0..5 {
4775 d.push_back(i);
4776 }
4777 {
4778 let b: &[_] = &[&4, &3, &2, &1, &0];
4779 assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
4780 }
4781
4782 for i in 6..9 {
4783 d.push_front(i);
4784 }
4785 let b: &[_] = &[&4, &3, &2, &1, &0, &6, &7, &8];
4786 assert_eq!(d.iter().rev().collect::<Vec<_>>(), b);
4787 }
4788
4789 #[test]
4790 fn vecdeque_mut_rev_iter_wrap() {
4791 let mut d = SliceDeque::with_capacity(3);
4792 assert!(d.iter_mut().rev().next().is_none());
4793
4794 d.push_back(1);
4795 d.push_back(2);
4796 d.push_back(3);
4797 assert_eq!(d.pop_front(), Some(1));
4798 d.push_back(4);
4799
4800 assert_eq!(
4801 d.iter_mut().rev().map(|x| *x).collect::<Vec<_>>(),
4802 vec![4, 3, 2]
4803 );
4804 }
4805
4806 #[test]
4807 fn vecdeque_mut_iter() {
4808 let mut d = SliceDeque::new();
4809 assert!(d.iter_mut().next().is_none());
4810
4811 for i in 0..3 {
4812 d.push_front(i);
4813 }
4814
4815 for (i, elt) in d.iter_mut().enumerate() {
4816 assert_eq!(*elt, 2 - i);
4817 *elt = i;
4818 }
4819
4820 {
4821 let mut it = d.iter_mut();
4822 assert_eq!(*it.next().unwrap(), 0);
4823 assert_eq!(*it.next().unwrap(), 1);
4824 assert_eq!(*it.next().unwrap(), 2);
4825 assert!(it.next().is_none());
4826 }
4827 }
4828
4829 #[test]
4830 fn vecdeque_mut_rev_iter() {
4831 let mut d = SliceDeque::new();
4832 assert!(d.iter_mut().rev().next().is_none());
4833
4834 for i in 0..3 {
4835 d.push_front(i);
4836 }
4837
4838 for (i, elt) in d.iter_mut().rev().enumerate() {
4839 assert_eq!(*elt, i);
4840 *elt = i;
4841 }
4842
4843 {
4844 let mut it = d.iter_mut().rev();
4845 assert_eq!(*it.next().unwrap(), 0);
4846 assert_eq!(*it.next().unwrap(), 1);
4847 assert_eq!(*it.next().unwrap(), 2);
4848 assert!(it.next().is_none());
4849 }
4850 }
4851
4852 #[test]
4853 fn vecdeque_into_iter() {
4854 {
4856 let d: SliceDeque<i32> = SliceDeque::new();
4857 let mut iter = d.into_iter();
4858
4859 assert_eq!(iter.size_hint(), (0, Some(0)));
4860 assert_eq!(iter.next(), None);
4861 assert_eq!(iter.size_hint(), (0, Some(0)));
4862 }
4863
4864 {
4866 let mut d = SliceDeque::new();
4867 for i in 0..5 {
4868 d.push_back(i);
4869 }
4870
4871 let b = vec![0, 1, 2, 3, 4];
4872 assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
4873 }
4874
4875 {
4877 let mut d = SliceDeque::new();
4878 for i in 0..5 {
4879 d.push_back(i);
4880 }
4881 for i in 6..9 {
4882 d.push_front(i);
4883 }
4884
4885 let b = vec![8, 7, 6, 0, 1, 2, 3, 4];
4886 assert_eq!(d.into_iter().collect::<Vec<_>>(), b);
4887 }
4888
4889 {
4891 let mut d = SliceDeque::new();
4892 for i in 0..5 {
4893 d.push_back(i);
4894 }
4895 for i in 6..9 {
4896 d.push_front(i);
4897 }
4898
4899 let mut it = d.into_iter();
4900 assert_eq!(it.size_hint(), (8, Some(8)));
4901 assert_eq!(it.next(), Some(8));
4902 assert_eq!(it.size_hint(), (7, Some(7)));
4903 assert_eq!(it.next_back(), Some(4));
4904 assert_eq!(it.size_hint(), (6, Some(6)));
4905 assert_eq!(it.next(), Some(7));
4906 assert_eq!(it.size_hint(), (5, Some(5)));
4907 }
4908 }
4909
4910 #[test]
4911 fn vecdeque_drain() {
4912 {
4914 let mut d: SliceDeque<i32> = SliceDeque::new();
4915
4916 {
4917 let mut iter = d.drain(..);
4918
4919 assert_eq!(iter.size_hint(), (0, Some(0)));
4920 assert_eq!(iter.next(), None);
4921 assert_eq!(iter.size_hint(), (0, Some(0)));
4922 }
4923
4924 assert!(d.is_empty());
4925 }
4926
4927 {
4929 let mut d = SliceDeque::new();
4930 for i in 0..5 {
4931 d.push_back(i);
4932 }
4933
4934 assert_eq!(d.drain(..).collect::<Vec<_>>(), [0, 1, 2, 3, 4]);
4935 assert!(d.is_empty());
4936 }
4937
4938 {
4940 let mut d = SliceDeque::new();
4941 for i in 0..5 {
4942 d.push_back(i);
4943 }
4944 for i in 6..9 {
4945 d.push_front(i);
4946 }
4947
4948 assert_eq!(
4949 d.drain(..).collect::<Vec<_>>(),
4950 [8, 7, 6, 0, 1, 2, 3, 4]
4951 );
4952 assert!(d.is_empty());
4953 }
4954
4955 {
4957 let mut d: SliceDeque<_> = SliceDeque::new();
4958 for i in 0..5 {
4959 d.push_back(i);
4960 }
4961 for i in 6..9 {
4962 d.push_front(i);
4963 }
4964
4965 {
4966 let mut it = d.drain(..);
4967 assert_eq!(it.size_hint(), (8, Some(8)));
4968 assert_eq!(it.next(), Some(8));
4969 assert_eq!(it.size_hint(), (7, Some(7)));
4970 assert_eq!(it.next_back(), Some(4));
4971 assert_eq!(it.size_hint(), (6, Some(6)));
4972 assert_eq!(it.next(), Some(7));
4973 assert_eq!(it.size_hint(), (5, Some(5)));
4974 }
4975 assert!(d.is_empty());
4976 }
4977 }
4978
4979 #[cfg(feature = "unstable")]
4980 #[test]
4981 fn vecdeque_from_iter() {
4982 let v = vec![1, 2, 3, 4, 5, 6, 7];
4983 let deq: SliceDeque<_> = v.iter().cloned().collect();
4984 let u: Vec<_> = deq.iter().cloned().collect();
4985 assert_eq!(u, v);
4986
4987 let seq = (0..).step_by(2).take(256);
4988 let deq: SliceDeque<_> = seq.collect();
4989 for (i, &x) in deq.iter().enumerate() {
4990 assert_eq!(2 * i, x);
4991 }
4992 assert_eq!(deq.len(), 256);
4993 }
4994
4995 #[test]
4996 fn vecdeque_clone() {
4997 let mut d = SliceDeque::new();
4998 d.push_front(17);
4999 d.push_front(42);
5000 d.push_back(137);
5001 d.push_back(137);
5002 assert_eq!(d.len(), 4);
5003 let mut e = d.clone();
5004 assert_eq!(e.len(), 4);
5005 while !d.is_empty() {
5006 assert_eq!(d.pop_back(), e.pop_back());
5007 }
5008 assert_eq!(d.len(), 0);
5009 assert_eq!(e.len(), 0);
5010 }
5011
5012 #[test]
5013 fn vecdeque_eq() {
5014 let mut d = SliceDeque::new();
5015 assert!(d == SliceDeque::with_capacity(0));
5016 d.push_front(137);
5017 d.push_front(17);
5018 d.push_front(42);
5019 d.push_back(137);
5020 let mut e = SliceDeque::with_capacity(0);
5021 e.push_back(42);
5022 e.push_back(17);
5023 e.push_back(137);
5024 e.push_back(137);
5025 assert!(&e == &d);
5026 e.pop_back();
5027 e.push_back(0);
5028 assert!(e != d);
5029 e.clear();
5030 assert!(e == SliceDeque::new());
5031 }
5032
5033 #[test]
5034 fn vecdeque_partial_eq_array() {
5035 let d = SliceDeque::<char>::new();
5036 assert!(d == []);
5037
5038 let mut d = SliceDeque::new();
5039 d.push_front('a');
5040 assert!(d == ['a']);
5041
5042 let mut d = SliceDeque::new();
5043 d.push_back('a');
5044 assert!(d == ['a']);
5045
5046 let mut d = SliceDeque::new();
5047 d.push_back('a');
5048 d.push_back('b');
5049 assert!(d == ['a', 'b']);
5050 }
5051
5052 #[test]
5053 fn vecdeque_hash() {
5054 let mut x = SliceDeque::new();
5055 let mut y = SliceDeque::new();
5056
5057 x.push_back(1);
5058 x.push_back(2);
5059 x.push_back(3);
5060
5061 y.push_back(0);
5062 y.push_back(1);
5063 y.pop_front();
5064 y.push_back(2);
5065 y.push_back(3);
5066
5067 assert!(hash(&x) == hash(&y));
5068 }
5069
5070 #[test]
5071 fn vecdeque_hash_after_rotation() {
5072 let len = 28;
5075 let mut ring: SliceDeque<i32> = (0..len as i32).collect();
5076 let orig = ring.clone();
5077 for _ in 0..ring.capacity() {
5078 ring.pop_front();
5080 for elt in &mut ring {
5081 *elt -= 1;
5082 }
5083 ring.push_back(len - 1);
5084 assert_eq!(hash(&orig), hash(&ring));
5085 assert_eq!(orig, ring);
5086 assert_eq!(ring, orig);
5087 }
5088 }
5089
5090 #[test]
5091 fn vecdeque_eq_after_rotation() {
5092 let len = 28;
5095 let mut ring: SliceDeque<i32> = (0..len as i32).collect();
5096 let mut shifted = ring.clone();
5097 for _ in 0..10 {
5098 ring.pop_front();
5100 for elt in &mut ring {
5101 *elt -= 1;
5102 }
5103 ring.push_back(len - 1);
5104 }
5105
5106 for _ in 0..shifted.capacity() {
5108 shifted.pop_front();
5109 for elt in &mut shifted {
5110 *elt -= 1;
5111 }
5112 shifted.push_back(len - 1);
5113 assert_eq!(shifted, ring);
5114 assert_eq!(ring, shifted);
5115 }
5116 }
5117
5118 #[test]
5119 fn vecdeque_ord() {
5120 let x = SliceDeque::new();
5121 let mut y = SliceDeque::new();
5122 y.push_back(1);
5123 y.push_back(2);
5124 y.push_back(3);
5125 assert!(x < y);
5126 assert!(y > x);
5127 assert!(x <= x);
5128 assert!(x >= x);
5129 }
5130
5131 #[test]
5132 fn vecdeque_show() {
5133 let ringbuf: SliceDeque<_> = (0..10).collect();
5134 assert_eq!(format!("{:?}", ringbuf), "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]");
5135
5136 let ringbuf: SliceDeque<_> = vec!["just", "one", "test", "more"]
5137 .iter()
5138 .cloned()
5139 .collect();
5140 assert_eq!(
5141 format!("{:?}", ringbuf),
5142 "[\"just\", \"one\", \"test\", \"more\"]"
5143 );
5144 }
5145
5146 #[test]
5147 fn vecdeque_drop_zst() {
5148 static mut DROPS: i32 = 0;
5149 struct Elem;
5150 impl Drop for Elem {
5151 fn drop(&mut self) {
5152 unsafe {
5153 DROPS += 1;
5154 }
5155 }
5156 }
5157
5158 let mut ring = SliceDeque::new();
5159 ring.push_back(Elem);
5160 ring.push_front(Elem);
5161 ring.push_back(Elem);
5162 ring.push_front(Elem);
5163 mem::drop(ring);
5164
5165 assert_eq!(unsafe { DROPS }, 4);
5166 }
5167
5168 #[test]
5169 fn vecdeque_drop() {
5170 static mut DROPS: i32 = 0;
5171 #[derive(Clone)]
5172 struct Elem(i32);
5173 impl Drop for Elem {
5174 fn drop(&mut self) {
5175 unsafe {
5176 DROPS += 1;
5177 }
5178 }
5179 }
5180
5181 let mut ring = SliceDeque::new();
5182 ring.push_back(Elem(0));
5183 ring.push_front(Elem(1));
5184 ring.push_back(Elem(2));
5185 ring.push_front(Elem(3));
5186 mem::drop(ring);
5187
5188 assert_eq!(unsafe { DROPS }, 4);
5189 }
5190
5191 #[test]
5192 fn vecdeque_drop_with_pop_zst() {
5193 static mut DROPS: i32 = 0;
5194 struct Elem;
5195 impl Drop for Elem {
5196 fn drop(&mut self) {
5197 unsafe {
5198 DROPS += 1;
5199 }
5200 }
5201 }
5202
5203 let mut ring = SliceDeque::new();
5204 ring.push_back(Elem);
5205 ring.push_front(Elem);
5206 ring.push_back(Elem);
5207 ring.push_front(Elem);
5208
5209 mem::drop(ring.pop_back());
5210 mem::drop(ring.pop_front());
5211 assert_eq!(unsafe { DROPS }, 2);
5212
5213 mem::drop(ring);
5214 assert_eq!(unsafe { DROPS }, 4);
5215 }
5216
5217 #[test]
5218 fn vecdeque_drop_with_pop() {
5219 static mut DROPS: i32 = 0;
5220 struct Elem(i32);
5221 impl Drop for Elem {
5222 fn drop(&mut self) {
5223 unsafe {
5224 DROPS += 1;
5225 }
5226 }
5227 }
5228
5229 let mut ring = SliceDeque::new();
5230 ring.push_back(Elem(0));
5231 ring.push_front(Elem(0));
5232 ring.push_back(Elem(0));
5233 ring.push_front(Elem(0));
5234
5235 mem::drop(ring.pop_back());
5236 mem::drop(ring.pop_front());
5237 assert_eq!(unsafe { DROPS }, 2);
5238
5239 mem::drop(ring);
5240 assert_eq!(unsafe { DROPS }, 4);
5241 }
5242
5243 #[test]
5244 fn vecdeque_drop_clear_zst() {
5245 static mut DROPS: i32 = 0;
5246 struct Elem;
5247 impl Drop for Elem {
5248 fn drop(&mut self) {
5249 unsafe {
5250 DROPS += 1;
5251 }
5252 }
5253 }
5254
5255 let mut ring = SliceDeque::new();
5256 ring.push_back(Elem);
5257 ring.push_front(Elem);
5258 ring.push_back(Elem);
5259 ring.push_front(Elem);
5260 ring.clear();
5261 assert_eq!(unsafe { DROPS }, 4);
5262
5263 mem::drop(ring);
5264 assert_eq!(unsafe { DROPS }, 4);
5265 }
5266
5267 #[test]
5268 fn vecdeque_drop_clear() {
5269 static mut DROPS: i32 = 0;
5270 struct Elem(i32);
5271 impl Drop for Elem {
5272 fn drop(&mut self) {
5273 unsafe {
5274 DROPS += 1;
5275 }
5276 }
5277 }
5278
5279 let mut ring = SliceDeque::new();
5280 ring.push_back(Elem(0));
5281 ring.push_front(Elem(0));
5282 ring.push_back(Elem(0));
5283 ring.push_front(Elem(0));
5284 ring.clear();
5285 assert_eq!(unsafe { DROPS }, 4);
5286
5287 mem::drop(ring);
5288 assert_eq!(unsafe { DROPS }, 4);
5289 }
5290
5291 #[test]
5292 fn vecdeque_reserve_grow() {
5293 let mut ring = SliceDeque::with_capacity(4);
5296 for i in 0..3 {
5297 ring.push_back(i);
5298 }
5299 ring.reserve(7);
5300 for i in 0..3 {
5301 assert_eq!(ring.pop_front(), Some(i));
5302 }
5303
5304 let mut ring = SliceDeque::with_capacity(4);
5307 for i in 0..1 {
5308 ring.push_back(i);
5309 assert_eq!(ring.pop_front(), Some(i));
5310 }
5311 for i in 0..3 {
5312 ring.push_back(i);
5313 }
5314 ring.reserve(7);
5315 for i in 0..3 {
5316 assert_eq!(ring.pop_front(), Some(i));
5317 }
5318
5319 let mut ring = SliceDeque::with_capacity(4);
5322 for i in 0..3 {
5323 ring.push_back(i);
5324 assert_eq!(ring.pop_front(), Some(i));
5325 }
5326 for i in 0..3 {
5327 ring.push_back(i);
5328 }
5329 ring.reserve(7);
5330 for i in 0..3 {
5331 assert_eq!(ring.pop_front(), Some(i));
5332 }
5333 }
5334
5335 #[test]
5336 fn vecdeque_get() {
5337 let mut ring = SliceDeque::new();
5338 ring.push_back(0);
5339 assert_eq!(ring.get(0), Some(&0));
5340 assert_eq!(ring.get(1), None);
5341
5342 ring.push_back(1);
5343 assert_eq!(ring.get(0), Some(&0));
5344 assert_eq!(ring.get(1), Some(&1));
5345 assert_eq!(ring.get(2), None);
5346
5347 ring.push_back(2);
5348 assert_eq!(ring.get(0), Some(&0));
5349 assert_eq!(ring.get(1), Some(&1));
5350 assert_eq!(ring.get(2), Some(&2));
5351 assert_eq!(ring.get(3), None);
5352
5353 assert_eq!(ring.pop_front(), Some(0));
5354 assert_eq!(ring.get(0), Some(&1));
5355 assert_eq!(ring.get(1), Some(&2));
5356 assert_eq!(ring.get(2), None);
5357
5358 assert_eq!(ring.pop_front(), Some(1));
5359 assert_eq!(ring.get(0), Some(&2));
5360 assert_eq!(ring.get(1), None);
5361
5362 assert_eq!(ring.pop_front(), Some(2));
5363 assert_eq!(ring.get(0), None);
5364 assert_eq!(ring.get(1), None);
5365 }
5366
5367 #[test]
5368 fn vecdeque_get_mut() {
5369 let mut ring = SliceDeque::new();
5370 for i in 0..3 {
5371 ring.push_back(i);
5372 }
5373
5374 match ring.get_mut(1) {
5375 Some(x) => *x = -1,
5376 None => (),
5377 };
5378
5379 assert_eq!(ring.get_mut(0), Some(&mut 0));
5380 assert_eq!(ring.get_mut(1), Some(&mut -1));
5381 assert_eq!(ring.get_mut(2), Some(&mut 2));
5382 assert_eq!(ring.get_mut(3), None);
5383
5384 assert_eq!(ring.pop_front(), Some(0));
5385 assert_eq!(ring.get_mut(0), Some(&mut -1));
5386 assert_eq!(ring.get_mut(1), Some(&mut 2));
5387 assert_eq!(ring.get_mut(2), None);
5388 }
5389
5390 #[test]
5391 fn vecdeque_front() {
5392 let mut ring = SliceDeque::new();
5393 ring.push_back(10);
5394 ring.push_back(20);
5395 assert_eq!(ring.front(), Some(&10));
5396 ring.pop_front();
5397 assert_eq!(ring.front(), Some(&20));
5398 ring.pop_front();
5399 assert_eq!(ring.front(), None);
5400 }
5401
5402 #[test]
5403 fn vecdeque_as_slices() {
5404 let mut ring: SliceDeque<i32> = SliceDeque::with_capacity(127);
5405 let cap = ring.capacity() as i32;
5406 let first = cap / 2;
5407 let last = cap - first;
5408 for i in 0..first {
5409 ring.push_back(i);
5410
5411 let (left, right) = ring.as_slices();
5412 let expected: Vec<_> = (0..i + 1).collect();
5413 assert_eq!(left, &expected[..]);
5414 assert_eq!(right, []);
5415 }
5416
5417 for j in -last..0 {
5418 ring.push_front(j);
5419 let (left, right) = ring.as_slices();
5420 let mut expected_left: Vec<_> = (-last..j + 1).rev().collect();
5421 expected_left.extend(0..first);
5422 assert_eq!(left, &expected_left[..]);
5423 assert_eq!(right, []);
5424 }
5425
5426 assert_eq!(ring.len() as i32, cap);
5427 assert_eq!(ring.capacity() as i32, cap);
5428 }
5429
5430 #[test]
5431 fn vecdeque_as_mut_slices() {
5432 let mut ring: SliceDeque<i32> = SliceDeque::with_capacity(127);
5433 let cap = ring.capacity() as i32;
5434 let first = cap / 2;
5435 let last = cap - first;
5436 for i in 0..first {
5437 ring.push_back(i);
5438
5439 let (left, right) = ring.as_mut_slices();
5440 let expected: Vec<_> = (0..i + 1).collect();
5441 assert_eq!(left, &expected[..]);
5442 assert_eq!(right, []);
5443 }
5444
5445 for j in -last..0 {
5446 ring.push_front(j);
5447 let (left, right) = ring.as_mut_slices();
5448 let mut expected_left: Vec<_> = (-last..j + 1).rev().collect();
5449 expected_left.extend(0..first);
5450 assert_eq!(left, &expected_left[..]);
5451 assert_eq!(right, []);
5452 }
5453
5454 assert_eq!(ring.len() as i32, cap);
5455 assert_eq!(ring.capacity() as i32, cap);
5456 }
5457
5458 #[test]
5459 fn vecdeque_append() {
5460 let mut a: SliceDeque<_> = vec![1, 2, 3].into_iter().collect();
5461 let mut b: SliceDeque<_> = vec![4, 5, 6].into_iter().collect();
5462
5463 a.append(&mut b);
5465 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
5466 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
5467
5468 a.append(&mut b);
5470 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
5471 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), []);
5472
5473 b.append(&mut a);
5475 assert_eq!(b.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
5476 assert_eq!(a.iter().cloned().collect::<Vec<_>>(), []);
5477 }
5478
5479 #[test]
5480 fn vecdeque_retain() {
5481 let mut buf = SliceDeque::new();
5482 buf.extend(1..5);
5483 buf.retain(|&x| x % 2 == 0);
5484 let v: Vec<_> = buf.into_iter().collect();
5485 assert_eq!(&v[..], &[2, 4]);
5486 }
5487
5488 #[test]
5489 fn vecdeque_extend_ref() {
5490 let mut v = SliceDeque::new();
5491 v.push_back(1);
5492 v.extend(&[2, 3, 4]);
5493
5494 assert_eq!(v.len(), 4);
5495 assert_eq!(v[0], 1);
5496 assert_eq!(v[1], 2);
5497 assert_eq!(v[2], 3);
5498 assert_eq!(v[3], 4);
5499
5500 let mut w = SliceDeque::new();
5501 w.push_back(5);
5502 w.push_back(6);
5503 v.extend(&w);
5504
5505 assert_eq!(v.len(), 6);
5506 assert_eq!(v[0], 1);
5507 assert_eq!(v[1], 2);
5508 assert_eq!(v[2], 3);
5509 assert_eq!(v[3], 4);
5510 assert_eq!(v[4], 5);
5511 assert_eq!(v[5], 6);
5512 }
5513
5514 #[test]
5515 fn vecdeque_contains() {
5516 let mut v = SliceDeque::new();
5517 v.extend(&[2, 3, 4]);
5518
5519 assert!(v.contains(&3));
5520 assert!(!v.contains(&1));
5521
5522 v.clear();
5523
5524 assert!(!v.contains(&3));
5525 }
5526
5527 #[cfg(feature = "unstable")]
5537 #[test]
5538 fn vecdeque_is_empty() {
5539 let mut v = SliceDeque::<i32>::new();
5540 assert!(v.is_empty());
5541 assert!(v.iter().is_empty());
5542 assert!(v.iter_mut().is_empty());
5543 v.extend(&[2, 3, 4]);
5544 assert!(!v.is_empty());
5545 assert!(!v.iter().is_empty());
5546 assert!(!v.iter_mut().is_empty());
5547 while let Some(_) = v.pop_front() {
5548 assert_eq!(v.is_empty(), v.len() == 0);
5549 assert_eq!(v.iter().is_empty(), v.iter().len() == 0);
5550 assert_eq!(v.iter_mut().is_empty(), v.iter_mut().len() == 0);
5551 }
5552 assert!(v.is_empty());
5553 assert!(v.iter().is_empty());
5554 assert!(v.iter_mut().is_empty());
5555 assert!(v.into_iter().is_empty());
5556 }
5557
5558 #[cfg(all(feature = "bytes_buf", feature = "use_std"))]
5559 #[test]
5560 fn bytes_bufmut() {
5561 use bytes::{BigEndian, BufMut};
5562 use std::io::Write;
5563
5564 {
5565 let mut buf = sdeq![];
5566
5567 buf.put("hello world");
5568
5569 assert_eq!(buf, b"hello world");
5570 }
5571 {
5572 let mut buf = SliceDeque::with_capacity(16);
5573
5574 unsafe {
5575 buf.bytes_mut()[0] = b'h';
5576 buf.bytes_mut()[1] = b'e';
5577
5578 buf.advance_mut(2);
5579
5580 buf.bytes_mut()[0] = b'l';
5581 buf.bytes_mut()[1..3].copy_from_slice(b"lo");
5582
5583 buf.advance_mut(3);
5584 }
5585
5586 assert_eq!(5, buf.len());
5587 assert_eq!(buf, b"hello");
5588 }
5589 {
5590 let mut buf = SliceDeque::with_capacity(16);
5591
5592 unsafe {
5593 buf.bytes_mut()[0] = b'h';
5594 buf.bytes_mut()[1] = b'e';
5595
5596 buf.advance_mut(2);
5597
5598 buf.bytes_mut()[0] = b'l';
5599 buf.bytes_mut()[1..3].copy_from_slice(b"lo");
5600
5601 buf.advance_mut(3);
5602 }
5603
5604 assert_eq!(5, buf.len());
5605 assert_eq!(buf, b"hello");
5606 }
5607 {
5608 let mut buf = sdeq![];
5609
5610 buf.put(b'h');
5611 buf.put(&b"ello"[..]);
5612 buf.put(" world");
5613
5614 assert_eq!(buf, b"hello world");
5615 }
5616 {
5617 let mut buf = sdeq![];
5618 buf.put_u8(0x01);
5619 assert_eq!(buf, b"\x01");
5620 }
5621 {
5622 let mut buf = sdeq![];
5623 buf.put_i8(0x01);
5624 assert_eq!(buf, b"\x01");
5625 }
5626 {
5627 let mut buf = sdeq![];
5628 buf.put_u16::<BigEndian>(0x0809);
5629 assert_eq!(buf, b"\x08\x09");
5630 }
5631 {
5632 let mut buf = sdeq![];
5633
5634 {
5635 let reference = buf.by_ref();
5636
5637 let mut writer = reference.writer();
5639
5640 Write::write(&mut writer, &b"hello world"[..]).unwrap();
5642 } assert_eq!(buf, &b"hello world"[..]);
5645 }
5646 {
5647 let mut buf = sdeq![].writer();
5648
5649 let num = buf.write(&b"hello world"[..]).unwrap();
5650 assert_eq!(11, num);
5651
5652 let buf = buf.into_inner();
5653
5654 assert_eq!(*buf, b"hello world"[..]);
5655 }
5656 }
5657
5658 #[cfg(all(feature = "bytes_buf", feature = "use_std"))]
5659 #[test]
5660 fn bytes_buf() {
5661 {
5662 use bytes::{Buf, Bytes, IntoBuf};
5663
5664 let buf = Bytes::from(&b"hello world"[..]).into_buf();
5665 let vec: SliceDeque<u8> = buf.collect();
5666
5667 assert_eq!(vec, &b"hello world"[..]);
5668 }
5669 {
5670 use bytes::{Buf, BufMut};
5671 use std::io::Cursor;
5672
5673 let mut buf = Cursor::new("hello world").take(5);
5674 let mut dst = sdeq![];
5675
5676 dst.put(&mut buf);
5677 assert_eq!(dst, b"hello");
5678
5679 let mut buf = buf.into_inner();
5680 dst.clear();
5681 dst.put(&mut buf);
5682 assert_eq!(dst, b" world");
5683 }
5684 {
5685 use bytes::{Buf, BufMut};
5686 use std::io::Cursor;
5687
5688 let mut buf = Cursor::new("hello world");
5689 let mut dst = sdeq![];
5690
5691 {
5692 let reference = buf.by_ref();
5693 dst.put(&mut reference.take(5));
5694 assert_eq!(dst, b"hello");
5695 } dst.clear();
5698 dst.put(&mut buf);
5699 assert_eq!(dst, b" world");
5700 }
5701 }
5702
5703 #[test]
5704 fn issue_42() {
5705 let page_size = crate::mirrored::allocation_granularity();
5707 let mut deque = SliceDeque::<u8>::with_capacity(page_size);
5708 let page_size = page_size as isize;
5709
5710 let slice = unsafe {
5711 deque.move_tail(page_size);
5712 deque.move_head(page_size / 100 * 99);
5713 deque.move_tail(page_size / 100 * 99);
5714 deque.move_head(page_size / 100 * 99);
5715 deque.tail_head_slice()
5716 };
5717
5718 for i in 0..slice.len() {
5719 slice[i] = 0;
5721 }
5722 }
5723
5724 #[test]
5725 fn issue_45() {
5726 fn refill(buf: &mut SliceDeque<u8>) {
5728 let data = [0u8; MAX_SAMPLES_PER_FRAME * 5];
5729 buf.extend(data.iter());
5730 }
5731
5732 const MAX_SAMPLES_PER_FRAME: usize = 1152 * 2;
5733 const BUFFER_SIZE: usize = MAX_SAMPLES_PER_FRAME * 15;
5734 const REFILL_TRIGGER: usize = MAX_SAMPLES_PER_FRAME * 8;
5735
5736 let mut buf = SliceDeque::with_capacity(BUFFER_SIZE);
5737 for _ in 0..10_000 {
5738 if buf.len() < REFILL_TRIGGER {
5739 refill(&mut buf);
5740 }
5741
5742 let cur_len = buf.len();
5743 buf.truncate_front(cur_len - 10);
5744 }
5745 }
5746
5747 #[test]
5748 fn issue_47() {
5749 let page_size = crate::mirrored::allocation_granularity();
5750 let mut sdq = SliceDeque::<u8>::new();
5751 let vec = vec![0_u8; page_size + 1];
5752 sdq.extend(vec);
5753 }
5754
5755 #[test]
5756 fn issue_50() {
5757 use std::fs::File;
5758 use std::io::Write;
5759 use std::path::Path;
5760
5761 let out_buffer = SliceDeque::new();
5762
5763 let p = if cfg!(target_os = "windows") {
5764 "slice_deque_test"
5765 } else {
5766 "/tmp/slice_deque_test"
5767 };
5768
5769 let mut out_file = File::create(Path::new(p)).unwrap();
5770 let res = out_file.write(&out_buffer[..]);
5771 println!("Result was {:?}", res);
5772 println!("Buffer size: {}", out_buffer.len());
5773 println!("Address of buffer was: {:?}", out_buffer.as_ptr());
5774 }
5775
5776 #[test]
5777 fn empty_ptr() {
5778 {
5779 let sdeq = SliceDeque::<i8>::new();
5780 let v = Vec::<i8>::new();
5781 assert_eq!(sdeq.as_ptr() as usize, mem::align_of::<i8>());
5782 assert_eq!(v.as_ptr() as usize, mem::align_of::<i8>());
5783 }
5784 {
5785 let sdeq = SliceDeque::<i16>::new();
5786 let v = Vec::<i16>::new();
5787 assert_eq!(sdeq.as_ptr() as usize, mem::align_of::<i16>());
5788 assert_eq!(v.as_ptr() as usize, mem::align_of::<i16>());
5789 }
5790 {
5791 let sdeq = SliceDeque::<i32>::new();
5792 let v = Vec::<i32>::new();
5793 assert_eq!(sdeq.as_ptr() as usize, mem::align_of::<i32>());
5794 assert_eq!(v.as_ptr() as usize, mem::align_of::<i32>());
5795 }
5796 {
5797 let sdeq = SliceDeque::<i64>::new();
5798 let v = Vec::<i64>::new();
5799 assert_eq!(sdeq.as_ptr() as usize, mem::align_of::<i64>());
5800 assert_eq!(v.as_ptr() as usize, mem::align_of::<i64>());
5801 }
5802 {
5803 #[repr(align(32))]
5804 struct Foo(i8);
5805 let sdeq = SliceDeque::<Foo>::new();
5806 let v = Vec::<Foo>::new();
5807 assert_eq!(sdeq.as_ptr() as usize, mem::align_of::<Foo>());
5808 assert_eq!(v.as_ptr() as usize, mem::align_of::<Foo>());
5809 }
5810 }
5811
5812 #[test]
5813 fn issue_57() {
5814 const C: [i16; 3] = [42; 3];
5815
5816 let mut deque = SliceDeque::new();
5817
5818 for _ in 0..918 {
5819 deque.push_front(C);
5820 }
5821
5822 for _ in 0..237 {
5823 assert_eq!(deque.pop_front(), Some(C));
5824 assert!(!deque.is_empty());
5825 assert_eq!(*deque.back().unwrap(), C);
5826 }
5827 }
5828
5829 #[test]
5830 fn drop_count() {
5831 #[repr(C)]
5832 struct Foo(*mut usize);
5833 impl Drop for Foo {
5834 fn drop(&mut self) {
5835 unsafe {
5836 *self.0 += 1;
5837 }
5838 }
5839 }
5840
5841 let mut count = 0_usize;
5842 {
5843 let mut deque = SliceDeque::new();
5844 for _ in 0..10 {
5845 deque.push_back(Foo(&mut count as *mut _));
5846 deque.pop_front();
5847 }
5848 }
5849 assert_eq!(count, 10);
5850 }
5851
5852 #[test]
5853 fn non_fitting_elem_type() {
5854 #[repr(C)]
5858 struct NonFitting(u8, u8, u8);
5859 impl NonFitting {
5860 fn new() -> Self {
5861 Self(1, 2, 3)
5862 }
5863 fn valid(&self) -> bool {
5864 if self.0 == 1 && self.1 == 2 && self.2 == 3 {
5866 true
5867 } else {
5868 dbg!((self.0, self.1, self.2));
5869 false
5870 }
5871 }
5872 }
5873
5874 impl Drop for NonFitting {
5875 fn drop(&mut self) {
5876 unsafe {
5878 let ptr = self as *mut Self as *mut u8;
5879 ptr.write_volatile(4);
5880 ptr.add(1).write_volatile(5);
5881 ptr.add(2).write_volatile(6);
5882 }
5883 }
5884 }
5885
5886 let page_size = crate::mirrored::allocation_granularity();
5887 let elem_size = mem::size_of::<NonFitting>();
5888
5889 assert!(elem_size % page_size != 0);
5890 let no_elements_that_fit = page_size / elem_size;
5891
5892 let mut deque = SliceDeque::new();
5898 deque.push_back(NonFitting::new());
5899
5900 for i in 0..no_elements_that_fit {
5901 if i > no_elements_that_fit - 2 {
5902 }
5904 deque.push_back(NonFitting::new());
5906 deque.truncate_front(1);
5908 assert_eq!(deque.len(), 1);
5909 assert!(deque[0].valid());
5910 }
5911 }
5912
5913 #[test]
5914 fn issue_57_2() {
5915 let mut deque = SliceDeque::new();
5916 for _ in 0..30_000 {
5917 deque.push_back(String::from("test"));
5918 if deque.len() == 8 {
5919 deque.pop_front();
5920 }
5921 }
5922 }
5923
5924 #[test]
5925 fn zst() {
5926 struct A;
5927 let mut s = SliceDeque::<A>::new();
5928 assert_eq!(s.len(), 0);
5929 assert_eq!(s.capacity(), isize::max_value() as usize);
5930
5931 for _ in 0..10 {
5932 s.push_back(A);
5933 }
5934 assert_eq!(s.len(), 10);
5935 }
5936
5937 #[test]
5938 fn sync() {
5939 fn assert_sync<T: Sync>(_: T) {}
5940
5941 struct S(*mut u8);
5942 unsafe impl Sync for S {}
5943 let x = SliceDeque::<S>::new();
5944 assert_sync(x);
5945 }
5946
5947 #[test]
5948 fn send() {
5949 fn assert_send<T: Send>(_: T) {}
5950
5951 struct S(*mut u8);
5952 unsafe impl Send for S {}
5953 let x = SliceDeque::<S>::new();
5954 assert_send(x);
5955 }
5956}