Trait ExactSizeIterator

1.0.0Source
pub trait ExactSizeIterator: Iterator {
    // Provided methods
    fn len(&self) -> usize { ... }
    fn is_empty(&self) -> bool { ... }
}
Expand description

An iterator that knows its exact length.

Many Iterators don鈥檛 know how many times they will iterate, but some do. If an iterator knows how many times it can iterate, providing access to that information can be useful. For example, if you want to iterate backwards, a good start is to know where the end is.

When implementing an ExactSizeIterator, you must also implement Iterator. When doing so, the implementation of Iterator::size_hint must return the exact size of the iterator.

The len method has a default implementation, so you usually shouldn鈥檛 implement it. However, you may be able to provide a more performant implementation than the default, so overriding it in this case makes sense.

Note that this trait is a safe trait and as such does not and cannot guarantee that the returned length is correct. This means that unsafe code must not rely on the correctness of Iterator::size_hint. The unstable and unsafe TrustedLen trait gives this additional guarantee.

When shouldn鈥檛 an adapter be ExactSizeIterator?

If an adapter makes an iterator longer, then it鈥檚 usually incorrect for that adapter to implement ExactSizeIterator. The inner exact-sized iterator might already be usize::MAX-long, and thus the length of the longer adapted iterator would no longer be exactly representable in usize.

This is why Chain<A, B> isn鈥檛 ExactSizeIterator, even when A and B are both ExactSizeIterator.

Examples

Basic usage:

// a finite range knows exactly how many times it will iterate
let five = 0..5;

assert_eq!(5, five.len());

In the module-level docs, we implemented an Iterator, Counter. Let鈥檚 implement ExactSizeIterator for it as well:

impl ExactSizeIterator for Counter {
    // We can easily calculate the remaining number of iterations.
    fn len(&self) -> usize {
        5 - self.count
    }
}

// And now we can use it!

let mut counter = Counter::new();

assert_eq!(5, counter.len());
let _ = counter.next();
assert_eq!(4, counter.len());

Provided Methods

1.0.0Source

fn len(&self) -> usize

Returns the exact remaining length of the iterator.

The implementation ensures that the iterator will return exactly len() more times a Some(T) value, before returning None. This method has a default implementation, so you usually should not implement it directly. However, if you can provide a more efficient implementation, you can do so. See the trait-level docs for an example.

This function has the same safety guarantees as the Iterator::size_hint function.

Examples

Basic usage:

// a finite range knows exactly how many times it will iterate
let mut range = 0..5;

assert_eq!(5, range.len());
let _ = range.next();
assert_eq!(4, range.len());
Source

fn is_empty(&self) -> bool

馃敩This is a nightly-only experimental API. (exact_size_is_empty)

Returns true if the iterator is empty.

This method has a default implementation using ExactSizeIterator::len(), so you don鈥檛 need to implement it yourself.

Examples

Basic usage:

#![feature(exact_size_is_empty)]

let mut one_element = std::iter::once(0);
assert!(!one_element.is_empty());

assert_eq!(one_element.next(), Some(0));
assert!(one_element.is_empty());

assert_eq!(one_element.next(), None);

Implementors

Source

impl ExactSizeIterator for IndexVecIntoIter

1.0.0Source

impl ExactSizeIterator for Args

1.0.0Source

impl ExactSizeIterator for ArgsOs

1.0.0Source

impl ExactSizeIterator for Bytes<'_>

1.0.0Source

impl ExactSizeIterator for Range<i8>

1.0.0Source

impl ExactSizeIterator for Range<i16>

1.0.0Source

impl ExactSizeIterator for Range<i32>

1.0.0Source

impl ExactSizeIterator for Range<isize>

1.0.0Source

impl ExactSizeIterator for Range<u8>

1.0.0Source

impl ExactSizeIterator for Range<u16>

1.0.0Source

impl ExactSizeIterator for Range<u32>

1.0.0Source

impl ExactSizeIterator for Range<usize>

1.26.0Source

impl ExactSizeIterator for RangeInclusive<i8>

1.26.0Source

impl ExactSizeIterator for RangeInclusive<i16>

1.26.0Source

impl ExactSizeIterator for RangeInclusive<u8>

1.26.0Source

impl ExactSizeIterator for RangeInclusive<u16>

1.0.0Source

impl ExactSizeIterator for core::ascii::EscapeDefault

1.20.0Source

impl ExactSizeIterator for EscapeDebug

1.11.0Source

impl ExactSizeIterator for core::char::EscapeDefault

1.11.0Source

impl ExactSizeIterator for EscapeUnicode

1.35.0Source

impl ExactSizeIterator for ToLowercase

1.35.0Source

impl ExactSizeIterator for ToUppercase

Source

impl ExactSizeIterator for IterRange<i8>

Source

impl ExactSizeIterator for IterRange<i16>

Source

impl ExactSizeIterator for IterRange<isize>

Source

impl ExactSizeIterator for IterRange<u8>

Source

impl ExactSizeIterator for IterRange<u16>

Source

impl ExactSizeIterator for IterRange<usize>

Source

impl ExactSizeIterator for IterRangeInclusive<i8>

Source

impl ExactSizeIterator for IterRangeInclusive<u8>

Source

impl ExactSizeIterator for NaiveDateDaysIterator

Source

impl ExactSizeIterator for NaiveDateWeeksIterator

Source

impl ExactSizeIterator for serde_json::map::IntoIter

Source

impl<'a> ExactSizeIterator for IndexVecIter<'a>

1.57.0Source

impl<'a> ExactSizeIterator for CommandArgs<'a>

1.57.0Source

impl<'a> ExactSizeIterator for CommandEnvs<'a>

Source

impl<'a> ExactSizeIterator for IdsRef<'a>

Source

impl<'a> ExactSizeIterator for Indices<'a>

Source

impl<'a> ExactSizeIterator for RawValues<'a>

Source

impl<'a> ExactSizeIterator for CapturesPatternIter<'a>

Source

impl<'a> ExactSizeIterator for GroupInfoPatternNames<'a>

Source

impl<'a> ExactSizeIterator for serde_json::map::Iter<'a>

Source

impl<'a> ExactSizeIterator for serde_json::map::IterMut<'a>

Source

impl<'a> ExactSizeIterator for serde_json::map::Keys<'a>

Source

impl<'a> ExactSizeIterator for serde_json::map::Values<'a>

Source

impl<'a> ExactSizeIterator for serde_json::map::ValuesMut<'a>

1.1.0Source

impl<'a, I, T> ExactSizeIterator for Cloned<I>
where T: 'a + Clone, I: ExactSizeIterator<Item = &'a T>,

1.36.0Source

impl<'a, I, T> ExactSizeIterator for Copied<I>
where T: 'a + Copy, I: ExactSizeIterator<Item = &'a T>,

Source

impl<'a, S, T> ExactSizeIterator for SliceChooseIter<'a, S, T>
where S: Index<usize, Output = T> + 'a + ?Sized, T: 'a,

1.31.0Source

impl<'a, T> ExactSizeIterator for RChunksExact<'a, T>

Source

impl<'a, T> ExactSizeIterator for ValuesRef<'a, T>
where T: 'a,

Source

impl<'a, T, const CAP: usize> ExactSizeIterator for arrayvec::arrayvec::Drain<'a, T, CAP>
where T: 'a,

Source

impl<'c, 'h> ExactSizeIterator for regex::regex::bytes::SubCaptureMatches<'c, 'h>

Source

impl<'c, 'h> ExactSizeIterator for regex::regex::string::SubCaptureMatches<'c, 'h>

Source

impl<'r> ExactSizeIterator for regex::regex::bytes::CaptureNames<'r>

Source

impl<'r> ExactSizeIterator for regex::regex::string::CaptureNames<'r>

1.0.0Source

impl<A> ExactSizeIterator for core::option::IntoIter<A>

1.0.0Source

impl<A> ExactSizeIterator for core::option::Iter<'_, A>

1.0.0Source

impl<A> ExactSizeIterator for core::option::IterMut<'_, A>

1.82.0Source

impl<A> ExactSizeIterator for RepeatN<A>
where A: Clone,

1.0.0Source

impl<A, B> ExactSizeIterator for Zip<A, B>

1.43.0Source

impl<A, F> ExactSizeIterator for OnceWith<F>
where F: FnOnce() -> A,

1.0.0Source

