Add more content to cranelift-entity's README.md. (#515)
* Add more content to cranelift-entity's README.md. Summarize what cranelift-entity provides, and how it differs from similar systems such as slotmap, which was recently highlighted in the RustConf 2018 Closing Keynote.
This commit is contained in:
@@ -1,2 +1,40 @@
|
|||||||
This crate contains array-based data structures used by the core Cranelift code
|
This crate contains array-based data structures used by the core Cranelift code
|
||||||
generator which use densely numbered entity references as mapping keys.
|
generator which use densely numbered entity references as mapping keys.
|
||||||
|
|
||||||
|
One major difference between this crate and crates like [slotmap], [slab],
|
||||||
|
and [generational-arena] is that this crate currently provides no way to delete
|
||||||
|
entities. This limits its use to situations where deleting isn't important,
|
||||||
|
however this also makes it more efficient, because it doesn't need extra
|
||||||
|
bookkeeping state to reuse the storage for deleted objects, or to ensure that
|
||||||
|
new objects always have unique keys (eg. slotmap's and generational-arena's
|
||||||
|
versioning).
|
||||||
|
|
||||||
|
Another major difference is that this crate protects against using a key from
|
||||||
|
one map to access an element in another. Where `SlotMap`, `Slab`, and `Arena`
|
||||||
|
have a value type parameter, `PrimaryMap` has a key type parameter and a value
|
||||||
|
type parameter. The crate also provides the `entity_impl` macro which makes it
|
||||||
|
easy to declare new unique types for use as keys. Any attempt to use a key in
|
||||||
|
a map it's not intended for is diagnosed with a type error.
|
||||||
|
|
||||||
|
Another is that this crate has two core map types, `PrimaryMap` and
|
||||||
|
`EntityMap`, which serve complementary purposes. A `PrimaryMap` creates its
|
||||||
|
own keys when elements are inserted, while an `EntityMap` reuses the keys
|
||||||
|
values of a `PrimaryMap`, conceptually storing additional data in the same
|
||||||
|
index space. `EntityMap`'s values must implement `Default` and all elements
|
||||||
|
in an `EntityMap` initially have the value of `default()`.
|
||||||
|
|
||||||
|
A common way to implement `Default` is to wrap a type in `Option`, however
|
||||||
|
this crate also provides the `PackedOption` utility which can use less memory
|
||||||
|
in some cases.
|
||||||
|
|
||||||
|
Additional utilities provided by this crate include:
|
||||||
|
- `EntityList`, for allocating many small arrays (such as instruction operand
|
||||||
|
lists in a compiler code generator).
|
||||||
|
- `SparseMap`: an alternative to `EntityMap` which can use less memory
|
||||||
|
in some situations.
|
||||||
|
- `EntitySet`: a specialized form of `EntityMap` using a bitvector to
|
||||||
|
record which entities are members of the set.
|
||||||
|
|
||||||
|
[slotmap]: https://crates.io/crates/slotmap
|
||||||
|
[slab]: https://crates.io/crates/slab
|
||||||
|
[generational-arena]: https://crates.io/crates/generational-arena
|
||||||
|
|||||||
Reference in New Issue
Block a user