bullet_lib/
util.rs

1pub fn sigmoid(x: f32, k: f32) -> f32 {
2    1. / (1. + (-x * k).exp())
3}
4
5pub fn write_to_bin<T>(
6    item: &[T],
7    size: usize,
8    output_path: &str,
9    pad: bool,
10) -> std::io::Result<()> {
11    use std::io::Write;
12
13    let mut file = std::fs::File::create(output_path)?;
14
15    let size = std::mem::size_of::<T>() * size;
16
17    unsafe {
18        let slice_ptr: *const u8 = item.as_ptr().cast();
19        let slice = std::slice::from_raw_parts(slice_ptr, size);
20        file.write_all(slice)?;
21    }
22
23    if pad {
24        let padding = vec![0u8; (64 - size % 64) % 64];
25        file.write_all(&padding)?;
26    }
27
28    Ok(())
29}
30
31pub fn boxed_and_zeroed<T>() -> Box<T> {
32    unsafe {
33        let layout = std::alloc::Layout::new::<T>();
34        let ptr = std::alloc::alloc_zeroed(layout);
35        if ptr.is_null() {
36            std::alloc::handle_alloc_error(layout);
37        }
38        Box::from_raw(ptr.cast())
39    }
40}
41
42pub fn to_slice_with_lifetime<T, U>(slice: &[T]) -> &[U] {
43    let src_size = std::mem::size_of_val(slice);
44    let tgt_size = std::mem::size_of::<U>();
45
46    assert!(
47        src_size % tgt_size == 0,
48        "Target type size does not divide slice size!"
49    );
50
51    let len = src_size / tgt_size;
52    unsafe { std::slice::from_raw_parts(slice.as_ptr().cast(), len) }
53}
54
55pub fn to_slice_with_lifetime_mut<T, U>(slice: &mut [T]) -> &mut [U] {
56    let src_size = std::mem::size_of_val(slice);
57    let tgt_size = std::mem::size_of::<U>();
58
59    assert!(
60        src_size % tgt_size == 0,
61        "Target type size does not divide slice size!"
62    );
63
64    let len = src_size / tgt_size;
65    unsafe { std::slice::from_raw_parts_mut(slice.as_mut_ptr().cast(), len) }
66}