trie 0.2.1

An ordered map and set based on a trie.
Documentation
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// FIXME(conventions): implement bounded iterators
// FIXME(conventions): replace each_reverse by making iter DoubleEnded
// FIXME(conventions): implement iter_mut and into_iter

//! An ordered set based on a trie.

use std::cmp::Ordering::{self, Less, Equal, Greater};
use std::fmt::{self, Debug};
use std::iter::{self, Peekable};
use std::ops;

use super::map::{Map, self};

/// A set implemented as a radix trie.
///
/// # Examples
///
/// ```
/// let mut set = trie::Set::new();
/// set.insert(6);
/// set.insert(28);
/// set.insert(6);
///
/// assert_eq!(set.len(), 2);
///
/// if !set.contains(&3) {
///     println!("3 is not in the set");
/// }
///
/// // Print contents in order
/// for x in set.iter() {
///     println!("{}", x);
/// }
///
/// set.remove(&6);
/// assert_eq!(set.len(), 1);
///
/// set.clear();
/// assert!(set.is_empty());
/// ```
#[derive(Clone, Default, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub struct Set {
    map: Map<()>
}

impl Debug for Set {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        f.debug_set().entries(self.iter()).finish()
    }
}

impl Set {
    /// Creates an empty set.
    ///
    /// # Examples
    ///
    /// ```
    /// let mut set = trie::Set::new();
    /// ```
    #[inline]
    pub fn new() -> Set {
        Set{map: Map::new()}
    }

    /// Visits all values in reverse order. Aborts traversal when `f` returns `false`.
    /// Returns `true` if `f` returns `true` for all elements.
    ///
    /// # Examples
    ///
    /// ```
    /// let set: trie::Set = [1, 2, 3, 4, 5].iter().cloned().collect();
    ///
    /// let mut vec = vec![];
    /// assert_eq!(true, set.each_reverse(|&x| { vec.push(x); true }));
    /// assert_eq!(vec, [5, 4, 3, 2, 1]);
    ///
    /// // Stop when we reach 3
    /// let mut vec = vec![];
    /// assert_eq!(false, set.each_reverse(|&x| { vec.push(x); x != 3 }));
    /// assert_eq!(vec, [5, 4, 3]);
    /// ```
    #[inline]
    pub fn each_reverse<F>(&self, mut f: F) -> bool where F: FnMut(&usize) -> bool {
        self.map.each_reverse(|k, _| f(k))
    }

    /// Gets an iterator over the values in the set, in sorted order.
    ///
    /// # Examples
    ///
    /// ```
    /// let mut set = trie::Set::new();
    /// set.insert(3);
    /// set.insert(2);
    /// set.insert(1);
    /// set.insert(2);
    ///
    /// // Print 1, 2, 3
    /// for x in set.iter() {
    ///     println!("{}", x);
    /// }
    /// ```
    #[inline]
    pub fn iter(&self) -> Iter {
        Iter { iter: self.map.iter() }
    }

    /// Gets an iterator pointing to the first value that is not less than `val`.
    /// If all values in the set are less than `val` an empty iterator is returned.
    ///
    /// # Examples
    ///
    /// ```
    /// let set: trie::Set = [2, 4, 6, 8].iter().cloned().collect();
    /// assert_eq!(set.lower_bound(4).next(), Some(4));
    /// assert_eq!(set.lower_bound(5).next(), Some(6));
    /// assert_eq!(set.lower_bound(10).next(), None);
    /// ```
    pub fn lower_bound(&self, val: usize) -> Range {
        Range { iter: self.map.lower_bound(val) }
    }

    /// Gets an iterator pointing to the first value that key is greater than `val`.
    /// If all values in the set are less than or equal to `val` an empty iterator is returned.
    ///
    /// # Examples
    ///
    /// ```
    /// let set: trie::Set = [2, 4, 6, 8].iter().cloned().collect();
    /// assert_eq!(set.upper_bound(4).next(), Some(6));
    /// assert_eq!(set.upper_bound(5).next(), Some(6));
    /// assert_eq!(set.upper_bound(10).next(), None);
    /// ```
    pub fn upper_bound(&self, val: usize) -> Range {
        Range { iter: self.map.upper_bound(val) }
    }

