use crate::{Circuit, CircuitInstruction, CircuitRepeatBlock};
#[derive(Clone, PartialEq, Eq, Debug)]
pub enum CircuitInsertOperation {
Instruction(CircuitInstruction),
Circuit(Circuit),
RepeatBlock(CircuitRepeatBlock),
}
impl From<CircuitInstruction> for CircuitInsertOperation {
fn from(value: CircuitInstruction) -> Self {
Self::Instruction(value)
}
}
impl From<&CircuitInstruction> for CircuitInsertOperation {
fn from(value: &CircuitInstruction) -> Self {
Self::Instruction(value.clone())
}
}
impl From<Circuit> for CircuitInsertOperation {
fn from(value: Circuit) -> Self {
Self::Circuit(value)
}
}
impl From<&Circuit> for CircuitInsertOperation {
fn from(value: &Circuit) -> Self {
Self::Circuit(value.clone())
}
}
impl From<CircuitRepeatBlock> for CircuitInsertOperation {
fn from(value: CircuitRepeatBlock) -> Self {
Self::RepeatBlock(value)
}
}
impl From<&CircuitRepeatBlock> for CircuitInsertOperation {
fn from(value: &CircuitRepeatBlock) -> Self {
Self::RepeatBlock(value.clone())
}
}
#[cfg(test)]
mod tests {
use super::CircuitInsertOperation;
#[test]
fn borrowed_repeat_blocks_convert_into_insert_operations() {
let body: crate::Circuit = "H 0".parse().unwrap();
let block = crate::CircuitRepeatBlock::new(2, &body, "tag").unwrap();
assert!(matches!(
CircuitInsertOperation::from(&block),
CircuitInsertOperation::RepeatBlock(_)
));
}
}