summaryrefslogtreecommitdiffstats
path: root/vendor/proptest/src/macros.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/proptest/src/macros.rs')
-rw-r--r--vendor/proptest/src/macros.rs93
1 files changed, 93 insertions, 0 deletions
diff --git a/vendor/proptest/src/macros.rs b/vendor/proptest/src/macros.rs
new file mode 100644
index 000000000..c76989eb6
--- /dev/null
+++ b/vendor/proptest/src/macros.rs
@@ -0,0 +1,93 @@
+//-
+// 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,
+ }
+ };
+}