Type erased vector. All elements have the same type.
Designed to be type-erased as far as possible - most operations do not know a concrete type. For example, you can move or copy/clone items from one type-erased vector to another, without ever knowing their type. Or you can erase, swap, move, copy elements inside type-erased vector, etc...
Only type-erased destruct and clone operations have additional overhead of indirect call.
Usage
let mut vec: AnyVec = ;
let mut other_vec: AnyVec = ;
// Fully type erased element move from one vec to another
// without intermediate mem-copies.
let element = vec.swap_remove;
other_vec.push;
// Output 2 1
for s in vec..unwrap
See documentation for more.
Send, Sync, Clone
You can make AnyVec Sendable, Syncable, Cloneable:
use AnyVec;
use *;
let v1: = ;
let v2 = v1.clone;
This constraints will be applied compiletime to element type:
// This will fail to compile.
let v1: = ;
Non-Clonable AnyVec has a size 1 pointer smaller.
LazyClone
Whenever possible, any_vec type erased elements can be lazily cloned:
let mut v1: = ;
v1.push;
let mut v2: = ;
let e = v1.swap_remove;
v2.push;
v2.push;
MemBuilder
MemBuilder + Mem works like Allocator for AnyVec. But unlike allocator,
Mem container-specialized design allows to perform more optimizations. For example,
it is possible to make stack-allocated FixedAnyVec and small-buffer-optimized(SBO) SmallAnyVec
from AnyVec by just changing MemBuilder:
type FixedAnyVec<Traits = dyn None> = ;
let mut any_vec: FixedAnyVec = ;
// This will be on stack, without any allocations.
any_vec.push
With help of clone_empty_in you can use stack allocated, or SBO AnyVec
as fast intermediate storage for values of unknown type:
MemBuilder interface, being stateful, allow to make Mem, which can work with complex custom allocators.
no_std + no_alloc
This is no_std library, which can work without alloc too.
Changelog
See CHANGELOG.md for version differences.
Known alternatives
- type_erased_vec. Allow to store
Vec<T>in type erased way, but you need to perform operations, you need to "cast" to concrete type first. - untyped_vec. Some operations like
len,capacityperformed without type knowledge; but the rest - require concrete type.