Skip to content

Commit e16d17a

Browse files
Revert "Add advance_by and advance_back_by"
This reverts commit ecacc75.
1 parent a1dfd24 commit e16d17a

File tree

5 files changed

+16
-161
lines changed

5 files changed

+16
-161
lines changed

library/core/src/iter/adapters/mod.rs

-10
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,6 @@ where
124124
self.iter.size_hint()
125125
}
126126

127-
#[inline]
128-
fn advance_by(&mut self, n: usize) -> Result<(), usize> {
129-
self.iter.advance_back_by(n)
130-
}
131-
132127
#[inline]
133128
fn nth(&mut self, n: usize) -> Option<<I as Iterator>::Item> {
134129
self.iter.nth_back(n)
@@ -169,11 +164,6 @@ where
169164
self.iter.next()
170165
}
171166

172-
#[inline]
173-
fn advance_back_by(&mut self, n: usize) -> Result<(), usize> {
174-
self.iter.advance_by(n)
175-
}
176-
177167
#[inline]
178168
fn nth_back(&mut self, n: usize) -> Option<<I as Iterator>::Item> {
179169
self.iter.nth(n)

library/core/src/iter/traits/double_ended.rs

+8-46
Original file line numberDiff line numberDiff line change
@@ -91,46 +91,6 @@ pub trait DoubleEndedIterator: Iterator {
9191
#[stable(feature = "rust1", since = "1.0.0")]
9292
fn next_back(&mut self) -> Option<Self::Item>;
9393

94-
/// Advances the iterator from the back by `n` elements.
95-
///
96-
/// `advance_back_by` is the reverse version of [`advance_by`]. This method will
97-
/// eagerly skip `n` elements starting from the back by calling [`next_back`] up
98-
/// to `n` times until [`None`] is encountered.
99-
///
100-
/// `advance_back_by(n)` will return [`Ok(())`] if the iterator successfully advances by
101-
/// `n` elements, or [`Err(k)`] if [`None`] is encountered, where `k` is the number of
102-
/// elements the iterator is advanced by before running out of elements (i.e. the length
103-
/// of the iterator). Note that `k` is always less than `n`.
104-
///
105-
/// Calling `advance_back_by(0)` does not consume any elements and always returns [`Ok(())`].
106-
///
107-
/// [`advance_by`]: Iterator::advance_by
108-
/// [`next_back`]: DoubleEndedIterator::next_back
109-
///
110-
/// # Examples
111-
///
112-
/// Basic usage:
113-
///
114-
/// ```
115-
/// #![feature(iter_advance_by)]
116-
///
117-
/// let a = [3, 4, 5, 6];
118-
/// let mut iter = a.iter();
119-
///
120-
/// assert_eq!(iter.advance_back_by(2), Ok(()));
121-
/// assert_eq!(iter.next_back(), Some(&4));
122-
/// assert_eq!(iter.advance_back_by(0), Ok(()));
123-
/// assert_eq!(iter.advance_back_by(100), Err(1)); // only `&3` was skipped
124-
/// ```
125-
#[inline]
126-
#[unstable(feature = "iter_advance_by", reason = "recently added", issue = "77404")]
127-
fn advance_back_by(&mut self, n: usize) -> Result<(), usize> {
128-
for i in 0..n {
129-
self.next_back().ok_or(i)?;
130-
}
131-
Ok(())
132-
}
133-
13494
/// Returns the `n`th element from the end of the iterator.
13595
///
13696
/// This is essentially the reversed version of [`Iterator::nth()`].
@@ -174,9 +134,14 @@ pub trait DoubleEndedIterator: Iterator {
174134
/// ```
175135
#[inline]
176136
#[stable(feature = "iter_nth_back", since = "1.37.0")]
177-
fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
178-
self.advance_back_by(n).ok()?;
179-
self.next_back()
137+
fn nth_back(&mut self, mut n: usize) -> Option<Self::Item> {
138+
for x in self.rev() {
139+
if n == 0 {
140+
return Some(x);
141+
}
142+
n -= 1;
143+
}
144+
None
180145
}
181146

182147
/// This is the reverse version of [`Iterator::try_fold()`]: it takes
@@ -353,9 +318,6 @@ impl<'a, I: DoubleEndedIterator + ?Sized> DoubleEndedIterator for &'a mut I {
353318
fn next_back(&mut self) -> Option<I::Item> {
354319
(**self).next_back()
355320
}
356-
fn advance_back_by(&mut self, n: usize) -> Result<(), usize> {
357-
(**self).advance_back_by(n)
358-
}
359321
fn nth_back(&mut self, n: usize) -> Option<I::Item> {
360322
(**self).nth_back(n)
361323
}

library/core/src/iter/traits/iterator.rs

+8-44
Original file line numberDiff line numberDiff line change
@@ -284,44 +284,6 @@ pub trait Iterator {
284284
self.fold(None, some)
285285
}
286286

287-
/// Advances the iterator by `n` elements.
288-
///
289-
/// This method will eagerly skip `n` elements by calling [`next`] up to `n`
290-
/// times until [`None`] is encountered.
291-
///
292-
/// `advance_by(n)` will return [`Ok(())`] if the iterator successfully advances by
293-
/// `n` elements, or [`Err(k)`] if [`None`] is encountered, where `k` is the number
294-
/// of elements the iterator is advanced by before running out of elements (i.e. the
295-
/// length of the iterator). Note that `k` is always less than `n`.
296-
///
297-
/// Calling `advance_by(0)` does not consume any elements and always returns [`Ok(())`].
298-
///
299-
/// [`next`]: Iterator::next
300-
///
301-
/// # Examples
302-
///
303-
/// Basic usage:
304-
///
305-
/// ```
306-
/// #![feature(iter_advance_by)]
307-
///
308-
/// let a = [1, 2, 3, 4];
309-
/// let mut iter = a.iter();
310-
///
311-
/// assert_eq!(iter.advance_by(2), Ok(()));
312-
/// assert_eq!(iter.next(), Some(&3));
313-
/// assert_eq!(iter.advance_by(0), Ok(()));
314-
/// assert_eq!(iter.advance_by(100), Err(1)); // only `&4` was skipped
315-
/// ```
316-
#[inline]
317-
#[unstable(feature = "iter_advance_by", reason = "recently added", issue = "77404")]
318-
fn advance_by(&mut self, n: usize) -> Result<(), usize> {
319-
for i in 0..n {
320-
self.next().ok_or(i)?;
321-
}
322-
Ok(())
323-
}
324-
325287
/// Returns the `n`th element of the iterator.
326288
///
327289
/// Like most indexing operations, the count starts from zero, so `nth(0)`
@@ -363,9 +325,14 @@ pub trait Iterator {
363325
/// ```
364326
#[inline]
365327
#[stable(feature = "rust1", since = "1.0.0")]
366-
fn nth(&mut self, n: usize) -> Option<Self::Item> {
367-
self.advance_by(n).ok()?;
368-
self.next()
328+
fn nth(&mut self, mut n: usize) -> Option<Self::Item> {
329+
while let Some(x) = self.next() {
330+
if n == 0 {
331+
return Some(x);
332+
}
333+
n -= 1;
334+
}
335+
None
369336
}
370337

371338
/// Creates an iterator starting at the same point, but stepping by
@@ -3298,9 +3265,6 @@ impl<I: Iterator + ?Sized> Iterator for &mut I {
32983265
fn size_hint(&self) -> (usize, Option<usize>) {
32993266
(**self).size_hint()
33003267
}
3301-
fn advance_by(&mut self, n: usize) -> Result<(), usize> {
3302-
(**self).advance_by(n)
3303-
}
33043268
fn nth(&mut self, n: usize) -> Option<Self::Item> {
33053269
(**self).nth(n)
33063270
}

library/core/tests/iter.rs

-60
Original file line numberDiff line numberDiff line change
@@ -1570,66 +1570,6 @@ fn test_iterator_rev_nth() {
15701570
assert_eq!(v.iter().rev().nth(v.len()), None);
15711571
}
15721572

1573-
#[test]
1574-
fn test_iterator_advance_by() {
1575-
let v: &[_] = &[0, 1, 2, 3, 4];
1576-
1577-
for i in 0..v.len() {
1578-
let mut iter = v.iter();
1579-
assert_eq!(iter.advance_by(i), Ok(()));
1580-
assert_eq!(iter.next().unwrap(), &v[i]);
1581-
assert_eq!(iter.advance_by(100), Err(v.len() - 1 - i));
1582-
}
1583-
1584-
assert_eq!(v.iter().advance_by(v.len()), Ok(()));
1585-
assert_eq!(v.iter().advance_by(100), Err(v.len()));
1586-
}
1587-
1588-
#[test]
1589-
fn test_iterator_advance_back_by() {
1590-
let v: &[_] = &[0, 1, 2, 3, 4];
1591-
1592-
for i in 0..v.len() {
1593-
let mut iter = v.iter();
1594-
assert_eq!(iter.advance_back_by(i), Ok(()));
1595-
assert_eq!(iter.next_back().unwrap(), &v[v.len() - 1 - i]);
1596-
assert_eq!(iter.advance_back_by(100), Err(v.len() - 1 - i));
1597-
}
1598-
1599-
assert_eq!(v.iter().advance_back_by(v.len()), Ok(()));
1600-
assert_eq!(v.iter().advance_back_by(100), Err(v.len()));
1601-
}
1602-
1603-
#[test]
1604-
fn test_iterator_rev_advance_by() {
1605-
let v: &[_] = &[0, 1, 2, 3, 4];
1606-
1607-
for i in 0..v.len() {
1608-
let mut iter = v.iter().rev();
1609-
assert_eq!(iter.advance_by(i), Ok(()));
1610-
assert_eq!(iter.next().unwrap(), &v[v.len() - 1 - i]);
1611-
assert_eq!(iter.advance_by(100), Err(v.len() - 1 - i));
1612-
}
1613-
1614-
assert_eq!(v.iter().rev().advance_by(v.len()), Ok(()));
1615-
assert_eq!(v.iter().rev().advance_by(100), Err(v.len()));
1616-
}
1617-
1618-
#[test]
1619-
fn test_iterator_rev_advance_back_by() {
1620-
let v: &[_] = &[0, 1, 2, 3, 4];
1621-
1622-
for i in 0..v.len() {
1623-
let mut iter = v.iter().rev();
1624-
assert_eq!(iter.advance_back_by(i), Ok(()));
1625-
assert_eq!(iter.next_back().unwrap(), &v[i]);
1626-
assert_eq!(iter.advance_back_by(100), Err(v.len() - 1 - i));
1627-
}
1628-
1629-
assert_eq!(v.iter().rev().advance_back_by(v.len()), Ok(()));
1630-
assert_eq!(v.iter().rev().advance_back_by(100), Err(v.len()));
1631-
}
1632-
16331573
#[test]
16341574
fn test_iterator_last() {
16351575
let v: &[_] = &[0, 1, 2, 3, 4];

library/core/tests/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
#![feature(slice_partition_dedup)]
4242
#![feature(int_error_matching)]
4343
#![feature(array_value_iter)]
44-
#![feature(iter_advance_by)]
4544
#![feature(iter_partition_in_place)]
4645
#![feature(iter_is_partitioned)]
4746
#![feature(iter_order_by)]

0 commit comments

Comments
 (0)