poulpy/base2k/src/lib.rs
base2k/src/lib.rsRaw
1#[allow(
2 non_camel_case_types,
3 non_snake_case,
4 non_upper_case_globals,
5 dead_code,
6 improper_ctypes
7)]
8pub mod ffi;
9
10pub mod module;
11#[allow(unused_imports)]
12pub use module::*;
13
14pub mod vec_znx;
15#[allow(unused_imports)]
16pub use vec_znx::*;
17
18pub mod vec_znx_big;
19#[allow(unused_imports)]
20pub use vec_znx_big::*;
21
22pub mod vec_znx_dft;
23#[allow(unused_imports)]
24pub use vec_znx_dft::*;
25
26pub mod svp;
27#[allow(unused_imports)]
28pub use svp::*;
29
30pub mod vmp;
31#[allow(unused_imports)]
32pub use vmp::*;
33
34pub mod sampling;
35#[allow(unused_imports)]
36pub use sampling::*;
37
38pub mod encoding;
39#[allow(unused_imports)]
40pub use encoding::*;
41
42pub mod infos;
43#[allow(unused_imports)]
44pub use infos::*;
45
46pub mod free;
47#[allow(unused_imports)]
48pub use free::*;
49
50pub const GALOISGENERATOR: u64 = 5;
51
52#[allow(dead_code)]
53pub fn cast_mut_u64_to_mut_u8_slice(data: &mut [u64]) -> &mut [u8] {
54 let ptr: *mut u8 = data.as_mut_ptr() as *mut u8;
55 let len: usize = data.len() * std::mem::size_of::<u64>();
56 unsafe { std::slice::from_raw_parts_mut(ptr, len) }
57}
58
59pub fn cast_mut_u8_to_mut_i64_slice(data: &mut [u8]) -> &mut [i64] {
60 let ptr: *mut i64 = data.as_mut_ptr() as *mut i64;
61 let len: usize = data.len() / std::mem::size_of::<i64>();
62 unsafe { std::slice::from_raw_parts_mut(ptr, len) }
63}
64
65pub fn cast_mut_u8_to_mut_f64_slice(data: &mut [u8]) -> &mut [f64] {
66 let ptr: *mut f64 = data.as_mut_ptr() as *mut f64;
67 let len: usize = data.len() / std::mem::size_of::<f64>();
68 unsafe { std::slice::from_raw_parts_mut(ptr, len) }
69}
70
71pub fn cast_u8_to_f64_slice(data: &mut [u8]) -> &[f64] {
72 let ptr: *const f64 = data.as_mut_ptr() as *const f64;
73 let len: usize = data.len() / std::mem::size_of::<f64>();
74 unsafe { std::slice::from_raw_parts(ptr, len) }
75}
76
77use std::alloc::{alloc, Layout};
78
79pub fn alloc_aligned_u8(size: usize, align: usize) -> Vec<u8> {
80 assert_eq!(
81 align & (align - 1),
82 0,
83 "align={} must be a power of two",
84 align
85 );
86 assert_eq!(
87 (size * std::mem::size_of::<u8>()) % align,
88 0,
89 "size={} must be a multiple of align={}",
90 size,
91 align
92 );
93 unsafe {
94 let layout: Layout = Layout::from_size_align(size, align).expect("Invalid alignment");
95 let ptr: *mut u8 = alloc(layout);
96 if ptr.is_null() {
97 panic!("Memory allocation failed");
98 }
99 Vec::from_raw_parts(ptr, size, size)
100 }
101}
102
103pub fn alloc_aligned<T>(size: usize, align: usize) -> Vec<T> {
104 assert_eq!(
105 (size * std::mem::size_of::<T>()) % align,
106 0,
107 "size={} must be a multiple of align={}",
108 size,
109 align
110 );
111 let mut vec_u8: Vec<u8> = alloc_aligned_u8(std::mem::size_of::<T>() * size, align);
112 let ptr: *mut T = vec_u8.as_mut_ptr() as *mut T;
113 let len: usize = vec_u8.len() / std::mem::size_of::<T>();
114 let cap: usize = vec_u8.capacity() / std::mem::size_of::<T>();
115 std::mem::forget(vec_u8);
116 unsafe { Vec::from_raw_parts(ptr, len, cap) }
117}
118
119fn alias_mut_slice_to_vec<T>(slice: &mut [T]) -> Vec<T> {
120 let ptr = slice.as_mut_ptr();
121 let len = slice.len();
122 unsafe { Vec::from_raw_parts(ptr, len, len) }
123}