Macro qip::wrap_fn [−][src]
macro_rules! wrap_fn {
(@ names() <- $name : ident) => { ... };
(@ names($($body : tt) *) <- $name : ident) => { ... };
(@ names($($body : tt) *) <- $name : ident, $($tail : tt) *) => { ... };
(@ invoke($func : expr, $builder : expr) ($($body : tt) *) <- $name : ident) => { ... };
(@ invoke($func : expr, $builder : expr) ($($body : tt) *) <- $name : ident,
$($tail : tt) *) => { ... };
(@ unwrap_regs($func : expr, $rs : ident) $name : ident) => { ... };
(@ unwrap_regs($func : expr, $rs : ident) $name : ident, $($tail : tt) *) => { ... };
(@ result_body($builder : expr, $func : expr, $rs : ident, $arg : ident)
$($tail : tt) *) => { ... };
(@ raw_body($builder : expr, $func : expr, $rs : ident, $arg : ident)
$($tail : tt) *) => { ... };
(@ result_body($builder : expr, $func : expr, $rs : ident) $($tail : tt) *) => { ... };
(@ raw_body($builder : expr, $func : expr, $rs : ident) $($tail : tt) *) => { ... };
(pub $newfunc : ident [$($typetail : tt) *] ($arg : ident : $argtype : ident),
($func : expr), $($tail : tt) *) => { ... };
(pub $newfunc : ident [$($typetail : tt) *] ($arg : ident : $argtype : ident),
$func : expr, $($tail : tt) *) => { ... };
($newfunc : ident [$($typetail : tt) *] ($arg : ident : $argtype : ident),
($func : expr), $($tail : tt) *) => { ... };
($newfunc : ident [$($typetail : tt) *] ($arg : ident : $argtype : ident),
$func : expr, $($tail : tt) *) => { ... };
(pub $newfunc : ident($arg : ident : $argtype : ident), ($func : expr),
$($tail : tt) *) => { ... };
(pub $newfunc : ident($arg : ident : $argtype : ident), $func : expr,
$($tail : tt) *) => { ... };
($newfunc : ident($arg : ident : $argtype : ident), ($func : expr),
$($tail : tt) *) => { ... };
($newfunc : ident($arg : ident : $argtype : ident), $func : expr,
$($tail : tt) *) => { ... };
(pub $newfunc : ident, ($func : expr), $($tail : tt) *) => { ... };
(pub $newfunc : ident, $func : expr, $($tail : tt) *) => { ... };
($newfunc : ident, ($func : expr), $($tail : tt) *) => { ... };
($newfunc : ident, $func : expr, $($tail : tt) *) => { ... };
}
Expand description
Allows the wrapping of a function with signature:
Fn(&mut dyn UnitaryBuilder, Register, Register, ...) -> (Register, ...)
or
Fn(&mut dyn UnitaryBuilder, Register, Register, ...) -> Result<(Register, ...), CircuitError>
to make a new function with signature:
Fn(&mut dyn UnitaryBuilder, Vec<Register>) -> Result<Vec<Register>, CircuitError>
and is therefore compatible with program!
.
Example
use qip::*;
let n = 3;
let mut b = OpBuilder::new();
let ra = b.register(n)?;
let rb = b.register(n)?;
fn gamma(b: &mut dyn UnitaryBuilder, ra: Register, rb: Register) -> (Register, Register) {
let (ra, rb) = b.cnot(ra, rb);
(ra, rb)
}
wrap_fn!(wrapped_gamma, gamma, ra, rb);
// Gamma |ra>|rb[2]>
// Gamma |ra[0]>|rb>
let (ra, rb) = program!(&mut b, ra, rb;
wrapped_gamma ra, rb[2];
wrapped_gamma ra[0], rb;
)?;
let r = b.merge(vec![ra, rb])?;
Example with Result
use qip::*;
let n = 3;
let mut b = OpBuilder::new();
let ra = b.register(n)?;
let rb = b.register(n)?;
fn gamma(b: &mut dyn UnitaryBuilder, ra: Register, rb: Register) -> Result<(Register, Register), CircuitError> {
let (ra, rb) = b.cnot(ra, rb);
Ok((ra, rb))
}
wrap_fn!(wrapped_gamma, (gamma), ra, rb);
// Gamma |ra>|rb[2]>
// Gamma |ra[0]>|rb>
let (ra, rb) = program!(&mut b, ra, rb;
wrapped_gamma ra, rb[2];
wrapped_gamma ra[0], rb;
)?;
let r = b.merge(vec![ra, rb])?;
Example with UnitaryBuilder function
use qip::*;
let n = 3;
let mut b = OpBuilder::new();
let ra = b.register(n)?;
let rb = b.register(n)?;
wrap_fn!(cnot, UnitaryBuilder::cnot, ra, rb);
// cnot |ra>|rb[2]>
// cnot |ra[0]>|rb>
let (ra, rb) = program!(&mut b, ra, rb;
cnot ra, rb[2];
cnot ra[0], rb;
)?;
let r = b.merge(vec![ra, rb])?;