[−][src]Crate dynvec
This crate dynvec
provides the DynVec
type that acts like a vector to store any datatype.
By default, the DynVec
uses a system of chunks that are allocated on the heap when needed but this can be changed using the RawDynVec
structure along with a Region
.
At the moment, three types of regions are implemented.
Block
: A fixed-size block of memoryChunks
: A region that allocatesBlock
s (chunks) when one becomes full.Global
: A simple region that maps to rust's allocator (each item is allocated anywhere on the heap memory).
Example
Using the default DynVec
:
use dynvec::DynVec; // Create an empty `DynVec` let mut my_vec = DynVec::new(); // By default, each chunk will be allocated with a size of 1024 bytes. // This can be changed using the `DynVec::with_chunk_size` function. // Items can be inserted into the vector let handle_u8 = my_vec.insert(142u8); let handle_str = my_vec.insert("Hello, world!"); let handle_vec = my_vec.insert(vec![1, 2, 3]); // They can be accessed normally using indexing operations my_vec[handle_vec].push(4); assert_eq!(my_vec[handle_u8], 142); assert_eq!(my_vec[handle_str], "Hello, world!"); assert_eq!(&my_vec[handle_vec][..], &[1, 2, 3, 4][..]); // Removing them is just as easy let vector = my_vec.remove(handle_vec).unwrap(); assert_eq!(&vector[..], &[1, 2, 3, 4][..]); // The vector can be cleared (everything gets properly dropped) my_vec.clear();
Using another type of region:
use dynvec::{RawDynVec, Global}; // This is basically a vector of boxes. let mut my_vec = RawDynVec::with_region(Global::default()); my_vec.insert(42); my_vec.insert("Hello");
You might want to avoid having typed handles everywhere. You can use raw handles:
use dynvec::DynVec; let mut my_vec = DynVec::new(); let mut handles = Vec::new(); handles.push(my_vec.insert("ABC").raw()); handles.push(my_vec.insert(64u8).raw()); handles.push(my_vec.insert(String::from("BDE")).raw()); for handle in handles { // This returns nothing // We do not know the type of the item anymore // The item gets properly dropped though my_vec.remove_raw(handle).unwrap(); }
Note
I used DynVec
as a name even though it is not at all a vector because it makes it easy to understand what it does.
Structs
Handle | A handle to an allocated object of a dynamic vector. |
RawDynVec | A dynamic vector, able to store any kind of data. |
RawHandle | A handle to an allocated object of a dynamic vector that does
not own a |
Traits
Region | Represents a region of the memory. Objects can be allocated into this region. Regions can carry additional data with each allocation. |
Type Definitions
Block | A region that allocates in advance a single block of memory. |
Chunks | A region that allocates chunks of memory when one gets too small to store the requested data. |
DynVec | A dynamic vector, able to store any kind of data. |
Global | A region that allocates items using the global allocator. |