    /// Visits the values representing the difference, in ascending order.
    ///
    /// # Examples
    ///
    /// ```
    /// let a: trie::Set = [1, 2, 3].iter().cloned().collect();
    /// let b: trie::Set = [3, 4, 5].iter().cloned().collect();
    ///
    /// // Can be seen as `a - b`.
    /// for x in a.difference(&b) {
    ///     println!("{}", x); // Print 1 then 2
    /// }
    ///
    /// let diff1: trie::Set = a.difference(&b).collect();
    /// assert_eq!(diff1, [1, 2].iter().cloned().collect());
    ///
    /// // Note that difference is not symmetric,
    /// // and `b - a` means something else:
    /// let diff2: trie::Set = b.difference(&a).collect();
    /// assert_eq!(diff2, [4, 5].iter().cloned().collect());
    /// ```
    pub fn difference<'a>(&'a self, other: &'a Set) -> Difference<'a> {
        Difference { a: self.iter().peekable(), b: other.iter().peekable() }
    }

    /// Visits the values representing the symmetric difference, in ascending order.
    ///
    /// # Examples
    ///
    /// ```
    /// let a: trie::Set = [1, 2, 3].iter().cloned().collect();
    /// let b: trie::Set = [3, 4, 5].iter().cloned().collect();
    ///
    /// // Print 1, 2, 4, 5 in ascending order.
    /// for x in a.symmetric_difference(&b) {
    ///     println!("{}", x);
    /// }
    ///
    /// let diff1: trie::Set = a.symmetric_difference(&b).collect();
    /// let diff2: trie::Set = b.symmetric_difference(&a).collect();
    ///
    /// assert_eq!(diff1, diff2);
    /// assert_eq!(diff1, [1, 2, 4, 5].iter().cloned().collect());
    /// ```
    pub fn symmetric_difference<'a>(&'a self, other: &'a Set) -> SymmetricDifference<'a> {
        SymmetricDifference { a: self.iter().peekable(), b: other.iter().peekable() }
    }

    /// Visits the values representing the intersection, in ascending order.
    ///
    /// # Examples
    ///
    /// ```
    /// let a: trie::Set = [1, 2, 3].iter().cloned().collect();
    /// let b: trie::Set = [2, 3, 4].iter().cloned().collect();
    ///
    /// // Print 2, 3 in ascending order.
    /// for x in a.intersection(&b) {
    ///     println!("{}", x);
    /// }
    ///
    /// let diff: trie::Set = a.intersection(&b).collect();
    /// assert_eq!(diff, [2, 3].iter().cloned().collect());
    /// ```
    pub fn intersection<'a>(&'a self, other: &'a Set) -> Intersection<'a> {
        Intersection { a: self.iter().peekable(), b: other.iter().peekable() }
    }

    /// Visits the values representing the union, in ascending order.
    ///
    /// # Examples
    ///
    /// ```
    /// let a: trie::Set = [1, 2, 3].iter().cloned().collect();
    /// let b: trie::Set = [3, 4, 5].iter().cloned().collect();
    ///
    /// // Print 1, 2, 3, 4, 5 in ascending order.
    /// for x in a.union(&b) {
    ///     println!("{}", x);
    /// }
    ///
    /// let diff: trie::Set = a.union(&b).collect();
    /// assert_eq!(diff, [1, 2, 3, 4, 5].iter().cloned().collect());
    /// ```
    pub fn union<'a>(&'a self, other: &'a Set) -> Union<'a> {
        Union { a: self.iter().peekable(), b: other.iter().peekable() }
    }

    /// Return the number of elements in the set
    ///
    /// # Examples
    ///
    /// ```
    /// let mut v = trie::Set::new();
    /// assert_eq!(v.len(), 0);
    /// v.insert(1);
    /// assert_eq!(v.len(), 1);
    /// ```
    #[inline]
    pub fn len(&self) -> usize { self.map.len() }

    /// Returns true if the set contains no elements
    ///
    /// # Examples
    ///
    /// ```
    /// let mut v = trie::Set::new();
    /// assert!(v.is_empty());
    /// v.insert(1);
    /// assert!(!v.is_empty());
    /// ```
    pub fn is_empty(&self) -> bool { self.map.is_empty() }

    /// Clears the set, removing all values.
    ///
    /// # Examples
    ///
    /// ```
    /// let mut v = trie::Set::new();
    /// v.insert(1);
    /// v.clear();
    /// assert!(v.is_empty());
    /// ```
    #[inline]
    pub fn clear(&mut self) { self.map.clear() }

