soa_derive 0.12.0

Automatic Struct of Array generation
Documentation
use soa_derive::StructOfArray;

#[derive(Debug, Clone, PartialEq, StructOfArray)]
pub struct Point {
    x: f32,
    y: f32,
}

#[derive(Debug, Clone, PartialEq, StructOfArray)]
#[soa_derive(Debug, Clone, PartialEq)]
pub struct Color {
    pub r: u8,
    pub g: u8,
    pub b: u8,
    pub a: u8,
}

#[derive(Debug, Clone, PartialEq, StructOfArray)]
#[soa_derive(Debug, Clone, PartialEq)]
pub struct Particle {
    pub point: Point,
    #[nested_soa]
    pub color: Color,
    pub mass: f32,
}

#[test]
fn nested_soa() {
    let mut particle_vec = ParticleVec::new();
    particle_vec.push(Particle {
        point: Point { x: 1.0, y: 2.0 },
        color: Color { r: 255, g: 0, b: 0, a: 255 },
        mass: 1.0,
    });
    particle_vec.push(Particle {
        point: Point { x: 2.0, y: 3.0 },
        color: Color { r: 128, g: 255, b: 100, a: 23 },
        mass: 2.0,
    });
    assert_eq!(particle_vec.point[0], Point {
        x: 1.0, y: 2.0
    });
    assert_eq!(particle_vec.color.r[0], 255);
    assert_eq!(particle_vec.color.g[0], 0);
    assert_eq!(particle_vec.color.b[0], 0);
    assert_eq!(particle_vec.color.a[0], 255);
    assert_eq!(particle_vec.point[1], Point {
        x: 2.0, y: 3.0
    });
    assert_eq!(particle_vec.color.r[1], 128);
    assert_eq!(particle_vec.color.g[1], 255);
    assert_eq!(particle_vec.color.b[1], 100);
    assert_eq!(particle_vec.color.a[1], 23);
    assert_eq!(particle_vec.color, ColorVec {
        r: vec![255, 128],
        g: vec![0, 255],
        b: vec![0, 100],
        a: vec![255, 23],
    });
}