1use 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}