use crate::interval::*;
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum Overlap {
BothEmpty,
FirstEmpty,
SecondEmpty,
Before,
Meets,
Overlaps,
Starts,
ContainedBy,
Finishes,
Equals,
FinishedBy,
Contains,
StartedBy,
OverlappedBy,
MetBy,
After,
}
impl Interval {
pub fn overlap(self, rhs: Self) -> Overlap {
use Overlap::*;
if self.is_empty() {
if rhs.is_empty() {
return BothEmpty;
} else {
return FirstEmpty;
}
}
if rhs.is_empty() {
return SecondEmpty;
}
let a = self.inf_raw();
let b = self.sup_raw();
let c = rhs.inf_raw();
let d = rhs.sup_raw();
#[allow(clippy::collapsible_else_if, clippy::collapsible_if)]
if b < d {
if a < c {
if b < c {
Before
} else if b == c {
Meets
} else {
Overlaps
}
} else {
if a == c {
Starts
} else {
ContainedBy
}
}
} else if b == d {
if a > c {
Finishes
} else if a == c {
Equals
} else {
FinishedBy
}
} else {
if a <= c {
if a < c {
Contains
} else {
StartedBy
}
} else {
if a < d {
OverlappedBy
} else if a == d {
MetBy
} else {
After
}
}
}
}
}
impl DecInterval {
pub fn overlap(self, rhs: Self) -> Option<Overlap> {
if self.is_nai() || rhs.is_nai() {
return None;
}
Some(self.x.overlap(rhs.x))
}
}
#[cfg(test)]
mod tests {
use crate::*;
use DecInterval as DI;
#[test]
fn nai() {
assert_eq!(DI::NAI.overlap(DI::PI), None);
assert_eq!(DI::PI.overlap(DI::NAI), None);
}
#[test]
fn pattern() {
use Overlap::*;
assert!(matches!(
const_interval!(1.0, 2.0).overlap(const_interval!(3.0, 4.0)),
BothEmpty | FirstEmpty | SecondEmpty | Before | After
))
}
}