use crate::planner::TransformationArgument;
use crate::parser::ConstType;
use std::fmt;
use std::sync::Arc;
#[derive(Debug, Hash, Clone, PartialEq, Eq)]
pub(crate) struct Constraints {
constant_eq_constraints: Arc<Vec<(TransformationArgument, ConstType)>>,
variable_eq_constraints: Arc<Vec<(TransformationArgument, TransformationArgument)>>,
}
impl Constraints {
pub(crate) fn new(
constant_eq_constraints: Vec<(TransformationArgument, ConstType)>,
variable_eq_constraints: Vec<(TransformationArgument, TransformationArgument)>,
) -> Self {
Self {
constant_eq_constraints: Arc::new(constant_eq_constraints),
variable_eq_constraints: Arc::new(variable_eq_constraints),
}
}
pub(crate) fn constant_eq_constraints(&self) -> &Arc<Vec<(TransformationArgument, ConstType)>> {
&self.constant_eq_constraints
}
pub(crate) fn variable_eq_constraints(
&self,
) -> &Arc<Vec<(TransformationArgument, TransformationArgument)>> {
&self.variable_eq_constraints
}
pub(crate) fn is_empty(&self) -> bool {
self.constant_eq_constraints.is_empty() && self.variable_eq_constraints.is_empty()
}
}
impl fmt::Display for Constraints {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut constraints = Vec::new();
for (arg, constant) in self.constant_eq_constraints.iter() {
constraints.push(format!("{} = {}", arg, constant));
}
for (left_arg, right_arg) in self.variable_eq_constraints.iter() {
constraints.push(format!("{} = {}", left_arg, right_arg));
}
write!(f, "{}", constraints.join(", "))
}
}