[][src]Struct tinyset::set64::Set64

pub struct Set64<T: Fits64>(_, _);

A set type that can store any type that fits in a u64. This set type is very space-efficient in storing small or closely spaced integers, while not being bad at storing large integers.

Major caveat The Set64 type defines iterators (drain() and iter()) that iterate over T rather than &T. This is a break with standard libray convention, and can be annoying if you are translating code from HashSet to Set64. The motivation for this is several-fold:

  1. Set64 does not store T directly in its data structures (which would waste space), so there is no reference to the data to take. This does not make it impossible, but does mean we would have to fabricate a T and return a reference to it, which is awkward and ugly.

  2. There is no inefficiency involved in returning T, since it is necessarily no larger than a pointer.

Examples

use tinyset::Set64;

let a: Set64<char> = "Hello world".chars().collect();

for x in "Hello world".chars() {
    assert!(a.contains(&x));
}
for x in a {
    assert!("Hello world".contains(x));
}

Storage details

Internally a Set64 is identical to a [SetU64], so read there for details. In short, small sets are the size of a pointer with no heap storage. Densely packed sets are around a bit per member. Intermediate sets have intermediate storage. The worst case scenario is large integers widely spaced apart, in which case the storage is similar to a std::collections::HashSet.

Implementations

impl<T: Fits64> Set64<T>[src]

pub fn is_empty(&self) -> bool[src]

Returns true if the set is empty

impl<T: Fits64> Set64<T>[src]

pub fn new() -> Self[src]

Creates an empty set..

pub fn with_capacity(_cap: usize) -> Self[src]

Creates an empty set with the specified capacity.

pub fn insert(&mut self, elem: T) -> bool[src]

Adds a value to the set.

If the set did not have this value present, true is returned.

If the set did have this value present, false is returned.

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

Returns the number of elements in the set.

pub fn contains<R: Borrow<T>>(&self, value: R) -> bool[src]

Returns true if the set contains a value.

pub fn remove(&mut self, value: &T) -> bool[src]

Removes an element, and returns true if that element was present.

pub fn iter<'a>(&'a self) -> impl Iterator<Item = T> + 'a[src]

Iterate

pub fn drain<'a>(&'a mut self) -> impl Iterator<Item = T> + 'a[src]

Drain

Trait Implementations

impl<'a, 'b, T: Fits64> BitOr<&'b Set64<T>> for &'a Set64<T>[src]

type Output = Set64<T>

The resulting type after applying the | operator.

fn bitor(self, rhs: &Set64<T>) -> Set64<T>[src]

Returns the union of self and rhs as a new Set64<T>.

Examples

use tinyset::Set64;

let a: Set64<u32> = vec![1, 2, 3].into_iter().collect();
let b: Set64<u32> = vec![3, 4, 5].into_iter().collect();

let set = &a | &b;

let mut i = 0;
let expected = [1, 2, 3, 4, 5];
for x in set {
    assert!(expected.contains(&x));
    i += 1;
}
assert_eq!(i, expected.len());

impl<T: Clone + Fits64> Clone for Set64<T>[src]

impl<T: Debug + Fits64> Debug for Set64<T>[src]

impl<T: Fits64> Default for Set64<T>[src]

fn default() -> Self[src]

Creates an empty set..

impl<T: Fits64> Eq for Set64<T>[src]

impl<T: Fits64> Extend<T> for Set64<T>[src]

fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I)[src]

Adds a bunch of elements to the set

Examples

use tinyset::Set64;

let mut a: Set64<u32> = vec![1, 2, 3].into_iter().collect();
a.extend(vec![3, 4, 5]);

let mut i = 0;
let expected = [1, 2, 3, 4, 5];
for x in a {
    assert!(expected.contains(&x));
    i += 1;
}
assert_eq!(i, expected.len());

impl<T: Fits64> FromIterator<T> for Set64<T>[src]

impl<T: Fits64> Hash for Set64<T>[src]

impl<T: Fits64> IntoIterator for Set64<T>[src]

type Item = T

The type of the elements being iterated over.

type IntoIter = IntoIter<T>

Which kind of iterator are we turning this into?

impl<T: Fits64> PartialEq<Set64<T>> for Set64<T>[src]

impl<'a, 'b, T: Fits64> Sub<&'b Set64<T>> for &'a Set64<T>[src]

type Output = Set64<T>

The resulting type after applying the - operator.

fn sub(self, rhs: &Set64<T>) -> Set64<T>[src]

Returns the difference of self and rhs as a new Set64<T>.

Examples

use tinyset::Set64;

let a: Set64<u32> = vec![1, 2, 3].into_iter().collect();
let b: Set64<u32> = vec![3, 4, 5].into_iter().collect();

let set = &a - &b;

let mut i = 0;
let expected = [1, 2];
for x in set {
    assert!(expected.contains(&x));
    i += 1;
}
assert_eq!(i, expected.len());

Auto Trait Implementations

impl<T> RefUnwindSafe for Set64<T> where
    T: RefUnwindSafe

impl<T> Send for Set64<T> where
    T: Send

impl<T> Sync for Set64<T> where
    T: Sync

impl<T> Unpin for Set64<T> where
    T: Unpin

impl<T> UnwindSafe for Set64<T> where
    T: 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> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

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.

impl<V, T> VZip<V> for T where
    V: MultiLane<T>,