|
1 | 1 | //! A fixed capacity [`Vec`](https://doc.rust-lang.org/std/vec/struct.Vec.html). |
2 | 2 |
|
3 | 3 | use core::borrow; |
| 4 | +use core::iter::FusedIterator; |
4 | 5 | use core::marker::PhantomData; |
5 | 6 | use core::{ |
6 | 7 | cmp::Ordering, |
@@ -1472,6 +1473,31 @@ impl<T, LenT: LenType, const N: usize> Iterator for IntoIter<T, N, LenT> { |
1472 | 1473 | None |
1473 | 1474 | } |
1474 | 1475 | } |
| 1476 | + |
| 1477 | + fn size_hint(&self) -> (usize, Option<usize>) { |
| 1478 | + let len = self.len(); |
| 1479 | + (len, Some(len)) |
| 1480 | + } |
| 1481 | +} |
| 1482 | + |
| 1483 | +impl<T, LenT: LenType, const N: usize> DoubleEndedIterator for IntoIter<T, N, LenT> { |
| 1484 | + fn next_back(&mut self) -> Option<Self::Item> { |
| 1485 | + if self.next < self.vec.len { |
| 1486 | + // SAFETY: len must be non-zero as next is less than len. |
| 1487 | + let item = unsafe { self.vec.pop_unchecked() }; |
| 1488 | + Some(item) |
| 1489 | + } else { |
| 1490 | + None |
| 1491 | + } |
| 1492 | + } |
| 1493 | +} |
| 1494 | + |
| 1495 | +impl<T, LenT: LenType, const N: usize> FusedIterator for IntoIter<T, N, LenT> {} |
| 1496 | + |
| 1497 | +impl<T, LenT: LenType, const N: usize> ExactSizeIterator for IntoIter<T, N, LenT> { |
| 1498 | + fn len(&self) -> usize { |
| 1499 | + (self.vec.len - self.next).into_usize() |
| 1500 | + } |
1475 | 1501 | } |
1476 | 1502 |
|
1477 | 1503 | impl<T, LenT: LenType, const N: usize> Clone for IntoIter<T, N, LenT> |
@@ -2034,6 +2060,32 @@ mod tests { |
2034 | 2060 | assert_eq!(Droppable::count(), 0); |
2035 | 2061 | } |
2036 | 2062 |
|
| 2063 | + #[test] |
| 2064 | + fn iter_move_next_back() { |
| 2065 | + let mut vec: Vec<&str, 3> = Vec::new(); |
| 2066 | + vec.push("a").unwrap(); |
| 2067 | + vec.push("b").unwrap(); |
| 2068 | + vec.push("c").unwrap(); |
| 2069 | + let mut items = vec.into_iter(); |
| 2070 | + let _ = items.next(); // Remove the first item. |
| 2071 | + assert_eq!(items.next_back(), Some("c")); |
| 2072 | + assert_eq!(items.next_back(), Some("b")); |
| 2073 | + assert_eq!(items.next_back(), None); |
| 2074 | + } |
| 2075 | + |
| 2076 | + #[test] |
| 2077 | + fn iter_move_len() { |
| 2078 | + let mut vec: Vec<&str, 2> = Vec::new(); |
| 2079 | + vec.push("a").unwrap(); |
| 2080 | + vec.push("b").unwrap(); |
| 2081 | + let mut items = vec.into_iter(); |
| 2082 | + assert_eq!(items.len(), 2); |
| 2083 | + let _ = items.next(); // Remove the first item. |
| 2084 | + assert_eq!(items.len(), 1); |
| 2085 | + let _ = items.next_back(); // Remove the last item. |
| 2086 | + assert_eq!(items.len(), 0); |
| 2087 | + } |
| 2088 | + |
2037 | 2089 | #[test] |
2038 | 2090 | fn push_and_pop() { |
2039 | 2091 | let mut v: Vec<i32, 4> = Vec::new(); |
|
0 commit comments