llvm_quick 181.0.0-alpha.7

Rust's wrapper for llvm.
Documentation
use std::mem::MaybeUninit;

use llvm_sys::blake3::*;

#[repr(transparent)]
pub struct Blake3Hasher {
    inner: llvm_blake3_hasher,
}

impl Blake3Hasher {
    pub fn init() -> Self {
        unsafe {
            let mut inner = MaybeUninit::uninit();
            llvm_blake3_hasher_init(inner.as_mut_ptr() as _);
            let inner = inner.assume_init();
            Self { inner }
        }
    }

    pub fn init_keyed(&mut self, key: [u8; LLVM_BLAKE3_KEY_LEN]) {
        unsafe { llvm_blake3_hasher_init_keyed(&mut self.inner, key.as_ptr()) }
    }

    pub fn init_derive_keyed(&mut self, key: &[u8]) {
        unsafe {
            llvm_blake3_hasher_init_derive_key_raw(&mut self.inner, key.as_ptr() as _, key.len());
        }
    }

    pub fn update(&mut self, input: &[u8]) {
        unsafe { llvm_blake3_hasher_update(&mut self.inner, input.as_ptr() as _, input.len()) }
    }

    pub fn finalize(&mut self, out: &[u8]) {
        unsafe { llvm_blake3_hasher_finalize(&mut self.inner, out.as_ptr() as _, out.len()) }
    }

    pub fn finalize_seek(&mut self, seek: u64, out: &[u8]) {
        unsafe {
            llvm_blake3_hasher_finalize_seek(&mut self.inner, seek, out.as_ptr() as _, out.len());
        }
    }

    pub fn reset(&mut self) {
        unsafe { llvm_blake3_hasher_reset(&mut self.inner) }
    }
}