space_partitioning/interval_tree/interval.rs
1//! `Interval<T>` for capturing intervals.
2pub use crate::interval_tree::interval_type::IntervalType;
3use std::fmt::{Debug, Display, Formatter};
4use std::ops::RangeInclusive;
5
6/// Structure to represent an interval.
7#[derive(Default, Eq, PartialEq, Ord, PartialOrd, Copy, Clone)]
8pub struct Interval<T>
9where
10 T: IntervalType,
11{
12 pub start: T,
13 pub end: T,
14}
15
16impl<T> Interval<T>
17where
18 T: IntervalType,
19{
20 /// Constructs a new interval.
21 ///
22 /// # Example
23 /// ```rust
24 /// use space_partitioning::interval_tree::Interval;
25 /// let interval = Interval::new(-2.0, 10.0);
26 /// assert_eq!(interval.start, -2.0);
27 /// assert_eq!(interval.end, 10.0);
28 /// ```
29 pub fn new(low: T, high: T) -> Self {
30 Self {
31 start: low,
32 end: high,
33 }
34 }
35
36 /// Checks whether the current interval overlaps with another one.
37 ///
38 /// # Example
39 /// ```rust
40 /// use space_partitioning::interval_tree::Interval;
41 /// let interval = Interval::from(-2.0..=10.0);
42 /// assert!(interval.overlaps_with(&(0.0..=2.0).into()));
43 /// assert!(!interval.overlaps_with(&(20.0..=30.0).into()));
44 /// ```
45 pub fn overlaps_with(&self, other: &Interval<T>) -> bool {
46 (self.start <= other.end) && (other.start <= self.end)
47 }
48}
49
50impl<T> Debug for Interval<T>
51where
52 T: Debug + IntervalType,
53{
54 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
55 write!(f, "[{:?}, {:?}]", self.start, self.end)
56 }
57}
58
59impl<T> Display for Interval<T>
60where
61 T: Display + IntervalType,
62{
63 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
64 write!(f, "[{}, {}]", self.start, self.end)
65 }
66}
67
68impl<T> From<(T, T)> for Interval<T>
69where
70 T: IntervalType,
71{
72 /// Constructs an interval from a tuple.
73 ///
74 /// # Example
75 /// ```rust
76 /// use space_partitioning::interval_tree::Interval;
77 /// let interval: Interval<_> = (-2.0, 10.0).into();
78 /// assert_eq!(interval.start, -2.0);
79 /// assert_eq!(interval.end, 10.0);
80 /// assert_eq!(interval, Interval::from((-2.0, 10.0)));
81 /// ```
82 fn from(interval: (T, T)) -> Self {
83 Self {
84 start: interval.0,
85 end: interval.1,
86 }
87 }
88}
89
90impl<T> From<std::ops::RangeInclusive<T>> for Interval<T>
91where
92 T: IntervalType,
93{
94 /// Constructs an interval from a `RangeInclusive<T>``.
95 ///
96 /// # Example
97 /// ```rust
98 /// use space_partitioning::interval_tree::Interval;
99 /// let interval: Interval<_> = (-2.0..=10.0).into();
100 /// assert_eq!(interval.start, -2.0);
101 /// assert_eq!(interval.end, 10.0);
102 /// assert_eq!(interval, Interval::from(-2.0..=10.0));
103 /// ```
104 fn from(range: RangeInclusive<T>) -> Self {
105 Self {
106 start: range.start().clone(),
107 end: range.end().clone(),
108 }
109 }
110}
111
112impl<T> From<&std::ops::RangeInclusive<T>> for Interval<T>
113where
114 T: IntervalType,
115{
116 /// Constructs an interval from a `&RangeInclusive<T>``.
117 ///
118 /// # Example
119 /// ```rust
120 /// use space_partitioning::interval_tree::Interval;
121 /// let range = -2.0..=10.0;
122 /// let interval: Interval<_> = (&range).into();
123 /// assert_eq!(interval.start, -2.0);
124 /// assert_eq!(interval.end, 10.0);
125 /// ```
126 fn from(range: &RangeInclusive<T>) -> Self {
127 Self {
128 start: range.start().clone(),
129 end: range.end().clone(),
130 }
131 }
132}