use crate::circuit::{ClassicalExpr, ClassicalValue, ClassicalVar};
use std::fmt;
#[derive(Debug, Clone, PartialEq)]
pub enum ClassicalDataOp {
Store {
target: ClassicalVar,
value: ClassicalExpr,
},
MeasureBit {
result: ClassicalValue,
},
MeasureBits {
result: ClassicalValue,
},
}
impl ClassicalDataOp {
pub const fn name(&self) -> &'static str {
match self {
Self::Store { .. } => "store",
Self::MeasureBit { .. } => "measure_bit",
Self::MeasureBits { .. } => "measure_bits",
}
}
pub fn target(&self) -> Option<ClassicalVar> {
match self {
Self::Store { target, .. } => Some(*target),
Self::MeasureBit { .. } | Self::MeasureBits { .. } => None,
}
}
pub fn result(&self) -> Option<ClassicalValue> {
match self {
Self::Store { .. } => None,
Self::MeasureBit { result } | Self::MeasureBits { result } => Some(*result),
}
}
pub fn value(&self) -> Option<&ClassicalExpr> {
match self {
Self::Store { value, .. } => Some(value),
Self::MeasureBit { .. } | Self::MeasureBits { .. } => None,
}
}
}
impl fmt::Display for ClassicalDataOp {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.name())
}
}