Crate uniquevec

Source
Expand description

This crate offers a Vec-like datastructure which only contains unique entries. It is no_std by default but necessarily requires an allocator. To access elements inside the vector, we implement the Deref trait such that it can be used like a regular Vec. We provide distinct types for PartialEq and Eq traits in order to support a wider variety of use-cases. To modify entries or create new instances, we implement methods which are listed below.

// Create a new empty UniqueVec
use uniquevec::UniqueVec;
let mut uvec = UniqueVec::new();

// Fill it with contents
uvec.push("cellular");
uvec.push("_");
uvec.push("raza");

// The next entry is already contained so it will not be added again.
// We can also check the returned value
let r = uvec.push("cellular");
assert_eq!(r, Some("cellular"));

// Otherwise we can use it similarly to a Vec
assert_eq!(uvec[0], "cellular");
assert_eq!(uvec[1], "_");
assert_eq!(uvec[2], "raza");
assert_eq!(uvec.len(), 3);

for (n, entry) in uvec.into_iter().enumerate() {
    println!("{n}th entry: {entry}");
}

§Create and Modify

MethodDescription
UniqueVec::new()Creates a new empty UniqueVec.
UniqueVec::from_iter(iterator)Creates a new UniqueVec from an iterator.
UniqueVec::push(item)Pushes a new entry to the back or returns it if already present.
UniqueVec::clear()Clears all entries.
UniqueVec::pop()Removes and returns the last entry.
UniqueVec::extend_from_iter(iterator)Extends elements by the given iterator. Returns duplicates in order.

§Implemented Traits

TraitImplementedComment
Deref for Vec
DerefMutSee the “Create and Modify” table above.
Extend
From for Vec
IntoIterator

§PartialEq Warning

Since the UniqueVec struct only requires the PartialEq trait, some unexpected behaviour might occurr when using it with types such as f32 or f64 which do not implement Eq.

let mut unique_vec = UniqueVec::new();

// Insert two times NAN values
unique_vec.push(1f64);
unique_vec.push(f64::NAN);
unique_vec.push(f64::NAN);
assert_eq!(unique_vec[0], 1f64);
assert!(unique_vec[1].is_nan());
assert!(unique_vec[2].is_nan());
assert_eq!(unique_vec.len(), 3);

For this particular reason, we provide the UniqueVecEq struct which can only be used when the entry type implements the Eq trait.

// This will compile
let mut unique_vec: UniqueVecEq<_> = UniqueVec::new().into();
unique_vec.push(1usize);
// This will not compile
let mut unique_vec: UniqueVecEq<_> = UniqueVec::new().into();
unique_vec.push(1f64);

§Features

  • The serde feature offers serialization support.

Structs§

UniqueVec
A unique vector containing only non-recurring values but in the correct order.
UniqueVecEq
Identical to the UniqueVec struct but only supports entry types which implement Eq.