PinnedVec
trait serves as the marker with common vector functionalities
for vector implementations which
This feature eliminates a specific set of errors leading to undefined behavior (UB), and hence, allows to work with a more flexible borrow checker. Consider for instance the following code block which does not compile.
rust
let mut vec = Vec::with_capacity(2);
vec.extend_from_slice(&[0, 1]);
let ref0 = &vec[0];
vec.push(2);
// let value0 = *ref0; // does not compile!
Note that we have not removed any elements form the vector.
The reason why dereferencing ref0
causes UB is:
ref0
is invalid which causes the UB.PinnedVec
implementations, on the other hand, guarantee that such moves in
memory locations do not happen; and hence, eliminating the cause of the UB observed here.
See, FixedVec
and SplitVec
for two basic pinned-vector implementations.
Further, see ImpVec
crate which allows converting
any PinnedVec
implementation into an imp-vec.
An imp-vec stands for immutable-push-vector, literally allowing to push to the vector with an
immutable reference.
This turns out to be a very useful opeartion, allowing to conveniently implement tricky data structures.