| //- | 
 | // Copyright 2017, 2018 Jason Lingle | 
 | // | 
 | // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | 
 | // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | 
 | // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | 
 | // option. This file may not be copied, modified, or distributed | 
 | // except according to those terms. | 
 |  | 
 | //! Macros for internal use to reduce boilerplate. | 
 |  | 
 | // Pervasive internal sugar | 
 | macro_rules! mapfn { | 
 |     ($({#[$allmeta:meta]})* $(#[$meta:meta])* [$($vis:tt)*] | 
 |      fn $name:ident[$($gen:tt)*]($parm:ident: $input:ty) -> $output:ty { | 
 |          $($body:tt)* | 
 |      }) => { | 
 |         $(#[$allmeta])* $(#[$meta])* | 
 |         #[derive(Clone, Copy, Debug)] | 
 |         $($vis)* struct $name; | 
 |         $(#[$allmeta])* | 
 |         impl $($gen)* $crate::strategy::statics::MapFn<$input> for $name { | 
 |             type Output = $output; | 
 |             fn apply(&self, $parm: $input) -> $output { | 
 |                 $($body)* | 
 |             } | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | macro_rules! delegate_vt_0 { | 
 |     () => { | 
 |         fn current(&self) -> Self::Value { | 
 |             self.0.current() | 
 |         } | 
 |  | 
 |         fn simplify(&mut self) -> bool { | 
 |             self.0.simplify() | 
 |         } | 
 |  | 
 |         fn complicate(&mut self) -> bool { | 
 |             self.0.complicate() | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | macro_rules! opaque_strategy_wrapper { | 
 |     ($({#[$allmeta:meta]})* | 
 |      $(#[$smeta:meta])* | 
 |      pub struct $stratname:ident | 
 |      [$($sgen:tt)*][$($swhere:tt)*] | 
 |      ($innerstrat:ty) -> $stratvtty:ty; | 
 |  | 
 |      $(#[$vmeta:meta])* pub struct $vtname:ident | 
 |      [$($vgen:tt)*][$($vwhere:tt)*] | 
 |      ($innervt:ty) -> $actualty:ty; | 
 |     ) => { | 
 |         $(#[$allmeta])* | 
 |         $(#[$smeta])* | 
 |         #[must_use = "strategies do nothing unless used"] | 
 |         pub struct $stratname $($sgen)* ($innerstrat) | 
 |             $($swhere)*; | 
 |  | 
 |         $(#[$allmeta])* | 
 |         $(#[$vmeta])* pub struct $vtname $($vgen)* ($innervt) $($vwhere)*; | 
 |  | 
 |         $(#[$allmeta])* | 
 |         impl $($sgen)* Strategy for $stratname $($sgen)* $($swhere)* { | 
 |             type Tree = $stratvtty; | 
 |             type Value = $actualty; | 
 |             fn new_tree(&self, runner: &mut TestRunner) -> NewTree<Self> { | 
 |                 self.0.new_tree(runner).map($vtname) | 
 |             } | 
 |         } | 
 |  | 
 |         $(#[$allmeta])* | 
 |         impl $($vgen)* ValueTree for $vtname $($vgen)* $($vwhere)* { | 
 |             type Value = $actualty; | 
 |  | 
 |             delegate_vt_0!(); | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | // Example: unwrap_or!(result, err => handle_err(err)); | 
 | macro_rules! unwrap_or { | 
 |     ($unwrap: expr, $err: ident => $on_err: expr) => { | 
 |         match $unwrap { | 
 |             Ok(ok) => ok, | 
 |             Err($err) => $on_err, | 
 |         } | 
 |     }; | 
 | } |