Skip to content

An implementation of SlotMap with minimal restrictions on Keys and Values

Notifications You must be signed in to change notification settings

RookAndPawn/one_way_slot_map

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.

About

An implementation of SlotMap with minimal restrictions on Keys and Values

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages