cryprot_core/
utils.rs

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