[][src]Struct permutator::LargeCombinationRefIter

pub struct LargeCombinationRefIter<'a, T> where
    T: 'a, 
{ /* fields omitted */ }

Create an unsafe combination iterator that return result to mutable pointer. The result is lexicographic ordered if input is lexicorgraphic ordered. The returned combination will be a reference into given data. Each combination return from iterator is stored into given *mut [&T].

The result will be overwritten on every iteration. To reuse a result, convert a result to owned value. If most result need to be reused, consider using LargeCombinationIterator

Safety

This object took raw mutable pointer and convert in upon object instantiation via new function thus all unsafe Rust conditions will be applied on all method.

Rationale

It uses unsafe to take a mutable pointer to store the result to avoid the cost of using Rc<RefCell<>>. In uncontroll test environment, this struct perform a complete iteration over 30,045,015 combinations in about 337ms where LargeCombinationCellIter took about 460ms. This function is very much alike unsafe_combination function but took Iterator approach.

Examples

Given slice of [1, 2, 3, 4, 5]. It will produce following combinations: [1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4], [1, 2, 5], [1, 3, 5], [2, 3, 5], [1, 4, 5], [2, 4, 5], [3, 4, 5] Here's an example of code printing above combination.

   use permutator::{LargeCombinationRefIter};
   use std::time::{Instant};
   let data = &[1, 2, 3, 4, 5];
   let mut result : &mut[&i32] = &mut [&data[0]; 3];
   unsafe {
        let mut comb = LargeCombinationRefIter::new(&[1, 2, 3, 4, 5], 3, result as *mut [&i32]);
        let mut counter = 0;
        let timer = Instant::now();

        for _ in comb {
            println!("{}:{:?}", counter, result);
            counter += 1;
        }

        println!("Total {} combinations in {:?}", counter, timer.elapsed());
   }

Methods

impl<'a, T> LargeCombinationRefIter<'a, T>[src]

Important traits for LargeCombinationRefIter<'a, T>
pub unsafe fn new(
    data: &'a [T],
    r: usize,
    result: *mut [&'a T]
) -> LargeCombinationRefIter<'a, T>
[src]

pub fn len(&self) -> usize[src]

Total number of combinations this iterate can return. It will equals to n!/((n-r)!*r!)

pub fn iter(&mut self) -> &mut Self[src]

Trait Implementations

impl<'a, T> ExactSizeIterator for LargeCombinationRefIter<'a, T>[src]

impl<'a, T> Iterator for LargeCombinationRefIter<'a, T>[src]

type Item = ()

The type of the elements being iterated over.

impl<'a, T> IteratorReset for LargeCombinationRefIter<'a, T>[src]

Auto Trait Implementations

impl<'a, T> RefUnwindSafe for LargeCombinationRefIter<'a, T> where
    T: RefUnwindSafe

impl<'a, T> Send for LargeCombinationRefIter<'a, T> where
    T: Sync

impl<'a, T> Sync for LargeCombinationRefIter<'a, T> where
    T: Sync

impl<'a, T> Unpin for LargeCombinationRefIter<'a, T>

impl<'a, T> !UnwindSafe for LargeCombinationRefIter<'a, T>

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.