#![warn(missing_docs)]
#![cfg_attr(feature = "unstable", feature(test))]
#[cfg(feature="serde")]
extern crate serde;
#[cfg(test)]
#[macro_use] extern crate quickcheck;
pub mod duo;
pub mod multi;
pub mod set;
mod collection;
mod two_minimums;
use std::cmp::{self, Ordering};
pub use crate::set::{Set, SetBuf, Error};
pub use crate::collection::{Collection, Counter};
#[inline]
pub fn exponential_search<T>(slice: &[T], elem: &T) -> Result<usize, usize>
where T: Ord
{
exponential_search_by(slice, |x| x.cmp(elem))
}
#[inline]
pub fn exponential_search_by<T, F>(slice: &[T], mut f: F) -> Result<usize, usize>
where F: FnMut(&T) -> Ordering,
{
let mut index = 1;
while index < slice.len() && f(&slice[index]) == Ordering::Less {
index *= 2;
}
let half_bound = index / 2;
let bound = cmp::min(index + 1, slice.len());
match slice[half_bound..bound].binary_search_by(f) {
Ok(pos) => Ok(half_bound + pos),
Err(pos) => Err(half_bound + pos),
}
}
#[inline]
pub fn exponential_search_by_key<T, B, F>(slice: &[T], b: &B, mut f: F) -> Result<usize, usize>
where F: FnMut(&T) -> B,
B: Ord
{
exponential_search_by(slice, |k| f(k).cmp(b))
}
#[inline]
fn exponential_offset_ge<'a, T>(slice: &'a [T], elem: &T) -> &'a [T]
where T: Ord,
{
exponential_offset_ge_by(slice, |x| x.cmp(elem))
}
#[inline]
fn exponential_offset_ge_by<T, F>(slice: &[T], f: F) -> &[T]
where F: FnMut(&T) -> Ordering,
{
match exponential_search_by(slice, f) {
Ok(pos) => &slice[pos..],
Err(pos) => &slice[pos..],
}
}
#[inline]
fn exponential_offset_ge_by_key<'a, T, B, F>(slice: &'a [T], b: &B, mut f: F) -> &'a [T]
where F: FnMut(&T) -> B,
B: Ord,
{
exponential_offset_ge_by(slice, |x| f(x).cmp(b))
}
pub trait SetOperation<T>: Sized {
fn extend_collection<C>(self, output: &mut C) where C: Collection<T>;
fn into_set_buf(self) -> SetBuf<T> where T: Clone {
let mut vec = Vec::new();
self.extend_collection(&mut vec);
SetBuf::new_unchecked(vec)
}
}
#[cfg(all(feature = "unstable", test))]
mod bench {
mod _btree {
mod difference {
extern crate test;
use self::test::Bencher;
#[bench]
fn two_slices_big(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.difference(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn two_slices_big2(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (51..151).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.difference(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn two_slices_big3(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.difference(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let c: Vec<_> = (2..102).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
let c = BTreeSet::from_iter(c);
bench.iter(|| {
let ab = &a - &b;
let set: Vec<_> = ab.difference(&c).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big2(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (34..134).collect();
let c: Vec<_> = (67..167).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
let c = BTreeSet::from_iter(c);
bench.iter(|| {
let ab = &a - &b;
let set: Vec<_> = ab.difference(&c).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big3(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let c: Vec<_> = (200..300).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
let c = BTreeSet::from_iter(c);
bench.iter(|| {
let ab = &a - &b;
let set: Vec<_> = ab.difference(&c).cloned().collect();
test::black_box(|| set);
});
}
}
mod intersection {
extern crate test;
use self::test::Bencher;
#[bench]
fn two_slices_big(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.intersection(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn two_slices_big2(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (51..151).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.intersection(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn two_slices_big3(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.intersection(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let c: Vec<_> = (2..102).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
let c = BTreeSet::from_iter(c);
bench.iter(|| {
let ab = &a & &b;
let set: Vec<_> = ab.intersection(&c).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big2(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (34..134).collect();
let c: Vec<_> = (67..167).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
let c = BTreeSet::from_iter(c);
bench.iter(|| {
let ab = &a & &b;
let set: Vec<_> = ab.intersection(&c).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big3(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let c: Vec<_> = (200..300).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
let c = BTreeSet::from_iter(c);
bench.iter(|| {
let ab = &a & &b;
let set: Vec<_> = ab.intersection(&c).cloned().collect();
test::black_box(|| set);
});
}
}
mod union {
extern crate test;
use self::test::Bencher;
#[bench]
fn two_slices_big(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.union(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn two_slices_big2(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (51..151).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.union(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn two_slices_big3(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.union(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let c: Vec<_> = (2..102).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
let c = BTreeSet::from_iter(c);
bench.iter(|| {
let ab = &a | &b;
let set: Vec<_> = ab.union(&c).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big2(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (34..134).collect();
let c: Vec<_> = (67..167).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
let c = BTreeSet::from_iter(c);
bench.iter(|| {
let ab = &a | &b;
let set: Vec<_> = ab.union(&c).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big3(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let c: Vec<_> = (200..300).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
let c = BTreeSet::from_iter(c);
bench.iter(|| {
let ab = &a | &b;
let set: Vec<_> = ab.union(&c).cloned().collect();
test::black_box(|| set);
});
}
}
mod symmetric_difference {
extern crate test;
use self::test::Bencher;
#[bench]
fn two_slices_big(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.symmetric_difference(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn two_slices_big2(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (51..151).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.symmetric_difference(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn two_slices_big3(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.symmetric_difference(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let c: Vec<_> = (2..102).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
let c = BTreeSet::from_iter(c);
bench.iter(|| {
let ab = &a ^ &b;
let set: Vec<_> = ab.symmetric_difference(&c).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big2(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (34..134).collect();
let c: Vec<_> = (67..167).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
let c = BTreeSet::from_iter(c);
bench.iter(|| {
let ab = &a ^ &b;
let set: Vec<_> = ab.symmetric_difference(&c).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big3(bench: &mut Bencher) {
use std::collections::BTreeSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let c: Vec<_> = (200..300).collect();
let a = BTreeSet::from_iter(a);
let b = BTreeSet::from_iter(b);
let c = BTreeSet::from_iter(c);
bench.iter(|| {
let ab = &a ^ &b;
let set: Vec<_> = ab.symmetric_difference(&c).cloned().collect();
test::black_box(|| set);
});
}
}
}
mod _fnv {
mod difference {
extern crate test;
extern crate fnv;
use self::test::Bencher;
#[bench]
fn two_slices_big(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.difference(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn two_slices_big2(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (51..151).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.difference(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn two_slices_big3(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.difference(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let c: Vec<_> = (2..102).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
let c = FnvHashSet::from_iter(c);
bench.iter(|| {
let ab = &a - &b;
let set: Vec<_> = ab.difference(&c).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big2(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (34..134).collect();
let c: Vec<_> = (67..167).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
let c = FnvHashSet::from_iter(c);
bench.iter(|| {
let ab = &a - &b;
let set: Vec<_> = ab.difference(&c).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big3(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let c: Vec<_> = (200..300).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
let c = FnvHashSet::from_iter(c);
bench.iter(|| {
let ab = &a - &b;
let set: Vec<_> = ab.difference(&c).cloned().collect();
test::black_box(|| set);
});
}
}
mod intersection {
extern crate test;
extern crate fnv;
use self::test::Bencher;
#[bench]
fn two_slices_big(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.intersection(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn two_slices_big2(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (51..151).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.intersection(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn two_slices_big3(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.intersection(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let c: Vec<_> = (2..102).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
let c = FnvHashSet::from_iter(c);
bench.iter(|| {
let ab = &a & &b;
let set: Vec<_> = ab.intersection(&c).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big2(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (34..134).collect();
let c: Vec<_> = (67..167).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
let c = FnvHashSet::from_iter(c);
bench.iter(|| {
let ab = &a & &b;
let set: Vec<_> = ab.intersection(&c).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big3(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let c: Vec<_> = (200..300).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
let c = FnvHashSet::from_iter(c);
bench.iter(|| {
let ab = &a & &b;
let set: Vec<_> = ab.intersection(&c).cloned().collect();
test::black_box(|| set);
});
}
}
mod union {
extern crate test;
extern crate fnv;
use self::test::Bencher;
#[bench]
fn two_slices_big(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.union(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn two_slices_big2(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (51..151).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.union(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn two_slices_big3(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.union(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let c: Vec<_> = (2..102).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
let c = FnvHashSet::from_iter(c);
bench.iter(|| {
let ab = &a | &b;
let set: Vec<_> = ab.union(&c).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big2(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (34..134).collect();
let c: Vec<_> = (67..167).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
let c = FnvHashSet::from_iter(c);
bench.iter(|| {
let ab = &a | &b;
let set: Vec<_> = ab.union(&c).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big3(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let c: Vec<_> = (200..300).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
let c = FnvHashSet::from_iter(c);
bench.iter(|| {
let ab = &a | &b;
let set: Vec<_> = ab.union(&c).cloned().collect();
test::black_box(|| set);
});
}
}
mod symmetric_difference {
extern crate test;
extern crate fnv;
use self::test::Bencher;
#[bench]
fn two_slices_big(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.symmetric_difference(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn two_slices_big2(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (51..151).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.symmetric_difference(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn two_slices_big3(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
bench.iter(|| {
let set: Vec<_> = a.symmetric_difference(&b).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let c: Vec<_> = (2..102).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
let c = FnvHashSet::from_iter(c);
bench.iter(|| {
let ab = &a ^ &b;
let set: Vec<_> = ab.symmetric_difference(&c).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big2(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (34..134).collect();
let c: Vec<_> = (67..167).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
let c = FnvHashSet::from_iter(c);
bench.iter(|| {
let ab = &a ^ &b;
let set: Vec<_> = ab.symmetric_difference(&c).cloned().collect();
test::black_box(|| set);
});
}
#[bench]
fn three_slices_big3(bench: &mut Bencher) {
use self::fnv::FnvHashSet;
use std::iter::FromIterator;
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let c: Vec<_> = (200..300).collect();
let a: FnvHashSet<i32> = FnvHashSet::from_iter(a);
let b = FnvHashSet::from_iter(b);
let c = FnvHashSet::from_iter(c);
bench.iter(|| {
let ab = &a ^ &b;
let set: Vec<_> = ab.symmetric_difference(&c).cloned().collect();
test::black_box(|| set);
});
}
}
}
mod _vec {
mod union {
extern crate test;
use self::test::Bencher;
fn create_vec_set<T: Ord + Clone>(slices: &[&[T]]) -> Vec<T> {
let alloc = slices.iter().map(|v| v.len()).sum();
let mut set = Vec::with_capacity(alloc);
for slice in slices {
set.extend_from_slice(slice);
}
set.sort_unstable();
set.dedup();
set
}
#[bench]
fn two_slices_big(bench: &mut Bencher) {
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
bench.iter(|| {
let elements = create_vec_set(&[&a, &b]);
test::black_box(|| elements.len());
});
}
#[bench]
fn two_slices_big2(bench: &mut Bencher) {
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (51..151).collect();
bench.iter(|| {
let elements = create_vec_set(&[&a, &b]);
test::black_box(|| elements.len());
});
}
#[bench]
fn two_slices_big3(bench: &mut Bencher) {
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
bench.iter(|| {
let elements = create_vec_set(&[&a, &b]);
test::black_box(|| elements.len());
});
}
#[bench]
fn three_slices_big(bench: &mut Bencher) {
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (1..101).collect();
let c: Vec<_> = (2..102).collect();
bench.iter(|| {
let elements = create_vec_set(&[&a, &b, &c]);
test::black_box(|| elements.len());
});
}
#[bench]
fn three_slices_big2(bench: &mut Bencher) {
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (34..134).collect();
let c: Vec<_> = (67..167).collect();
bench.iter(|| {
let elements = create_vec_set(&[&a, &b, &c]);
test::black_box(|| elements.len());
});
}
#[bench]
fn three_slices_big3(bench: &mut Bencher) {
let a: Vec<_> = (0..100).collect();
let b: Vec<_> = (100..200).collect();
let c: Vec<_> = (200..300).collect();
bench.iter(|| {
let elements = create_vec_set(&[&a, &b, &c]);
test::black_box(|| elements.len());
});
}
}
}
}