Expand description
In memory of Anna Harren, who coined the term turbofish - which you’ll see a lot of if you use this crate.
The main purpose of this crate is the HarrenVec
type -
a Vec
-like data structure that can store items
of different types and sizes from each other.
Values of any type can be stored, and they are
stored contiguous in memory like a normal Vec
would.
The intended use case for this data structure is
efficiently packing structs with large optional fields,
while avoiding Box
-ing those values.
It supports values with a Drop
implementation by default.
However, if you include the no_drop
feature, then
dropping the HarrenVec
will not call the destructors of
the contents. Instead you should use the
HarrenVec::into_iter
method to ensure you are consuming
and dropping values correctly. If the values do not have
destructors, this is not necessary.
§Examples
use hvec::HarrenVec;
struct SmallMessage {
id: usize,
has_extra: bool,
}
struct LargeExtraField {
data: [[f64; 4]; 4],
}
let mut messages = HarrenVec::new();
messages.push(SmallMessage { id: 0, has_extra: false });
messages.push(SmallMessage { id: 1, has_extra: true });
messages.push(LargeExtraField { data: [[0.; 4]; 4] });
messages.push(SmallMessage { id: 2, has_extra: false });
let mut iter = messages.into_iter();
while let Some(message) = iter.next::<SmallMessage>() {
println!("id = {}", message.id);
if message.has_extra {
let extra = iter.next::<LargeExtraField>().unwrap();
println!("extra data = {:?}", extra.data);
}
}
// Output:
// id = 0
// id = 1
// extra data = [[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]
// id = 2
Macros§
- Creates a
HarrenVec
containing the arguments.
Structs§
- A
Vec
-like data structure that can store items of different types and sizes from each other.
Type Aliases§
- Type alias for
HarrenVec
.