Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion library/core/src/iter/adapters/chain.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::iter::{FusedIterator, TrustedLen};
use crate::iter::{FusedIterator, InfiniteIterator, TrustedLen};
use crate::num::NonZero;
use crate::ops::Try;

Expand Down Expand Up @@ -335,3 +335,15 @@ fn and_then_or_clear<T, U>(opt: &mut Option<T>, f: impl FnOnce(&mut T) -> Option
}
x
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<A, B> !ExactSizeIterator for Chain<A, B> {}

// FIXME: Get this working with the symmetrical variant
#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<A, B> InfiniteIterator for Chain<A, B>
where
A: Iterator,
B: InfiniteIterator<Item = A::Item>,
{
}
15 changes: 14 additions & 1 deletion library/core/src/iter/adapters/cloned.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ use core::num::NonZero;

use crate::iter::adapters::zip::try_get_unchecked;
use crate::iter::adapters::{SourceIter, TrustedRandomAccess, TrustedRandomAccessNoCoerce};
use crate::iter::{FusedIterator, InPlaceIterable, TrustedLen, UncheckedIterator};
use crate::iter::{
FusedIterator, InPlaceIterable, InfiniteIterator, TrustedLen, UncheckedIterator,
};
use crate::ops::Try;

/// An iterator that clones the elements of an underlying iterator.
Expand Down Expand Up @@ -188,3 +190,14 @@ unsafe impl<I: InPlaceIterable> InPlaceIterable for Cloned<I> {
const EXPAND_BY: Option<NonZero<usize>> = I::EXPAND_BY;
const MERGE_BY: Option<NonZero<usize>> = I::MERGE_BY;
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: !ExactSizeIterator> !ExactSizeIterator for Cloned<I> {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<'a, I, T: 'a> InfiniteIterator for Cloned<I>
where
I: InfiniteIterator<Item = &'a T>,
T: Clone,
{
}
13 changes: 12 additions & 1 deletion library/core/src/iter/adapters/copied.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::iter::adapters::zip::try_get_unchecked;
use crate::iter::adapters::{SourceIter, TrustedRandomAccess, TrustedRandomAccessNoCoerce};
use crate::iter::{FusedIterator, InPlaceIterable, TrustedLen};
use crate::iter::{FusedIterator, InPlaceIterable, InfiniteIterator, TrustedLen};
use crate::mem::{MaybeUninit, SizedTypeProperties};
use crate::num::NonZero;
use crate::ops::Try;
Expand Down Expand Up @@ -273,3 +273,14 @@ unsafe impl<I: InPlaceIterable> InPlaceIterable for Copied<I> {
const EXPAND_BY: Option<NonZero<usize>> = I::EXPAND_BY;
const MERGE_BY: Option<NonZero<usize>> = I::MERGE_BY;
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: !ExactSizeIterator> !ExactSizeIterator for Copied<I> {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<'a, I, T> InfiniteIterator for Copied<I>
where
I: InfiniteIterator<Item = &'a T>,
T: Copy + 'a,
{
}
8 changes: 7 additions & 1 deletion library/core/src/iter/adapters/cycle.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::iter::FusedIterator;
use crate::iter::{FusedIterator, InfiniteIterator};
use crate::num::NonZero;
use crate::ops::Try;

Expand Down Expand Up @@ -107,3 +107,9 @@ where

#[stable(feature = "fused", since = "1.26.0")]
impl<I> FusedIterator for Cycle<I> where I: Clone + Iterator {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I> !ExactSizeIterator for Cycle<I> {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: Clone + Iterator> InfiniteIterator for Cycle<I> {}
8 changes: 7 additions & 1 deletion library/core/src/iter/adapters/enumerate.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::iter::adapters::zip::try_get_unchecked;
use crate::iter::adapters::{SourceIter, TrustedRandomAccess, TrustedRandomAccessNoCoerce};
use crate::iter::{FusedIterator, InPlaceIterable, TrustedFused, TrustedLen};
use crate::iter::{FusedIterator, InPlaceIterable, InfiniteIterator, TrustedFused, TrustedLen};
use crate::num::NonZero;
use crate::ops::Try;

Expand Down Expand Up @@ -315,3 +315,9 @@ impl<I: Default> Default for Enumerate<I> {
Enumerate::new(Default::default())
}
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: !ExactSizeIterator> !ExactSizeIterator for Enumerate<I> {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: InfiniteIterator> InfiniteIterator for Enumerate<I> {}
13 changes: 12 additions & 1 deletion library/core/src/iter/adapters/filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use core::ops::ControlFlow;

use crate::fmt;
use crate::iter::adapters::SourceIter;
use crate::iter::{FusedIterator, InPlaceIterable, TrustedFused};
use crate::iter::{FusedIterator, InPlaceIterable, InfiniteIterator, TrustedFused};
use crate::num::NonZero;
use crate::ops::Try;

Expand Down Expand Up @@ -214,3 +214,14 @@ unsafe impl<I: InPlaceIterable, P> InPlaceIterable for Filter<I, P> {
const EXPAND_BY: Option<NonZero<usize>> = I::EXPAND_BY;
const MERGE_BY: Option<NonZero<usize>> = I::MERGE_BY;
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I, P> !ExactSizeIterator for Filter<I, P> {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I, P> InfiniteIterator for Filter<I, P>
where
I: InfiniteIterator,
P: FnMut(&I::Item) -> bool,
{
}
11 changes: 10 additions & 1 deletion library/core/src/iter/adapters/filter_map.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::iter::adapters::SourceIter;
use crate::iter::{FusedIterator, InPlaceIterable, TrustedFused};
use crate::iter::{FusedIterator, InPlaceIterable, InfiniteIterator, TrustedFused};
use crate::mem::{ManuallyDrop, MaybeUninit};
use crate::num::NonZero;
use crate::ops::{ControlFlow, Try};
Expand Down Expand Up @@ -211,3 +211,12 @@ unsafe impl<I: InPlaceIterable, F> InPlaceIterable for FilterMap<I, F> {
const EXPAND_BY: Option<NonZero<usize>> = I::EXPAND_BY;
const MERGE_BY: Option<NonZero<usize>> = I::MERGE_BY;
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I, F> !ExactSizeIterator for FilterMap<I, F> {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<B, I: InfiniteIterator, F> InfiniteIterator for FilterMap<I, F> where
F: FnMut(I::Item) -> Option<B>
{
}
57 changes: 55 additions & 2 deletions library/core/src/iter/adapters/flatten.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use crate::iter::adapters::SourceIter;
use crate::iter::{
Cloned, Copied, Empty, Filter, FilterMap, Fuse, FusedIterator, Map, Once, OnceWith,
TrustedFused, TrustedLen,
Cloned, Copied, Empty, Filter, FilterMap, Fuse, FusedIterator, InfiniteIterator, Map, Once,
OnceWith, TrustedFused, TrustedLen,
};
use crate::num::NonZero;
use crate::ops::{ControlFlow, Try};
Expand Down Expand Up @@ -172,6 +172,26 @@ where
}
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: !ExactSizeIterator, U, F> !ExactSizeIterator for FlatMap<I, U, F> {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I, U, F> !ExactSizeIterator for FlatMap<I, U, F>
where
I: ExactSizeIterator<Item = U>,
U: !ExactSizeIterator,
{
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I, U, F> InfiniteIterator for FlatMap<I, U, F>
where
I: InfiniteIterator,
U: IntoIterator,
F: FnMut(I::Item) -> U,
{
}

/// An iterator that flattens one level of nesting in an iterator of things
/// that can be turned into iterators.
///
Expand Down Expand Up @@ -349,6 +369,20 @@ where
}
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: !ExactSizeIterator> !ExactSizeIterator for Flatten<I> {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I> !ExactSizeIterator for Flatten<I>
where
I: ExactSizeIterator,
I::Item: !ExactSizeIterator,
{
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I> InfiniteIterator for Flatten<I> where I: InfiniteIterator<Item: IntoIterator> {}

/// Real logic of both `Flatten` and `FlatMap` which simply delegate to
/// this type.
#[derive(Clone, Debug)]
Expand Down Expand Up @@ -712,6 +746,25 @@ where
{
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: !ExactSizeIterator, U> !ExactSizeIterator for FlattenCompat<I, U> {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I, U> !ExactSizeIterator for FlattenCompat<I, U>
where
I: ExactSizeIterator<Item: IntoIterator<IntoIter = U, Item = U::Item>>,
U: Iterator + !ExactSizeIterator,
{
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I, U> InfiniteIterator for FlattenCompat<I, U>
where
I: InfiniteIterator<Item: IntoIterator<IntoIter = U, Item = U::Item>>,
U: Iterator,
{
}

trait ConstSizeIntoIterator: IntoIterator {
// FIXME(#31844): convert to an associated const once specialization supports that
fn size() -> Option<usize>;
Expand Down
8 changes: 7 additions & 1 deletion library/core/src/iter/adapters/inspect.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::fmt;
use crate::iter::adapters::SourceIter;
use crate::iter::{FusedIterator, InPlaceIterable, TrustedFused};
use crate::iter::{FusedIterator, InPlaceIterable, InfiniteIterator, TrustedFused};
use crate::num::NonZero;
use crate::ops::Try;

Expand Down Expand Up @@ -172,3 +172,9 @@ unsafe impl<I: InPlaceIterable, F> InPlaceIterable for Inspect<I, F> {
const EXPAND_BY: Option<NonZero<usize>> = I::EXPAND_BY;
const MERGE_BY: Option<NonZero<usize>> = I::MERGE_BY;
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: !ExactSizeIterator, F> !ExactSizeIterator for Inspect<I, F> {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: InfiniteIterator, F> InfiniteIterator for Inspect<I, F> where F: FnMut(&I::Item) {}
12 changes: 12 additions & 0 deletions library/core/src/iter/adapters/map.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::fmt;
use crate::iter::adapters::zip::try_get_unchecked;
use crate::iter::adapters::{SourceIter, TrustedRandomAccess, TrustedRandomAccessNoCoerce};
use crate::iter::traits::InfiniteIterator;
use crate::iter::{FusedIterator, InPlaceIterable, TrustedFused, TrustedLen, UncheckedIterator};
use crate::num::NonZero;
use crate::ops::Try;
Expand Down Expand Up @@ -239,3 +240,14 @@ unsafe impl<I: InPlaceIterable, F> InPlaceIterable for Map<I, F> {
const EXPAND_BY: Option<NonZero<usize>> = I::EXPAND_BY;
const MERGE_BY: Option<NonZero<usize>> = I::MERGE_BY;
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: !ExactSizeIterator, F> !ExactSizeIterator for Map<I, F> {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<B, I: Iterator, F> InfiniteIterator for Map<I, F>
where
F: FnMut(I::Item) -> B,
I: InfiniteIterator + !ExactSizeIterator,
{
}
3 changes: 3 additions & 0 deletions library/core/src/iter/adapters/map_while.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,3 +88,6 @@ unsafe impl<I: InPlaceIterable, P> InPlaceIterable for MapWhile<I, P> {
const EXPAND_BY: Option<NonZero<usize>> = I::EXPAND_BY;
const MERGE_BY: Option<NonZero<usize>> = I::MERGE_BY;
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I, P> !ExactSizeIterator for MapWhile<I, P> {}
8 changes: 7 additions & 1 deletion library/core/src/iter/adapters/peekable.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::iter::adapters::SourceIter;
use crate::iter::{FusedIterator, TrustedLen};
use crate::iter::{FusedIterator, InfiniteIterator, TrustedLen};
use crate::ops::{ControlFlow, Try};

/// An iterator with a `peek()` that returns an optional reference to the next
Expand Down Expand Up @@ -437,3 +437,9 @@ where
unsafe { SourceIter::as_inner(&mut self.iter) }
}
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: !ExactSizeIterator> !ExactSizeIterator for Peekable<I> {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: InfiniteIterator> InfiniteIterator for Peekable<I> {}
10 changes: 8 additions & 2 deletions library/core/src/iter/adapters/skip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ use crate::intrinsics::unlikely;
use crate::iter::adapters::SourceIter;
use crate::iter::adapters::zip::try_get_unchecked;
use crate::iter::{
FusedIterator, InPlaceIterable, TrustedFused, TrustedLen, TrustedRandomAccess,
TrustedRandomAccessNoCoerce,
FusedIterator, InPlaceIterable, InfiniteIterator, TrustedFused, TrustedLen,
TrustedRandomAccess, TrustedRandomAccessNoCoerce,
};
use crate::num::NonZero;
use crate::ops::{ControlFlow, Try};
Expand Down Expand Up @@ -287,3 +287,9 @@ where
// I: TrustedLen would not.
#[unstable(feature = "trusted_len", issue = "37572")]
unsafe impl<I> TrustedLen for Skip<I> where I: Iterator + TrustedRandomAccess {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: !ExactSizeIterator> !ExactSizeIterator for Skip<I> {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I> InfiniteIterator for Skip<I> where I: InfiniteIterator {}
8 changes: 7 additions & 1 deletion library/core/src/iter/adapters/skip_while.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::fmt;
use crate::iter::adapters::SourceIter;
use crate::iter::{FusedIterator, InPlaceIterable, TrustedFused};
use crate::iter::{FusedIterator, InPlaceIterable, InfiniteIterator, TrustedFused};
use crate::num::NonZero;
use crate::ops::Try;

Expand Down Expand Up @@ -128,3 +128,9 @@ unsafe impl<I: InPlaceIterable, F> InPlaceIterable for SkipWhile<I, F> {
const EXPAND_BY: Option<NonZero<usize>> = I::EXPAND_BY;
const MERGE_BY: Option<NonZero<usize>> = I::MERGE_BY;
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I, P> !ExactSizeIterator for SkipWhile<I, P> {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: InfiniteIterator, P> InfiniteIterator for SkipWhile<I, P> where P: FnMut(&I::Item) -> bool {}
8 changes: 7 additions & 1 deletion library/core/src/iter/adapters/step_by.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::intrinsics;
use crate::iter::{TrustedLen, TrustedRandomAccess, from_fn};
use crate::iter::{InfiniteIterator, TrustedLen, TrustedRandomAccess, from_fn};
use crate::num::NonZero;
use crate::ops::{Range, Try};

Expand Down Expand Up @@ -143,6 +143,12 @@ impl<I> ExactSizeIterator for StepBy<I> where I: ExactSizeIterator {}
#[unstable(feature = "trusted_len", issue = "37572")]
unsafe impl<I> TrustedLen for StepBy<I> where I: Iterator + TrustedRandomAccess {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: !ExactSizeIterator> !ExactSizeIterator for StepBy<I> {}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I: InfiniteIterator> InfiniteIterator for StepBy<I> {}

trait SpecRangeSetup<T> {
fn setup(inner: T, step: usize) -> T;
}
Expand Down
18 changes: 8 additions & 10 deletions library/core/src/iter/adapters/take.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
use crate::cmp;
use crate::iter::adapters::SourceIter;
use crate::iter::{FusedIterator, InPlaceIterable, TrustedFused, TrustedLen, TrustedRandomAccess};
use crate::iter::{
FusedIterator, InPlaceIterable, InfiniteIterator, TrustedFused, TrustedLen, TrustedRandomAccess,
};
use crate::num::NonZero;
use crate::ops::{ControlFlow, Try};

Expand Down Expand Up @@ -361,15 +363,11 @@ impl<T: Clone> DoubleEndedIterator for Take<crate::iter::Repeat<T>> {
// because we have no way to return value of nth invocation of repeater followed
// by n-1st without remembering all results.

#[stable(feature = "exact_size_take_repeat", since = "1.82.0")]
impl<T: Clone> ExactSizeIterator for Take<crate::iter::Repeat<T>> {
fn len(&self) -> usize {
self.n
}
}

#[stable(feature = "exact_size_take_repeat", since = "1.82.0")]
impl<F: FnMut() -> A, A> ExactSizeIterator for Take<crate::iter::RepeatWith<F>> {
#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I> ExactSizeIterator for Take<I>
where
I: InfiniteIterator,
{
fn len(&self) -> usize {
self.n
}
Expand Down
3 changes: 3 additions & 0 deletions library/core/src/iter/adapters/take_while.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,6 @@ unsafe impl<I: InPlaceIterable, F> InPlaceIterable for TakeWhile<I, F> {
const EXPAND_BY: Option<NonZero<usize>> = I::EXPAND_BY;
const MERGE_BY: Option<NonZero<usize>> = I::MERGE_BY;
}

#[stable(feature = "infinite_iterator_trait", since = "CURRENT_RUSTC_VERSION")]
impl<I, P> !ExactSizeIterator for TakeWhile<I, P> {}
Loading
Loading