# gen-vec Build Status

Vector of reusable, generational indices that owns its values

Inspired by Catherine West's closing keynote at RustConf 2018

### Closed vs. Exposed index allocation implementations

ClosedGenVec uses a non user-accessible index allocator to manage indices

ExposedGenVec relies on an external IndexAllocator

As such, an IndexAllocator must be created and used to allocate/deallocate indices manually. This is useful for using the same Index across multiple ExposedGenerationalVec instances

Note: IndexAllocator cannot be used with ClosedGenerationalVec since it has its own internal IndexAllocator

### Explanation of Generational Indices

Index structs are used to access the vector's contents. An Index contains an index for the vector and a generation (which is 0 initially).

Deallocated/removed Indexs go into a list of free Indexs that can be reused

Every time an Index is reused, the internal generation is incremented. This ensures that a deallocated Index handle can't access data that it no longer validly points to

### Usage Add gen-vec to your Cargo.toml toml [dependencies] gen-vec = "0.2.0" Using the self-allocating ClosedGenVec ```rust use genvec::Index; use genvec::closed::ClosedGenVec;

let mut vec: ClosedGenVec = ClosedGenVec::new();

let index: Index = vec.insert(42); assert!(vec.contains(index));

let value: Option<&i32> = vec.get(index); assert_eq!(value, Some(&42));

vec.remove(index); assert!(!vec.contains(index)); ```

Using ExposedGenVec with IndexAllocator ```rust use genvec::Index; use genvec::exposed::{IndexAllocator, ExposedGenVec};

let mut allocator: IndexAllocator = IndexAllocator::new();

let index: Index = allocator.allocate();

let mut vec: ExposedGenVec = ExposedGenVec::new(); vec.set(index, 5); assert!(vec.contains(index));

let value: Option<&i32> = vec.get(index); assert_eq!(value, Some(&5)); ```