1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*!
Generational arena inspired by
[generational-arena](https://crates.io/crates/generational-arena),
[slotmap](https://crates.io/crates/slotmap), and
[slab](https://crates.io/crates/slab).

**Thunderdome should probably not (yet) be used in real projects. It is severely
under-tested and contains a small amount of unsafe code.**

## Basic Examples

```rust
# use thunderdome::{Arena, Index};
let mut arena = Arena::new();

let foo = arena.insert("Foo");
let bar = arena.insert("Bar");

assert_eq!(arena[foo], "Foo");
assert_eq!(arena[bar], "Bar");

arena[bar] = "Replaced";
assert_eq!(arena[bar], "Replaced");

let foo_value = arena.remove(foo);
assert_eq!(foo_value, Some("Foo"));

// The slot previously used by foo will be reused for baz
let baz = arena.insert("Baz");
assert_eq!(arena[baz], "Baz");

// foo is no longer a valid key
assert_eq!(arena.get(foo), None);
```

## Comparison With Similar Crates

| Feature                      | Thunderdome | generational-arena | slotmap | slab |
|------------------------------|-------------|--------------------|---------|------|
| Generational Indices         | Yes         | Yes                | Yes     | No   |
| `size_of::<Index>()`         | 16          | 16                 | 8       | 8    |
| `size_of::<Option<Index>>()` | 16          | 24                 | 8       | 16   |
| Non-`Copy` Values            | Yes         | Yes                | Sorta¹  | Yes  |
| no-std support               | No          | Yes                | No      | No   |
| Serde support                | No          | Yes                | Yes     | No   |
| Should be used               | No          | Yes                | Yes     | Yes  |

* Sizes calculated on rustc `1.44.0-x86_64-pc-windows-msvc`

1. slotmap's `SlotMap` and `HopSlotMap` require values to be `Copy` on stable
  Rust versions. slotmap's `DenseSlotMap` type supports non-`Copy` types on
  stable, but has different performance trade-offs.

## Minimum Supported Rust Version (MSRV)

Thunderdome supports Rust 1.31.0 and newer. Until Thunderdome reaches 1.0,
changes to the MSRV will require major version bumps. After 1.0, MSRV changes
will only require minor version bumps, but will need significant justification.
*/

#![forbid(missing_docs)]

mod arena;
mod free_pointer;
mod generation;

pub use crate::arena::{Arena, Drain, Index};