blob: 19a9ead3ee3b62988e5c9505828d4a321e441a22 [file] [log] [blame]
// 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));
}
}