| Crates.io | colvec |
| lib.rs | colvec |
| version | 0.0.3 |
| created_at | 2025-08-18 22:38:12.668679+00 |
| updated_at | 2025-08-23 02:17:25.505391+00 |
| description | Struct-of-arrays column vec like Zig's MultiArrayList |
| homepage | |
| repository | https://github.com/krakow10/colvec |
| max_upload_size | |
| id | 1801146 |
| size | 36,514 |
colvec provides a derive macro which generates a Vec-like data structure. Compared to Vec<Example>, ExampleColVec has a transposed row / column layout. This means you can take a slice across an entire column of a single struct field. ColVec has the same struct size (size_of::<Vec<T>>() = 24 bytes) and growth factor (2) as Vec, and uses a single contiguous allocation.
use colvec::ColVec;
#[derive(ColVec)]
struct Example{
field1:u8,
field2:Option<u8>,
field3:i16,
field4:u32,
}
let mut cols=ExampleColVec::new();
cols.push(Example{
field1:1,
field2:Some(2),
field3:3,
field4:4,
});
cols.push(Example{
field1:5,
field2:Some(6),
field3:7,
field4:8,
});
assert_eq!(&[1,5], cols.field1_slice());
assert_eq!(&[Some(2),Some(6)], cols.field2_slice());
assert_eq!(&[3,7], cols.field3_slice());
assert_eq!(&[4,8], cols.field4_slice());
To ensure proper alignment, the capacity is rounded up to a multiple of the item alignment. ↩