use std::ops::{BitAnd, BitOr, BitXor};
use crate::bit_block::BitBlock;
pub trait BitSetOp: Default + Copy + 'static{
const TRUSTED_HIERARCHY: bool;
const HIERARCHY_OPERANDS_CONTAIN_RESULT: bool;
fn hierarchy_op<T: BitBlock>(left: T, right: T) -> T;
fn data_op<T: BitBlock>(left: T, right: T) -> T;
}
#[derive(Default, Copy, Clone)]
pub struct And;
impl BitSetOp for And {
const TRUSTED_HIERARCHY: bool = false;
const HIERARCHY_OPERANDS_CONTAIN_RESULT: bool = true;
#[inline]
fn hierarchy_op<T: BitBlock>(left: T, right: T) -> T {
BitAnd::bitand(left, right)
}
#[inline]
fn data_op<T: BitBlock>(left: T, right: T) -> T {
BitAnd::bitand(left, right)
}
}
#[derive(Default, Copy, Clone)]
pub struct Or;
impl BitSetOp for Or {
const TRUSTED_HIERARCHY: bool = true;
const HIERARCHY_OPERANDS_CONTAIN_RESULT: bool = false;
#[inline]
fn hierarchy_op<T: BitBlock>(left: T, right: T) -> T {
BitOr::bitor(left, right)
}
#[inline]
fn data_op<T: BitBlock>(left: T, right: T) -> T {
BitOr::bitor(left, right)
}
}
#[derive(Default, Copy, Clone)]
pub struct Xor;
impl BitSetOp for Xor {
const TRUSTED_HIERARCHY: bool = false;
const HIERARCHY_OPERANDS_CONTAIN_RESULT: bool = false;
#[inline]
fn hierarchy_op<T: BitBlock>(left: T, right: T) -> T {
BitOr::bitor(left, right)
}
#[inline]
fn data_op<T: BitBlock>(left: T, right: T) -> T {
BitXor::bitxor(left, right)
}
}
#[derive(Default, Copy, Clone)]
pub struct Sub;
impl BitSetOp for Sub {
const TRUSTED_HIERARCHY: bool = false;
const HIERARCHY_OPERANDS_CONTAIN_RESULT: bool = false;
#[inline]
fn hierarchy_op<T: BitBlock>(left: T, _right: T) -> T {
left
}
#[inline]
fn data_op<T: BitBlock>(left: T, right: T) -> T {
left & (left ^ right)
}
}