pub enum AdaptiveNodeSet {
    Sparse {
        max_items: usize,
        data: HashSet<NodeId>,
    },
    Dense {
        data: BitVec,
    },
}
Expand description

Implementation of NodeSet that dynamically changes the underlying representation based on its content

The current implementation is initialized with a HashSet, but switches to [BitVec] once the data becomes dense.

This has the advantage of allocating little memory if there won’t be many elements, but avoiding the overhead of HashSet when there are.

let mut node_set = AdaptiveNodeSet::new(100);
assert_eq!(format!("{:?}", node_set), "Sparse { max_items: 100, data: {} }");
node_set.insert(10);
assert_eq!(format!("{:?}", node_set), "Sparse { max_items: 100, data: {10} }");
for i in 20..30 {
    node_set.insert(i);
}
assert_eq!(format!("{:?}", node_set), "Dense { data: BitVec { data: [1072694272, 0], len: 100 } }");

Variants§

§

Sparse

Fields

§max_items: usize
§

Dense

Fields

§data: BitVec

Implementations§

source§

impl AdaptiveNodeSet

source

pub fn new(max_items: usize) -> Self

Creates an empty AdaptiveNodeSet that may only store node ids from 0 to max_items-1

source

pub fn with_capacity(max_items: usize, capacity: usize) -> Self

Creates an empty AdaptiveNodeSet with at least the specified capacity

Trait Implementations§

source§

impl Debug for AdaptiveNodeSet

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl NodeSet for AdaptiveNodeSet

source§

fn insert(&mut self, node: usize)

Adds a node to the set

Panics

If node is larger or equal to the max_items value passed to AdaptiveNodeSet::new.

source§

fn contains(&self, node: usize) -> bool

Returns whether the node is part of the set

Panics

If node is larger or equal to the max_items value passed to AdaptiveNodeSet::new.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CastableFrom<T> for T

§

fn cast_from(value: T) -> T

Call Self as W
§

impl<T, U> CastableInto<U> for Twhere U: CastableFrom<T>,

§

fn cast(self) -> U

Call W::cast_from(self)
§

impl<T> DowncastableFrom<T> for T

§

fn downcast_from(value: T) -> T

Truncate the current UnsignedInt to a possibly smaller size
§

impl<T, U> DowncastableInto<U> for Twhere U: DowncastableFrom<T>,

§

fn downcast(self) -> U

Call W::downcast_from(self)
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, W> HasTypeWitness<W> for Twhere W: MakeTypeWitness<Arg = T>, T: ?Sized,

§

const WITNESS: W = W::MAKE

A constant of the type witness
§

impl<T> Identity for Twhere T: ?Sized,

§

type Type = T

The same type as Self, used to emulate type equality bounds (T == U) with associated type equality constraints (T: Identity<Type = U>).
§

const TYPE_EQ: TypeEq<T, <T as Identity>::Type> = TypeEq::NEW

Proof that Self is the same type as Self::Type, provides methods for casting between Self and Self::Type.
source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Splat<T> for T

§

fn splat(value: T) -> T

§

impl<T> To<T> for T

§

fn to(self) -> T

source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> UpcastableFrom<T> for T

§

fn upcast_from(value: T) -> T

Extend the current UnsignedInt to a possibly bigger size.
§

impl<T, U> UpcastableInto<U> for Twhere U: UpcastableFrom<T>,

§

fn upcast(self) -> U

Call W::upcast_from(self)
§

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

§

fn vzip(self) -> V

§

impl<T> Allocation for Twhere T: RefUnwindSafe + Send + Sync,