| // Copyright 2021 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| use std::cmp::{max, min}; |
| use std::ops::Range; |
| |
| /// Provides convenience methods for [`Range`]. |
| pub trait RangeExt { |
| /// Returns the intersection of self and rhs. If there is no intersection, the result will |
| /// return true for .is_empty(). |
| fn intersect(&self, rhs: &Self) -> Self; |
| } |
| |
| impl<K: Ord + Copy> RangeExt for Range<K> { |
| fn intersect(&self, rhs: &Self) -> Self { |
| max(self.start, rhs.start)..min(self.end, rhs.end) |
| } |
| } |
| |
| #[cfg(test)] |
| mod tests { |
| use super::*; |
| |
| #[::fuchsia::test] |
| fn no_intersection() { |
| let a = 1..3; |
| let b = 3..5; |
| assert!(a.intersect(&b).is_empty()); |
| assert!(b.intersect(&a).is_empty()); |
| } |
| |
| #[::fuchsia::test] |
| fn partial_intersection() { |
| let a = 1..3; |
| let b = 2..5; |
| assert_eq!(a.intersect(&b), (2..3)); |
| assert_eq!(b.intersect(&a), (2..3)); |
| } |
| |
| #[::fuchsia::test] |
| fn full_intersection() { |
| let a = 1..4; |
| let b = 2..3; |
| assert_eq!(a.intersect(&b), (2..3)); |
| assert_eq!(b.intersect(&a), (2..3)); |
| |
| let c = 2..4; |
| assert_eq!(a.intersect(&c), (2..4)); |
| assert_eq!(c.intersect(&a), (2..4)); |
| |
| let d = 1..2; |
| assert_eq!(a.intersect(&d), (1..2)); |
| assert_eq!(d.intersect(&a), (1..2)); |
| |
| assert_eq!(a.intersect(&a), (1..4)); |
| } |
| } |