Skip to main content

int_interval_set/int_co_set/
impls_for_predicates.rs

1use super::*;
2
3impl<I: IntCO> IntCOSet<I> {
4    /// Returns whether `x` is covered by any interval in the set.
5    ///
6    /// Complexity: `O(log n)`.
7    #[inline]
8    pub fn contains_point(&self, x: I::CoordType) -> bool {
9        let intervals = self.intervals.as_ref();
10        let i = intervals.partition_point(|iv| iv.start() <= x);
11
12        i != 0 && x < intervals[i - 1].end_excl()
13    }
14
15    /// Returns whether `query` is fully contained by one interval.
16    ///
17    /// Since the set is canonical, a contained query interval can only
18    /// be contained by the interval immediately preceding or starting
19    /// at `query.start()`.
20    ///
21    /// Complexity: `O(log n)`.
22    #[inline]
23    pub fn contains_interval(&self, query: I) -> bool {
24        let i = self
25            .intervals
26            .partition_point(|iv| iv.start() <= query.start());
27
28        i != 0 && self.intervals[i - 1].contains_interval(query)
29    }
30
31    /// Returns whether `query` intersects any interval in the set.
32    ///
33    /// Complexity: `O(log n)`.
34    #[inline]
35    pub fn intersects_interval(&self, query: I) -> bool {
36        let i = self
37            .intervals
38            .partition_point(|iv| iv.end_excl() <= query.start());
39
40        self.intervals.get(i).is_some_and(|iv| iv.intersects(query))
41    }
42}
43
44#[cfg(test)]
45mod tests;