use crate::{num::CheapOrderedFloat, SegIdx};
#[derive(Clone, Debug, PartialEq)]
pub struct OutputEvent {
pub x0: f64,
pub connected_above: bool,
pub x1: f64,
pub connected_below: bool,
pub seg_idx: SegIdx,
pub sweep_idx: Option<usize>,
pub old_sweep_idx: Option<usize>,
}
impl Eq for OutputEvent {}
impl OutputEvent {
pub fn smaller_x(&self) -> f64 {
self.x0.min(self.x1)
}
pub fn larger_x(&self) -> f64 {
self.x0.max(self.x1)
}
pub(crate) fn new(
seg_idx: SegIdx,
x0: f64,
connected_above: bool,
x1: f64,
connected_below: bool,
sweep_idx: Option<usize>,
old_sweep_idx: Option<usize>,
) -> Self {
Self {
x0,
connected_above,
x1,
connected_below,
seg_idx,
sweep_idx,
old_sweep_idx,
}
}
pub fn connected_above_at(&self, x: f64) -> bool {
x == self.x0 && self.connected_above
}
pub fn connected_below_at(&self, x: f64) -> bool {
x == self.x1 && self.connected_below
}
}
impl Ord for OutputEvent {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
CheapOrderedFloat::from(self.smaller_x())
.cmp(&CheapOrderedFloat::from(other.smaller_x()))
.then_with(|| {
CheapOrderedFloat::from(self.larger_x())
.cmp(&CheapOrderedFloat::from(other.larger_x()))
})
}
}
impl PartialOrd for OutputEvent {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}