    /// Returns `true` if the set contains a value.
    ///
    /// # Examples
    ///
    /// ```
    /// let set: trie::Set = [1, 2, 3].iter().cloned().collect();
    /// assert_eq!(set.contains(&1), true);
    /// assert_eq!(set.contains(&4), false);
    /// ```
    #[inline]
    pub fn contains(&self, value: &usize) -> bool {
        self.map.contains_key(value)
    }

    /// Returns `true` if the set has no elements in common with `other`.
    /// This is equivalent to checking for an empty intersection.
    ///
    /// # Examples
    ///
    /// ```
    /// let a: trie::Set = [1, 2, 3].iter().cloned().collect();
    /// let mut b = trie::Set::new();
    ///
    /// assert_eq!(a.is_disjoint(&b), true);
    /// b.insert(4);
    /// assert_eq!(a.is_disjoint(&b), true);
    /// b.insert(1);
    /// assert_eq!(a.is_disjoint(&b), false);
    /// ```
    #[inline]
    pub fn is_disjoint(&self, other: &Set) -> bool {
        self.iter().all(|v| !other.contains(&v))
    }

    /// Returns `true` if the set is a subset of another.
    ///
    /// # Examples
    ///
    /// ```
    /// let sup: trie::Set = [1, 2, 3].iter().cloned().collect();
    /// let mut set = trie::Set::new();
    ///
    /// assert_eq!(set.is_subset(&sup), true);
    /// set.insert(2);
    /// assert_eq!(set.is_subset(&sup), true);
    /// set.insert(4);
    /// assert_eq!(set.is_subset(&sup), false);
    /// ```
    #[inline]
    pub fn is_subset(&self, other: &Set) -> bool {
        self.iter().all(|v| other.contains(&v))
    }

    /// Returns `true` if the set is a superset of another.
    ///
    /// # Examples
    ///
    /// ```
    /// let sub: trie::Set = [1, 2].iter().cloned().collect();
    /// let mut set = trie::Set::new();
    ///
    /// assert_eq!(set.is_superset(&sub), false);
    ///
    /// set.insert(0);
    /// set.insert(1);
    /// assert_eq!(set.is_superset(&sub), false);
    ///
    /// set.insert(2);
    /// assert_eq!(set.is_superset(&sub), true);
    /// ```
    #[inline]
    pub fn is_superset(&self, other: &Set) -> bool {
        other.is_subset(self)
    }

    /// Adds a value to the set. Returns `true` if the value was not already
    /// present in the set.
    ///
    /// # Examples
    ///
    /// ```
    /// let mut set = trie::Set::new();
    ///
    /// assert_eq!(set.insert(2), true);
    /// assert_eq!(set.insert(2), false);
    /// assert_eq!(set.len(), 1);
    /// ```
    #[inline]
    pub fn insert(&mut self, value: usize) -> bool {
        self.map.insert(value, ()).is_none()
    }

    /// Removes a value from the set. Returns `true` if the value was
    /// present in the set.
    ///
    /// # Examples
    ///
    /// ```
    /// let mut set = trie::Set::new();
    ///
    /// set.insert(2);
    /// assert_eq!(set.remove(&2), true);
    /// assert_eq!(set.remove(&2), false);
    /// ```
    #[inline]
    pub fn remove(&mut self, value: &usize) -> bool {
        self.map.remove(value).is_some()
    }
}

impl iter::FromIterator<usize> for Set {
    fn from_iter<I: IntoIterator<Item=usize>>(iter: I) -> Set {
        let mut set = Set::new();
        set.extend(iter);
        set
    }
}

impl Extend<usize> for Set {
    fn extend<I: IntoIterator<Item=usize>>(&mut self, iter: I) {
        for elem in iter {
            self.insert(elem);
        }
    }
}

impl<'a, 'b> ops::BitOr<&'b Set> for &'a Set {
    type Output = Set;

    /// Returns the union of `self` and `rhs` as a new set.
    ///
    /// # Example
    ///
    /// ```
    /// let a: trie::Set = [1, 2, 3].iter().cloned().collect();
    /// let b: trie::Set = [3, 4, 5].iter().cloned().collect();
    ///
    /// let set: trie::Set = &a | &b;
    /// let v: Vec<usize> = set.iter().collect();
    /// assert_eq!(v, [1, 2, 3, 4, 5]);
    /// ```
    fn bitor(self, rhs: &Set) -> Set {
        self.union(rhs).collect()
    }
}

