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}