# shared_slab
This crate provides a single data type, `Slab`, which is very similar in concept to that provided
by the [`slab`](https://github.com/tokio-rs/slab) or [`sharded-slab`](https://github.com/hawkw/sharded-slab)
crates.
The key difference of this crate as compared to the others can be summed up in the function signatures:
```rs
pub fn get(&self, key: usize) -> Option<&T>
pub fn insert(&self, value: T) -> usize
pub fn insert_and_get(&self, value: T) -> (usize, &T)
pub fn remove(&mut self, key: usize) -> T
```
Or, in words, shared insertion while allowing shared access to the values contained within.
(`slab` requires mutable access for insertion, and `sharded-slab` doesn't provide direct `&T`
references to contained data)
As for use-cases, this structure is mainly useful for memoizing and reusing resources, in a pattern of:
```rs
pub fn add_resource(&self, resource_descriptor: Descriptor) -> &Resource
```