impl<B, I, F> ExactSizeIterator for Map<I, F>
where I: ExactSizeIterator, F: FnMut(<I as Iterator>::Item) -> B,

1.82.0Source

impl<F, A> ExactSizeIterator for Take<RepeatWith<F>>
where F: FnMut() -> A,

1.0.0Source

impl<I> ExactSizeIterator for &mut I

1.0.0Source

impl<I> ExactSizeIterator for Enumerate<I>

1.0.0Source

impl<I> ExactSizeIterator for Fuse<I>

1.0.0Source

impl<I> ExactSizeIterator for Peekable<I>

1.0.0Source

impl<I> ExactSizeIterator for Rev<I>

1.0.0Source

impl<I> ExactSizeIterator for Skip<I>

1.28.0Source

impl<I> ExactSizeIterator for StepBy<I>

1.0.0Source

impl<I> ExactSizeIterator for Take<I>

1.21.0Source

impl<I, A> ExactSizeIterator for Splice<'_, I, A>
where I: Iterator, A: Allocator,

1.0.0Source

impl<I, A> ExactSizeIterator for Box<I, A>

1.0.0Source

impl<I, F> ExactSizeIterator for Inspect<I, F>
where I: ExactSizeIterator, F: FnMut(&<I as Iterator>::Item),

Source

impl<I, F, R, const N: usize> ExactSizeIterator for MapWindows<I, F, N>
where I: ExactSizeIterator, F: FnMut(&[<I as Iterator>::Item; N]) -> R,

Source

impl<I, const N: usize> ExactSizeIterator for pub_just::iter::ArrayChunks<I, N>

1.0.0Source

impl<K> ExactSizeIterator for std::collections::hash::set::Drain<'_, K>

1.0.0Source

impl<K> ExactSizeIterator for std::collections::hash::set::IntoIter<K>

1.0.0Source

impl<K> ExactSizeIterator for std::collections::hash::set::Iter<'_, K>

1.0.0Source

impl<K, V> ExactSizeIterator for alloc::collections::btree::map::Iter<'_, K, V>

1.0.0Source

impl<K, V> ExactSizeIterator for alloc::collections::btree::map::IterMut<'_, K, V>

1.0.0Source

impl<K, V> ExactSizeIterator for alloc::collections::btree::map::Keys<'_, K, V>

1.0.0Source

impl<K, V> ExactSizeIterator for alloc::collections::btree::map::Values<'_, K, V>

1.10.0Source

impl<K, V> ExactSizeIterator for alloc::collections::btree::map::ValuesMut<'_, K, V>

1.6.0Source

impl<K, V> ExactSizeIterator for std::collections::hash::map::Drain<'_, K, V>

1.0.0Source

impl<K, V> ExactSizeIterator for std::collections::hash::map::IntoIter<K, V>

1.54.0Source

impl<K, V> ExactSizeIterator for std::collections::hash::map::IntoKeys<K, V>

1.54.0Source

impl<K, V> ExactSizeIterator for std::collections::hash::map::IntoValues<K, V>

1.0.0Source

impl<K, V> ExactSizeIterator for std::collections::hash::map::Iter<'_, K, V>

1.0.0Source

impl<K, V> ExactSizeIterator for std::collections::hash::map::IterMut<'_, K, V>

1.0.0Source

impl<K, V> ExactSizeIterator for std::collections::hash::map::Keys<'_, K, V>

1.0.0Source

impl<K, V> ExactSizeIterator for std::collections::hash::map::Values<'_, K, V>

1.10.0Source

impl<K, V> ExactSizeIterator for std::collections::hash::map::ValuesMut<'_, K, V>

1.0.0Source

impl<K, V, A> ExactSizeIterator for alloc::collections::btree::map::IntoIter<K, V, A>
where A: Allocator + Clone,

1.54.0Source

impl<K, V, A> ExactSizeIterator for alloc::collections::btree::map::IntoKeys<K, V, A>
where A: Allocator + Clone,

1.54.0Source

impl<K, V, A> ExactSizeIterator for alloc::collections::btree::map::IntoValues<K, V, A>
where A: Allocator + Clone,

1.0.0Source

impl<T> ExactSizeIterator for alloc::collections::binary_heap::Iter<'_, T>

1.0.0Source

