1use core::fmt::Display;
2
3use crate::TypeHash;
4
5use crate::{BinaryOperator, OperationReflect, UnaryOperator};
6
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9#[derive(Debug, Clone, TypeHash, PartialEq, Eq, Hash, OperationReflect)]
10#[operation(opcode_name = BitwiseOpCode, pure)]
11pub enum Bitwise {
12 #[operation(commutative)]
13 BitwiseAnd(BinaryOperator),
14 #[operation(commutative)]
15 BitwiseOr(BinaryOperator),
16 #[operation(commutative)]
17 BitwiseXor(BinaryOperator),
18 ShiftLeft(BinaryOperator),
19 ShiftRight(BinaryOperator),
20 CountOnes(UnaryOperator),
21 ReverseBits(UnaryOperator),
22 BitwiseNot(UnaryOperator),
23 LeadingZeros(UnaryOperator),
25 FindFirstSet(UnaryOperator),
27}
28
29impl Display for Bitwise {
30 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
31 match self {
32 Bitwise::BitwiseAnd(op) => write!(f, "{} & {}", op.lhs, op.rhs),
33 Bitwise::BitwiseOr(op) => write!(f, "{} | {}", op.lhs, op.rhs),
34 Bitwise::BitwiseXor(op) => write!(f, "{} ^ {}", op.lhs, op.rhs),
35 Bitwise::CountOnes(op) => write!(f, "{}.count_bits()", op.input),
36 Bitwise::ReverseBits(op) => write!(f, "{}.reverse_bits()", op.input),
37 Bitwise::ShiftLeft(op) => write!(f, "{} << {}", op.lhs, op.rhs),
38 Bitwise::ShiftRight(op) => write!(f, "{} >> {}", op.lhs, op.rhs),
39 Bitwise::BitwiseNot(op) => write!(f, "!{}", op.input),
40 Bitwise::LeadingZeros(op) => write!(f, "{}.leading_zeros()", op.input),
41 Bitwise::FindFirstSet(op) => write!(f, "{}.find_first_set()", op.input),
42 }
43 }
44}