one_way_slot_map

Crates.ioone_way_slot_map
lib.rsone_way_slot_map
version0.4.2
sourcesrc
created_at2020-06-07 15:59:46.042942
updated_at2021-12-12 18:36:57.976178
descriptionAn implementation of SlotMap with minimal restrictions on Keys and Values
homepage
repositoryhttps://github.com/RookAndPawn/one_way_slot_map
max_upload_size
id251021
size59,675
Kevin Guthrie (johnhurt)

documentation

README

One-Way Slot Map

This is an implementation of the slot map data structure similar to SlotMap with fewer restrictions and the ability to embed data inside the key objects. The "one-way" moniker for this crate comes from an implementation detail that prevent inserted values from being taken out again unless they are replaced with another instance. Values that are inserted can be referenced, and written to, but ownership of the values remains with the map even after the value is "removed".

The data structure uses fixed size chunks (like SlotMap's DenseSlotMap), so lookups require 2 steps of indirection.

Example Usage:

First create a Key Class with an embedded data type

/// Define a simple key with an embedded usize
define_key_type!(DemoKey<usize>);

/// Or define a less-simple key with some derived traits
define_key_type!(TestKeyWithDerives<usize> : Copy + Clone + Debug);

Then create a slot map and use the key for crud operations

let mut slot_map = SlotMap::new();

let key: DemoKey = slot_map.insert(0, "Demo!");
assert_eq!(Some(&"Demo!"), slot_map.get(&key));

let slot = slot_map.get_mut(&key).unwrap();
*slot = "Updated!";

assert_eq!(Some(&mut "Updated!"), slot_map.remove(&key));
assert_eq!(None, slot_map.get(&key));

Performance

Benchmarks to come, but in summary, this slot map is about half as fast as fast as the default implementation of SlotMap's SlotMap, slightly faster than SlotMap's DenseSlotMap and about a dozen times faster than std::collections::HashMap.

Commit count: 25

cargo fmt