impl<T> ExactSizeIterator for alloc::collections::btree::set::Iter<'_, T>

1.0.0Source

impl<T> ExactSizeIterator for alloc::collections::linked_list::Iter<'_, T>

1.0.0Source

impl<T> ExactSizeIterator for alloc::collections::linked_list::IterMut<'_, T>

1.0.0Source

impl<T> ExactSizeIterator for alloc::collections::vec_deque::iter::Iter<'_, T>

1.0.0Source

impl<T> ExactSizeIterator for alloc::collections::vec_deque::iter_mut::IterMut<'_, T>

1.0.0Source

impl<T> ExactSizeIterator for core::result::IntoIter<T>

1.0.0Source

impl<T> ExactSizeIterator for core::result::Iter<'_, T>

1.0.0Source

impl<T> ExactSizeIterator for core::result::IterMut<'_, T>

1.0.0Source

impl<T> ExactSizeIterator for Chunks<'_, T>

1.31.0Source

impl<T> ExactSizeIterator for ChunksExact<'_, T>

1.31.0Source

impl<T> ExactSizeIterator for ChunksExactMut<'_, T>

1.0.0Source

impl<T> ExactSizeIterator for ChunksMut<'_, T>

1.0.0Source

impl<T> ExactSizeIterator for core::slice::iter::Iter<'_, T>

1.0.0Source

impl<T> ExactSizeIterator for core::slice::iter::IterMut<'_, T>

1.31.0Source

impl<T> ExactSizeIterator for RChunks<'_, T>

1.31.0Source

impl<T> ExactSizeIterator for RChunksExactMut<'_, T>

1.31.0Source

impl<T> ExactSizeIterator for RChunksMut<'_, T>

1.0.0Source

impl<T> ExactSizeIterator for Windows<'_, T>

Source

impl<T> ExactSizeIterator for clap_builder::parser::matches::arg_matches::Values<T>

1.2.0Source

impl<T> ExactSizeIterator for Empty<T>

1.2.0Source

impl<T> ExactSizeIterator for Once<T>

1.82.0Source

impl<T> ExactSizeIterator for Take<Repeat<T>>
where T: Clone,

1.6.0Source

impl<T, A> ExactSizeIterator for pub_just::vec::Drain<'_, T, A>
where A: Allocator,

1.0.0Source

impl<T, A> ExactSizeIterator for pub_just::vec::IntoIter<T, A>
where A: Allocator,

1.6.0Source

impl<T, A> ExactSizeIterator for alloc::collections::binary_heap::Drain<'_, T, A>
where A: Allocator,

Source

impl<T, A> ExactSizeIterator for DrainSorted<'_, T, A>
where T: Ord, A: Allocator,

1.0.0Source

impl<T, A> ExactSizeIterator for alloc::collections::binary_heap::IntoIter<T, A>
where A: Allocator,

Source

impl<T, A> ExactSizeIterator for IntoIterSorted<T, A>
where T: Ord, A: Allocator,

1.0.0Source

impl<T, A> ExactSizeIterator for alloc::collections::btree::set::IntoIter<T, A>
where A: Allocator + Clone,

1.0.0Source

impl<T, A> ExactSizeIterator for alloc::collections::linked_list::IntoIter<T, A>
where A: Allocator,

1.6.0Source

impl<T, A> ExactSizeIterator for alloc::collections::vec_deque::drain::Drain<'_, T, A>
where A: Allocator,

1.0.0Source

impl<T, A> ExactSizeIterator for alloc::collections::vec_deque::into_iter::IntoIter<T, A>
where A: Allocator,

Source

impl<T, N> ExactSizeIterator for GenericArrayIter<T, N>
where N: ArrayLength<T>,

Source

impl<T, const CAP: usize> ExactSizeIterator for arrayvec::arrayvec::IntoIter<T, CAP>

1.40.0Source

impl<T, const N: usize> ExactSizeIterator for core::array::iter::IntoIter<T, N>

Source

impl<T, const N: usize> ExactSizeIterator for core::slice::iter::ArrayChunks<'_, T, N>

Source

impl<T, const N: usize> ExactSizeIterator for ArrayChunksMut<'_, T, N>

Source

impl<T, const N: usize> ExactSizeIterator for ArrayWindows<'_, T, N>