domino_lib/lps/validate/model/
helpers.rsuse std::cmp::Ordering;
use super::variables::Variable;
pub fn sorting_label(label1: &String, label2: &String) -> Ordering {
let parse_label = |label: &String| {
let (tile_index, position) = (
label[1..2].parse::<usize>().unwrap(),
label[2..3].parse::<usize>().unwrap(),
);
(tile_index, position)
};
let (l1tileindex, l1position) = parse_label(label1);
let (l2tileindex, l2position) = parse_label(label2);
match l1tileindex.cmp(&l2tileindex) {
Ordering::Equal => l1position.cmp(&l2position),
other => other,
}
}
#[macro_export]
macro_rules! stringify_variables {
($labels:expr, $separator:expr) => {
stringify_variables!($labels, $separator, Option::<usize>::None)
};
($labels:expr, $separator:expr, $line_length:expr) => {{
let mut result = String::new();
let newline_each: usize = $line_length.unwrap_or($labels.len()); for (i, label) in $labels.iter().enumerate() {
result.push_str(label);
if i < $labels.len() - 1 {
result.push_str($separator);
}
if (i + 1) % newline_each == 0 && i < $labels.len() - 1 {
result.push('\n');
}
}
result
}};
}
pub fn collect_labels(variables: &[Variable]) -> Vec<String> {
variables.iter().map(|var| var.label.clone()).collect()
}
pub fn create_bound_string(labels: Vec<String>) -> String {
format!("{} = 1", stringify_variables!(labels, " "))
}