alkahest 0.3.0

Fantastic serialization library with zero-overhead serialization and zero-copy deserialization
Documentation
use std::{hint::black_box, mem::size_of};

use alkahest::*;
use rand::{distributions::Standard, prelude::Distribution, Rng};

#[derive(Clone, Copy)]
#[alkahest(Formula, Serialize, SerializeRef, Deserialize)]
pub struct Vector3 {
    pub x: f32,
    pub y: f32,
    pub z: f32,
}

impl Distribution<Vector3> for Standard {
    fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Vector3 {
        Vector3 {
            x: rng.gen(),
            y: rng.gen(),
            z: rng.gen(),
        }
    }
}

#[derive(Clone, Copy)]
#[alkahest(Formula, Serialize, SerializeRef, Deserialize)]
pub struct Triangle {
    pub v0: Vector3,
    pub v1: Vector3,
    pub v2: Vector3,
    pub normal: Vector3,
}

impl Distribution<Triangle> for Standard {
    fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Triangle {
        let v0 = rng.gen();
        let v1 = rng.gen();
        let v2 = rng.gen();
        let normal = rng.gen();

        Triangle { v0, v1, v2, normal }
    }
}

#[alkahest(Formula)]
pub struct MeshFormula {
    pub triangles: [Triangle],
}

#[derive(Clone)]
#[alkahest(Serialize<MeshFormula>, SerializeRef<MeshFormula>, Deserialize<'_, MeshFormula>)]
pub struct Mesh {
    pub triangles: Vec<Triangle>,
}

#[alkahest(Deserialize<'a, MeshFormula>)]
pub struct LazyMesh<'a> {
    pub triangles: Lazy<'a, [Triangle]>,
}

#[inline(always)]
fn do_serialize(mesh: &Mesh, buffer: &mut [u8]) -> usize {
    alkahest::write_packet_unchecked::<MeshFormula, _>(&mesh, buffer)
}

fn main() {
    const TRIG_COUNT: usize = 100_000;

    let mesh = Mesh {
        triangles: rand::thread_rng()
            .sample_iter(Standard)
            .take(TRIG_COUNT)
            .collect(),
    };

    let mut mesh = black_box(mesh);

    let mut buffer = Vec::new();
    buffer.resize(TRIG_COUNT * size_of::<Triangle>() + 32, 0);

    for _ in 0..10_000 {
        let size = do_serialize(&mesh, &mut buffer);
        black_box(&buffer[..size]);
        mesh = black_box(mesh);
    }
}