#[cfg(feature = "debug-tools")]
#[macro_export]
macro_rules! debug_assert_forall {
($xs:expr, $pred:expr) => {
#[cfg(debug_assertions)]
match $crate::quantifiers::basic::forall($xs, $pred) {
Ok(()) => {},
Err(e) => panic!("debug_assert_forall! failed: {}", e),
}
};
}
#[cfg(feature = "debug-tools")]
#[macro_export]
macro_rules! debug_forall {
($xs:expr, $pred:expr) => {
#[cfg(debug_assertions)]
{
let failed: Vec<_> = $xs.into_iter().filter(|x| !$pred(x)).collect();
if !failed.is_empty() {
println!(
"[debug_forall] {} element(s) failed: {:?}",
failed.len(),
failed
);
}
}
};
}
#[cfg(feature = "debug-tools")]
#[macro_export]
macro_rules! debug_assert_exists {
($xs:expr, $pred:expr) => {
#[cfg(debug_assertions)]
match $crate::quantifiers::basic::exists($xs, $pred) {
Ok(()) => {},
Err(e) => panic!("debug_assert_exists! failed: {}", e),
}
};
}
#[cfg(feature = "debug-tools")]
#[macro_export]
macro_rules! debug_exists {
($xs:expr, $pred:expr) => {
#[cfg(debug_assertions)]
if !$crate::quantifiers::basic::exists($xs, $pred).is_ok() {
println!("[debug_exists] no matching element found.");
}
};
}
#[cfg(feature = "debug-tools")]
#[macro_export]
macro_rules! debug_assert_exactly_n {
($iter:expr, $count:expr, $pred:expr) => {{
#[cfg(debug_assertions)]
match $crate::quantifiers::basic::exactly_n($iter, $count, $pred) {
Ok(()) => {},
Err(e) => panic!("assert_exactly_n! failed: {}", e),
}
}};
}
#[cfg(feature = "debug-tools")]
#[macro_export]
macro_rules! debug_exactly_n {
($xs:expr, $count:expr, $pred:expr) => {
#[cfg(debug_assertions)]
{
match $crate::quantifiers::basic::exactly_n($xs, $count, $pred) {
Ok(()) => {},
Err(e) => {println!("[debug_exactly_n] {}", e)},
}
}
};
}
#[cfg(feature = "debug-tools")]
#[macro_export]
macro_rules! debug_assert_none {
($xs:expr, $pred:expr) => {
#[cfg(debug_assertions)]
match $crate::quantifiers::basic::none($xs, $pred) {
Ok(()) => {},
Err(e) => panic!("debug_assert_none! failed: {}", e),
}
};
}
#[cfg(feature = "debug-tools")]
#[macro_export]
macro_rules! debug_none {
($xs:expr, $pred:expr) => {
#[cfg(debug_assertions)]
{
let matched: Vec<_> = $xs.into_iter().filter(|x| $pred(x)).collect();
if !matched.is_empty() {
println!(
"[debug_none] {} element(s) unexpectedly matched: {:?}",
matched.len(),
matched
);
}
}
};
}
#[cfg(feature = "debug-tools")]
#[macro_export]
macro_rules! debug_assert_duplicates {
($xs:expr) => {
#[cfg(debug_assertions)]
{
let candidates = $crate::quantifiers::selection::select_duplicates($xs);
if candidates.is_empty() {
panic!("debug_assert_duplicates! failed: {:#?}", candidates)
}
}
};
}
#[cfg(feature = "debug-tools")]
#[macro_export]
macro_rules! debug_duplicates {
($xs:expr) => {
#[cfg(debug_assertions)]
{
use std::collections::HashSet;
let mut seen = HashSet::new();
let mut dups = HashSet::new();
for x in $xs {
if !seen.insert(x) {
dups.insert(x);
}
}
if !dups.is_empty() {
println!("[debug_duplicates] found duplicates: {:?}", dups);
}
}
};
}
#[cfg(feature = "debug-tools")]
#[macro_export]
macro_rules! debug_assert_unique {
($xs:expr) => {
#[cfg(debug_assertions)]
{
let candidates = $crate::quantifiers::selection::select_duplicates($xs);
if !candidates.is_empty() {
panic!("debug_assert_unique! failed: {:#?}", candidates)
}
}
};
}
#[cfg(feature = "debug-tools")]
#[macro_export]
macro_rules! debug_unique {
($xs:expr) => {
#[cfg(debug_assertions)]
{
use std::collections::HashSet;
let mut seen = HashSet::new();
let mut repeated = Vec::new();
for x in $xs {
if !seen.insert(x) {
repeated.push(x);
}
}
if !repeated.is_empty() {
println!(
"[debug_unique] violated: found duplicate(s): {:?}",
repeated
);
}
}
};
}
#[cfg(feature = "debug-tools")]
#[macro_export]
macro_rules! debug_assert_pairwise {
($xs:expr, $pred:expr) => {
#[cfg(debug_assertions)]
match $crate::quantifiers::structured::pairwise($xs, $pred) {
Ok(()) => {},
Err(e) => panic!("debug_assert_pairwise! failed: {}", e),
}
};
}
#[cfg(feature = "debug-tools")]
#[macro_export]
macro_rules! debug_pairwise {
($xs:expr, $pred:expr) => {
#[cfg(debug_assertions)]
{
let mut failed = Vec::new();
let mut iter = $xs.into_iter();
if let Some(mut prev) = iter.next() {
for curr in iter {
if !$pred(prev, curr) {
failed.push((prev, curr));
}
prev = curr;
}
}
if !failed.is_empty() {
println!(
"[debug_pairwise] {} pair(s) failed: {:?}",
failed.len(),
failed
);
}
}
};
}