soak 0.2.0

Transform a struct into arrays of its fields.
Documentation
use core::{ptr, slice};
use dioptre::Fields;
use soak::{Columns, RawTable};

#[derive(Copy, Clone, Fields, Columns)]
#[allow(dead_code)]
struct Data {
    x: u8,
    y: u32,
    z: u64,
}

#[test]
fn layout() {
    let mut table: RawTable<Data> = RawTable::with_capacity(64);

    unsafe {
        let x = table.ptr(Data::x);
        let y = table.ptr(Data::y);
        let z = table.ptr(Data::z);
        assert_eq!(x as usize & (1 - 1), 0);
        assert_eq!(y as usize & (4 - 1), 0);
        assert_eq!(z as usize & (8 - 1), 0);
        for i in 0..64 {
            ptr::write(x.offset(i as isize), i as u8);
            ptr::write(y.offset(i as isize), 64 + i as u32);
            ptr::write(z.offset(i as isize), 128 + i as u64);
        }
    }

    table.reserve_exact(64, 64);

    unsafe {
        let x = slice::from_raw_parts(table.ptr(Data::x), 64);
        let y = slice::from_raw_parts(table.ptr(Data::y), 64);
        let z = slice::from_raw_parts(table.ptr(Data::z), 64);
        let iter = Iterator::zip(Iterator::zip(x.iter(), y.iter()), z.iter()).enumerate();
        for (i, ((&x, &y), &z)) in iter {
            assert_eq!(x as usize, i);
            assert_eq!(y as usize, 64 + i);
            assert_eq!(z as usize, 128 + i);
        }
    }
}