Crates.io | one_way_slot_map |
lib.rs | one_way_slot_map |
version | 0.4.2 |
source | src |
created_at | 2020-06-07 15:59:46.042942 |
updated_at | 2021-12-12 18:36:57.976178 |
description | An implementation of SlotMap with minimal restrictions on Keys and Values |
homepage | |
repository | https://github.com/RookAndPawn/one_way_slot_map |
max_upload_size | |
id | 251021 |
size | 59,675 |
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.
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));
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.