orx-pinned-vec

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:

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.