use qip::inverter::Invertable; use qip::prelude::*; #[cfg(feature = "macros")] use qip_macros::*; use std::num::NonZeroUsize; #[cfg(feature = "macros")] #[invert(gamma_inv)] fn gamma( b: &mut B, ra: B::Register, rb: B::Register, ) -> CircuitResult<(B::Register, B::Register)> where B: AdvancedCircuitBuilder + Invertable, { let (ra, rb) = b.toffoli(ra, rb)?; let (rb, ra) = b.toffoli(rb, ra)?; Ok((ra, rb)) } #[cfg(feature = "macros")] fn main() -> CircuitResult<()> { let n = NonZeroUsize::new(3).unwrap(); let mut b = LocalBuilder::default(); let ra = b.register(n); let rb = b.register(n); let (ra, rb) = program!(&mut b; ra, rb; gamma ra[0..2], ra[2]; gamma_inv ra[0..2], ra[2]; )?; let _r = b.merge_two_registers(ra, rb); Ok(()) } #[cfg(not(feature = "macros"))] fn main() { panic!("Macros not enabled.") }