summaryrefslogtreecommitdiff
path: root/vendor/itertools/src/rciter_impl.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/itertools/src/rciter_impl.rs')
-rw-r--r--vendor/itertools/src/rciter_impl.rs102
1 files changed, 0 insertions, 102 deletions
diff --git a/vendor/itertools/src/rciter_impl.rs b/vendor/itertools/src/rciter_impl.rs
deleted file mode 100644
index 96a0fd69..00000000
--- a/vendor/itertools/src/rciter_impl.rs
+++ /dev/null
@@ -1,102 +0,0 @@
-use alloc::rc::Rc;
-use std::cell::RefCell;
-use std::iter::{FusedIterator, IntoIterator};
-
-/// A wrapper for `Rc<RefCell<I>>`, that implements the `Iterator` trait.
-#[derive(Debug)]
-#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-pub struct RcIter<I> {
- /// The boxed iterator.
- pub rciter: Rc<RefCell<I>>,
-}
-
-/// Return an iterator inside a `Rc<RefCell<_>>` wrapper.
-///
-/// The returned `RcIter` can be cloned, and each clone will refer back to the
-/// same original iterator.
-///
-/// `RcIter` allows doing interesting things like using `.zip()` on an iterator with
-/// itself, at the cost of runtime borrow checking which may have a performance
-/// penalty.
-///
-/// Iterator element type is `Self::Item`.
-///
-/// ```
-/// use itertools::rciter;
-/// use itertools::zip;
-///
-/// // In this example a range iterator is created and we iterate it using
-/// // three separate handles (two of them given to zip).
-/// // We also use the IntoIterator implementation for `&RcIter`.
-///
-/// let mut iter = rciter(0..9);
-/// let mut z = zip(&iter, &iter);
-///
-/// assert_eq!(z.next(), Some((0, 1)));
-/// assert_eq!(z.next(), Some((2, 3)));
-/// assert_eq!(z.next(), Some((4, 5)));
-/// assert_eq!(iter.next(), Some(6));
-/// assert_eq!(z.next(), Some((7, 8)));
-/// assert_eq!(z.next(), None);
-/// ```
-///
-/// **Panics** in iterator methods if a borrow error is encountered in the
-/// iterator methods. It can only happen if the `RcIter` is reentered in
-/// `.next()`, i.e. if it somehow participates in an “iterator knot”
-/// where it is an adaptor of itself.
-pub fn rciter<I>(iterable: I) -> RcIter<I::IntoIter>
-where
- I: IntoIterator,
-{
- RcIter {
- rciter: Rc::new(RefCell::new(iterable.into_iter())),
- }
-}
-
-impl<I> Clone for RcIter<I> {
- clone_fields!(rciter);
-}
-
-impl<A, I> Iterator for RcIter<I>
-where
- I: Iterator<Item = A>,
-{
- type Item = A;
- #[inline]
- fn next(&mut self) -> Option<Self::Item> {
- self.rciter.borrow_mut().next()
- }
-
- #[inline]
- fn size_hint(&self) -> (usize, Option<usize>) {
- // To work sanely with other API that assume they own an iterator,
- // so it can't change in other places, we can't guarantee as much
- // in our size_hint. Other clones may drain values under our feet.
- (0, self.rciter.borrow().size_hint().1)
- }
-}
-
-impl<I> DoubleEndedIterator for RcIter<I>
-where
- I: DoubleEndedIterator,
-{
- #[inline]
- fn next_back(&mut self) -> Option<Self::Item> {
- self.rciter.borrow_mut().next_back()
- }
-}
-
-/// Return an iterator from `&RcIter<I>` (by simply cloning it).
-impl<I> IntoIterator for &RcIter<I>
-where
- I: Iterator,
-{
- type Item = I::Item;
- type IntoIter = RcIter<I>;
-
- fn into_iter(self) -> RcIter<I> {
- self.clone()
- }
-}
-
-impl<A, I> FusedIterator for RcIter<I> where I: FusedIterator<Item = A> {}