impl<'a, 'b> ops::BitAnd<&'b Set> for &'a Set {
    type Output = Set;

    /// Returns the intersection of `self` and `rhs` as a new set.
    ///
    /// # Example
    ///
    /// ```
    /// let a: trie::Set = [1, 2, 3].iter().cloned().collect();
    /// let b: trie::Set = [2, 3, 4].iter().cloned().collect();
    ///
    /// let set: trie::Set = &a & &b;
    /// let v: Vec<usize> = set.iter().collect();
    /// assert_eq!(v, [2, 3]);
    /// ```
    fn bitand(self, rhs: &Set) -> Set {
        self.intersection(rhs).collect()
    }
}

impl<'a, 'b> ops::BitXor<&'b Set> for &'a Set {
    type Output = Set;

    /// Returns the symmetric difference of `self` and `rhs` as a new set.
    ///
    /// # Example
    ///
    /// ```
    /// let a: trie::Set = [1, 2, 3].iter().cloned().collect();
    /// let b: trie::Set = [3, 4, 5].iter().cloned().collect();
    ///
    /// let set: trie::Set = &a ^ &b;
    /// let v: Vec<usize> = set.iter().collect();
    /// assert_eq!(v, [1, 2, 4, 5]);
    /// ```
    fn bitxor(self, rhs: &Set) -> Set {
        self.symmetric_difference(rhs).collect()
    }
}

impl<'a, 'b> ops::Sub<&'b Set> for &'a Set {
    type Output = Set;

    /// Returns the difference of `self` and `rhs` as a new set.
    ///
    /// # Example
    ///
    /// ```
    /// let a: trie::Set = [1, 2, 3].iter().cloned().collect();
    /// let b: trie::Set = [3, 4, 5].iter().cloned().collect();
    ///
    /// let set: trie::Set = &a - &b;
    /// let v: Vec<usize> = set.iter().collect();
    /// assert_eq!(v, [1, 2]);
    /// ```
    fn sub(self, rhs: &Set) -> Set {
        self.difference(rhs).collect()
    }
}

/// A forward iterator over a set.
#[derive(Clone)]
pub struct Iter<'a> {
    iter: map::Iter<'a, ()>
}

/// A bounded forward iterator over a set.
#[derive(Clone)]
pub struct Range<'a> {
    iter: map::Range<'a, ()>
}

/// An iterator producing elements in the set difference (in-order).
#[derive(Clone)]
pub struct Difference<'a> {
    a: Peekable<Iter<'a>>,
    b: Peekable<Iter<'a>>,
}

/// An iterator producing elements in the set symmetric difference (in-order).
#[derive(Clone)]
pub struct SymmetricDifference<'a> {
    a: Peekable<Iter<'a>>,
    b: Peekable<Iter<'a>>,
}

/// An iterator producing elements in the set intersection (in-order).
#[derive(Clone)]
pub struct Intersection<'a> {
    a: Peekable<Iter<'a>>,
    b: Peekable<Iter<'a>>,
}

/// An iterator producing elements in the set union (in-order).
#[derive(Clone)]
pub struct Union<'a> {
    a: Peekable<Iter<'a>>,
    b: Peekable<Iter<'a>>,
}

/// Compare `x` and `y`, but return `short` if x is None and `long` if y is None
fn cmp_opt(x: Option<&usize>, y: Option<&usize>, short: Ordering, long: Ordering) -> Ordering {
    match (x, y) {
        (None    , _       ) => short,
        (_       , None    ) => long,
        (Some(x1), Some(y1)) => x1.cmp(y1),
    }
}

impl<'a> Iterator for Iter<'a> {
    type Item = usize;
    fn next(&mut self) -> Option<usize> {
        self.iter.next().map(|(key, _)| key)
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        self.iter.size_hint()
    }
}

impl<'a> ExactSizeIterator for Iter<'a> {
    fn len(&self) -> usize { self.iter.len() }
}

impl<'a> Iterator for Range<'a> {
    type Item = usize;
    fn next(&mut self) -> Option<usize> { self.iter.next().map(|(key, _)| key) }
    fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}

impl<'a> Iterator for Difference<'a> {
    type Item = usize;
    fn next(&mut self) -> Option<usize> {
        loop {
            match cmp_opt(self.a.peek(), self.b.peek(), Less, Less) {
                Less    => return self.a.next(),
                Equal   => { self.a.next(); self.b.next(); }
                Greater => { self.b.next(); }
            }
        }
    }
}

