[][src]Enum butcher::iterator::CowIter

pub enum CowIter<'a, I, Input: ?Sized, Iterr1, Iterr2> where
    I: 'a + ToOwned,
    Iterr1: Iterator<Item = &'a I>,
    Iterr2: Iterator<Item = <I as ToOwned>::Owned>,
    Input: 'a + ToOwned,
    &'a Input: IntoIterator<Item = &'a I, IntoIter = Iterr1> + ToOwned,
    <Input as ToOwned>::Owned: IntoIterator<Item = <I as ToOwned>::Owned, IntoIter = Iterr2>, 
{ Borrowed(Iterr1, PhantomData<Input>), Owned(Iterr2, PhantomData<Input>), }

An iterator over data wrapped in Cow.

This allows to create iterators from data wrapped in Cow easily. The value returned at each iteration will be either Owned or Borrowed, depending on the initial object variant.

Example

In this example, we use the borrowed variant:

use std::borrow::Cow;
use butcher::iterator::CowIter;

// Notice that the generic type is annotated
let data: Cow<[_]> = Cow::Owned(vec![0, 1, 1, 3]);
let mut input = CowIter::from_cow(data);

assert_eq!(input.next(), Some(Cow::Owned(0)));
assert_eq!(input.next(), Some(Cow::Owned(1)));
assert_eq!(input.next(), Some(Cow::Owned(1)));
assert_eq!(input.next(), Some(Cow::Owned(3)));
assert_eq!(input.next(), None)

Here, we use the owned variant:

use std::borrow::Cow;
use butcher::iterator::CowIter;

let data = Cow::Borrowed(&[0, 1, 1, 3] as &[_]);
let mut input = CowIter::from_cow(data);

assert_eq!(input.next(), Some(Cow::Borrowed(&0)));
assert_eq!(input.next(), Some(Cow::Borrowed(&1)));
assert_eq!(input.next(), Some(Cow::Borrowed(&1)));
assert_eq!(input.next(), Some(Cow::Borrowed(&3)));
assert_eq!(input.next(), None)

Generics

This enum uses a lot of generics in order to work. Users should not care about them. Most of the use cases may not require to manually specify the generic types.

The only annotation which may be required is Input when explicitely dealing with the Owned variant. Fortunately, this can be circumvented by specifying the generic type of the associated Cow somewhere. This can be specified when the Cow is created, or in the function signature.

Variants

Borrowed(Iterr1, PhantomData<Input>)
Owned(Iterr2, PhantomData<Input>)

Implementations

impl<'a, I, Input: ?Sized, Iterr1, Iterr2> CowIter<'a, I, Input, Iterr1, Iterr2> where
    I: 'a + ToOwned,
    Iterr1: Iterator<Item = &'a I>,
    Iterr2: Iterator<Item = <I as ToOwned>::Owned>,
    Input: 'a + ToOwned,
    &'a Input: IntoIterator<Item = &'a I, IntoIter = Iterr1>,
    <Input as ToOwned>::Owned: IntoIterator<Item = <I as ToOwned>::Owned, IntoIter = Iterr2>, 
[src]

pub fn from_cow(i: Cow<'a, Input>) -> CowIter<I, Input, Iterr1, Iterr2>[src]

Creates a CowIter from a Cow containing an owned or borrowed object which can be iterated over.

Trait Implementations

impl<'a, Input: ?Sized, I, Iterr1, Iterr2> From<Cow<'a, Input>> for CowIter<'a, I, Input, Iterr1, Iterr2> where
    I: 'a + ToOwned,
    Iterr1: Iterator<Item = &'a I>,
    Iterr2: Iterator<Item = <I as ToOwned>::Owned>,
    Input: 'a + ToOwned,
    &'a Input: IntoIterator<Item = &'a I, IntoIter = Iterr1> + ToOwned,
    <Input as ToOwned>::Owned: IntoIterator<Item = <I as ToOwned>::Owned, IntoIter = Iterr2>, 
[src]

impl<'a, I, Input: ?Sized, Iterr1, Iterr2> Iterator for CowIter<'a, I, Input, Iterr1, Iterr2> where
    I: 'a + ToOwned,
    Iterr1: Iterator<Item = &'a I>,
    Iterr2: Iterator<Item = <I as ToOwned>::Owned>,
    Input: 'a + ToOwned,
    &'a Input: IntoIterator<Item = &'a I, IntoIter = Iterr1> + ToOwned,
    <Input as ToOwned>::Owned: IntoIterator<Item = <I as ToOwned>::Owned, IntoIter = Iterr2>, 
[src]

type Item = Cow<'a, I>

The type of the elements being iterated over.

Auto Trait Implementations

impl<'a, I, Input: ?Sized, Iterr1, Iterr2> RefUnwindSafe for CowIter<'a, I, Input, Iterr1, Iterr2> where
    Input: RefUnwindSafe,
    Iterr1: RefUnwindSafe,
    Iterr2: RefUnwindSafe

impl<'a, I, Input: ?Sized, Iterr1, Iterr2> Send for CowIter<'a, I, Input, Iterr1, Iterr2> where
    Input: Send,
    Iterr1: Send,
    Iterr2: Send

impl<'a, I, Input: ?Sized, Iterr1, Iterr2> Sync for CowIter<'a, I, Input, Iterr1, Iterr2> where
    Input: Sync,
    Iterr1: Sync,
    Iterr2: Sync

impl<'a, I, Input: ?Sized, Iterr1, Iterr2> Unpin for CowIter<'a, I, Input, Iterr1, Iterr2> where
    Input: Unpin,
    Iterr1: Unpin,
    Iterr2: Unpin

impl<'a, I, Input: ?Sized, Iterr1, Iterr2> UnwindSafe for CowIter<'a, I, Input, Iterr1, Iterr2> where
    Input: UnwindSafe,
    Iterr1: UnwindSafe,
    Iterr2: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<I> IntoIterator for I where
    I: Iterator
[src]

type Item = <I as Iterator>::Item

The type of the elements being iterated over.

type IntoIter = I

Which kind of iterator are we turning this into?

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.