cryprot_core/
utils.rs

1use std::ops::{BitAndAssign, BitXorAssign};
2
3pub fn xor_inplace<T: Copy + BitXorAssign>(a: &mut [T], b: &[T]) {
4    a.iter_mut().zip(b).for_each(|(a, b)| {
5        *a ^= *b;
6    });
7}
8
9pub fn and_inplace<T: Copy + BitAndAssign>(a: &mut [T], b: &[T]) {
10    a.iter_mut().zip(b).for_each(|(a, b)| {
11        *a &= *b;
12    });
13}
14
15pub fn xor_inplace_elem<T: Copy + BitXorAssign>(a: &mut [T], b: T) {
16    a.iter_mut().for_each(|a| {
17        *a ^= b;
18    });
19}
20
21pub fn and_inplace_elem<T: Copy + BitAndAssign>(a: &mut [T], b: T) {
22    a.iter_mut().for_each(|a| {
23        *a &= b;
24    });
25}
26
27pub fn log2_ceil(val: usize) -> usize {
28    let log2 = val.ilog2();
29    if val > (1 << log2) {
30        (log2 + 1) as usize
31    } else {
32        log2 as usize
33    }
34}