impl<'a> Iterator for SymmetricDifference<'a> {
    type Item = usize;
    fn next(&mut self) -> Option<usize> {
        loop {
            match cmp_opt(self.a.peek(), self.b.peek(), Greater, Less) {
                Less => return self.a.next(),
                Equal => { self.a.next(); self.b.next(); }
                Greater => return self.b.next(),
            }
        }
    }
}

impl<'a> Iterator for Intersection<'a> {
    type Item = usize;
    fn next(&mut self) -> Option<usize> {
        loop {
            let o_cmp = match (self.a.peek(), self.b.peek()) {
                (None    , _       ) => None,
                (_       , None    ) => None,
                (Some(a1), Some(b1)) => Some(a1.cmp(b1)),
            };
            match o_cmp {
                None          => return None,
                Some(Less)    => { self.a.next(); }
                Some(Equal)   => { self.b.next(); return self.a.next() }
                Some(Greater) => { self.b.next(); }
            }
        }
    }
}

impl<'a> Iterator for Union<'a> {
    type Item = usize;
    fn next(&mut self) -> Option<usize> {
        match cmp_opt(self.a.peek(), self.b.peek(), Greater, Less) {
            Less    => self.a.next(),
            Equal   => { self.b.next(); self.a.next() }
            Greater => self.b.next(),
        }
    }
}

impl<'a> IntoIterator for &'a Set {
    type Item = usize;
    type IntoIter = Iter<'a>;
    fn into_iter(self) -> Iter<'a> { self.iter() }
}

#[cfg(test)]
mod test {
    use super::map::USIZE_BITS;
    use super::Set;

    #[test]
    fn test_sane_chunk() {
        let x = 1;
        let y = 1 << (USIZE_BITS - 1);

        let mut trie = Set::new();

        assert!(trie.insert(x));
        assert!(trie.insert(y));

        assert_eq!(trie.len(), 2);

        let expected = [x, y];

        for (i, x) in trie.iter().enumerate() {
            assert_eq!(expected[i], x);
        }
    }

    #[test]
    fn test_from_iter() {
        let xs = [9, 8, 7, 6, 5, 4, 3, 2, 1];

        let set: Set = xs.iter().cloned().collect();

        for x in xs.iter() {
            assert!(set.contains(x));
        }
    }

    #[test]
    fn test_debug() {
        let mut set = Set::new();
        let empty = Set::new();

        set.insert(1);
        set.insert(2);

        assert_eq!(format!("{:?}", set), "{1, 2}");
        assert_eq!(format!("{:?}", empty), "{}");
    }

    #[test]
    fn test_clone() {
        let mut a = Set::new();

        a.insert(1);
        a.insert(2);
        a.insert(3);

        assert!(a.clone() == a);
    }

    #[test]
    fn test_lt() {
        let mut a = Set::new();
        let mut b = Set::new();

        assert!(!(a < b) && !(b < a));
        assert!(b.insert(2));
        assert!(a < b);
        assert!(a.insert(3));
        assert!(!(a < b) && b < a);
        assert!(b.insert(1));
        assert!(b < a);
        assert!(a.insert(0));
        assert!(a < b);
        assert!(a.insert(6));
        assert!(a < b && !(b < a));
    }

    #[test]
    fn test_ord() {
        let mut a = Set::new();
        let mut b = Set::new();

        assert!(a <= b && a >= b);
        assert!(a.insert(1));
        assert!(a > b && a >= b);
        assert!(b < a && b <= a);
        assert!(b.insert(2));
        assert!(b > a && b >= a);
        assert!(a < b && a <= b);
    }

    struct Counter<'a, 'b> {
        i: &'a mut usize,
        expected: &'b [usize],
    }

    impl<'a, 'b> FnOnce<(usize,)> for Counter<'a, 'b> {
        type Output = bool;

        extern "rust-call" fn call_once(mut self, args: (usize,)) -> bool {
            self.call_mut(args)
        }
    }

    impl<'a, 'b> FnMut<(usize,)> for Counter<'a, 'b> {
        extern "rust-call" fn call_mut(&mut self, (x,): (usize,)) -> bool {
            assert_eq!(x, self.expected[*self.i]);
            *self.i += 1;
            true
        }
    }

