Struct miri::borrow_tracker::tree_borrows::unimap::UniKeyMap

source ·
pub struct UniKeyMap<K> {
    mapping: FxHashMap<K, u32>,
    deassigned: Vec<u32>,
}
Expand description

From K to UniIndex

Fields§

§mapping: FxHashMap<K, u32>

Underlying map that does all the hard work. Key invariant: the contents of deassigned are disjoint from the keys of mapping, and together they form the set of contiguous integers 0 .. (mapping.len() + deassigned.len()).

§deassigned: Vec<u32>

Indexes that can be reused: memory gain when the map gets sparse due to many deletions.

Implementations§

source§

impl<K> UniKeyMap<K>
where K: Hash + Eq,

source

pub fn len(&self) -> usize

How many keys/index pairs are currently active.

source

pub fn contains_key(&self, key: &K) -> bool

Whether this key has an associated index or not.

source

pub fn insert(&mut self, key: K) -> UniIndex

Assign this key to a new index. Panics if the key is already assigned, use get_or_insert for a version that instead returns the existing assignment.

source

pub fn get(&self, key: &K) -> Option<UniIndex>

If it exists, the index this key maps to.

source

pub fn get_or_insert(&mut self, key: K) -> UniIndex

Either get a previously existing entry, or create a new one if it is not yet present.

source

pub fn remove(&mut self, key: &K)

Return whatever index this key was using to the deassigned pool.

Note: calling this function can be dangerous. If the index still exists somewhere in a UniValMap and is reassigned by the UniKeyMap then it will inherit the old value of a completely unrelated key. If you UniKeyMap::remove a key you should make sure to also UniValMap::remove the associated UniIndex from ALL UniValMaps.

Example of such behavior:

let mut keymap = UniKeyMap::<char>::default();
let mut valmap = UniValMap::<char>::default();
// Insert 'a' -> _ -> 'A'
let idx_a = keymap.insert('a');
valmap.insert(idx_a, 'A');
// Remove 'a' -> _, but forget to remove _ -> 'A'
keymap.remove(&'a');
// valmap.remove(idx_a); // If we uncomment this line the issue is fixed
// Insert 'b' -> _
let idx_b = keymap.insert('b');
let val_b = valmap.get(idx_b);
assert_eq!(val_b, Some('A')); // Oh no
// assert_eq!(val_b, None); // This is what we would have expected

Trait Implementations§

source§

impl<K: Clone> Clone for UniKeyMap<K>

source§

fn clone(&self) -> UniKeyMap<K>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<K: Debug> Debug for UniKeyMap<K>

source§

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

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

impl<K: Default> Default for UniKeyMap<K>

source§

fn default() -> UniKeyMap<K>

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<K> Freeze for UniKeyMap<K>

§

impl<K> RefUnwindSafe for UniKeyMap<K>
where K: RefUnwindSafe,

§

impl<K> Send for UniKeyMap<K>
where K: Send,

§

impl<K> Sync for UniKeyMap<K>
where K: Sync,

§

impl<K> Unpin for UniKeyMap<K>
where K: Unpin,

§

impl<K> UnwindSafe for UniKeyMap<K>
where K: UnwindSafe,

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

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

source§

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

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where 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.

source§

impl<T> Same for T

source§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

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

source§

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 T
where U: TryFrom<T>,

source§

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<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

Layout§

Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.

Size: 56 bytes