    fn check<F>(a: &[usize], b: &[usize], expected: &[usize], f: F) where
        // FIXME Replace `Counter` with `Box<FnMut(&usize) -> bool>`
        F: FnOnce(&Set, &Set, Counter) -> bool,
    {
        let mut set_a = Set::new();
        let mut set_b = Set::new();

        for x in a.iter() { assert!(set_a.insert(*x)) }
        for y in b.iter() { assert!(set_b.insert(*y)) }

        let mut i = 0;
        f(&set_a, &set_b, Counter { i: &mut i, expected: expected });
        assert_eq!(i, expected.len());
    }

    #[test]
    fn test_intersection() {
        fn check_intersection(a: &[usize], b: &[usize], expected: &[usize]) {
            check(a, b, expected, |x, y, f| x.intersection(y).all(f))
        }

        check_intersection(&[], &[], &[]);
        check_intersection(&[1, 2, 3], &[], &[]);
        check_intersection(&[], &[1, 2, 3], &[]);
        check_intersection(&[2], &[1, 2, 3], &[2]);
        check_intersection(&[1, 2, 3], &[2], &[2]);
        check_intersection(&[11, 1, 3, 77, 103, 5],
                           &[2, 11, 77, 5, 3],
                           &[3, 5, 11, 77]);
    }

    #[test]
    fn test_difference() {
        fn check_difference(a: &[usize], b: &[usize], expected: &[usize]) {
            check(a, b, expected, |x, y, f| x.difference(y).all(f))
        }

        check_difference(&[], &[], &[]);
        check_difference(&[1, 12], &[], &[1, 12]);
        check_difference(&[], &[1, 2, 3, 9], &[]);
        check_difference(&[1, 3, 5, 9, 11],
                         &[3, 9],
                         &[1, 5, 11]);
        check_difference(&[11, 22, 33, 40, 42],
                         &[14, 23, 34, 38, 39, 50],
                         &[11, 22, 33, 40, 42]);
    }

    #[test]
    fn test_symmetric_difference() {
        fn check_symmetric_difference(a: &[usize], b: &[usize], expected: &[usize]) {
            check(a, b, expected, |x, y, f| x.symmetric_difference(y).all(f))
        }

        check_symmetric_difference(&[], &[], &[]);
        check_symmetric_difference(&[1, 2, 3], &[2], &[1, 3]);
        check_symmetric_difference(&[2], &[1, 2, 3], &[1, 3]);
        check_symmetric_difference(&[1, 3, 5, 9, 11],
                                   &[3, 9, 14, 22],
                                   &[1, 5, 11, 14, 22]);
    }

    #[test]
    fn test_union() {
        fn check_union(a: &[usize], b: &[usize], expected: &[usize]) {
            check(a, b, expected, |x, y, f| x.union(y).all(f))
        }

        check_union(&[], &[], &[]);
        check_union(&[1, 2, 3], &[2], &[1, 2, 3]);
        check_union(&[2], &[1, 2, 3], &[1, 2, 3]);
        check_union(&[1, 3, 5, 9, 11, 16, 19, 24],
                    &[1, 5, 9, 13, 19],
                    &[1, 3, 5, 9, 11, 13, 16, 19, 24]);
    }

    #[test]
    fn test_bit_or() {
        let a: Set = [1, 2, 3].iter().cloned().collect();
        let b: Set = [3, 4, 5].iter().cloned().collect();

        let set: Set = &a | &b;
        let v: Vec<usize> = set.iter().collect();
        assert_eq!(v, [1, 2, 3, 4, 5]);
    }

    #[test]
    fn test_bit_and() {
        let a: Set = [1, 2, 3].iter().cloned().collect();
        let b: Set = [2, 3, 4].iter().cloned().collect();

        let set: Set = &a & &b;
        let v: Vec<usize> = set.iter().collect();
        assert_eq!(v, [2, 3]);
    }

    #[test]
    fn test_bit_xor() {
        let a: Set = [1, 2, 3].iter().cloned().collect();
        let b: Set = [3, 4, 5].iter().cloned().collect();

        let set: Set = &a ^ &b;
        let v: Vec<usize> = set.iter().collect();
        assert_eq!(v, [1, 2, 4, 5]);
    }

    #[test]
    fn test_sub() {
        let a: Set = [1, 2, 3].iter().cloned().collect();
        let b: Set = [3, 4, 5].iter().cloned().collect();

        let set: Set = &a - &b;
        let v: Vec<usize> = set.iter().collect();
        assert_eq!(v, [1, 2]);
    }
}