pub struct RangeSet<A> where
A: Array + Eq + Debug,
A::Item: Clone + Eq + Debug, { /* private fields */ }
Expand description
A set of primitive integers represented as a sorted list of disjoint, inclusive ranges.
let mut s = RangeSet::<[RangeInclusive <u32>; 1]>::from (0..=2);
println!("s: {:?}", s);
assert!(!s.spilled());
assert!(s.insert_range (8..=10).is_none());
println!("s: {:?}", s);
assert!(s.spilled());
let v : Vec <u32> = s.iter().collect();
assert_eq!(v, vec![0,1,2,8,9,10]);
assert_eq!(s.insert_range (3..=12), Some (RangeSet::from (8..=10)));
println!("s: {:?}", s);
assert!(s.spilled()); // once spilled, stays spilled
let v : Vec <u32> = s.iter().collect();
assert_eq!(v, vec![0,1,2,3,4,5,6,7,8,9,10,11,12]);
s.shrink_to_fit(); // manually un-spill
assert!(!s.spilled());
Implementations
sourceimpl<A, T> RangeSet<A> where
A: Array<Item = RangeInclusive<T>> + Eq + Debug,
T: PrimInt + Debug,
impl<A, T> RangeSet<A> where
A: Array<Item = RangeInclusive<T>> + Eq + Debug,
T: PrimInt + Debug,
sourcepub fn with_capacity(capacity: usize) -> Self
pub fn with_capacity(capacity: usize) -> Self
New empty range set with the internal smallvec initialized with the given initial capacity
sourcepub fn from_ranges(ranges: SmallVec<A>) -> Option<Self>
pub fn from_ranges(ranges: SmallVec<A>) -> Option<Self>
Returns a new range set if the given vector of ranges is valid
(valid_range_vec
)
sourcepub fn into_smallvec(self) -> SmallVec<A>
pub fn into_smallvec(self) -> SmallVec<A>
Converts into the internal smallvec
sourcepub fn insert(&mut self, element: T) -> bool
pub fn insert(&mut self, element: T) -> bool
Insert a single element, returning true if it was successfully inserted or else false if it was already present
let mut s = RangeSet::<[RangeInclusive <u32>; 2]>::new();
assert!(s.insert (4));
assert_eq!(s, RangeSet::from (4..=4));
assert!(!s.insert (4));
assert_eq!(s, RangeSet::from (4..=4));
assert!(s.insert (5));
assert_eq!(s, RangeSet::from (4..=5));
assert!(s.insert (3));
assert_eq!(s, RangeSet::from (3..=5));
assert!(s.insert (10));
assert_eq!(s, RangeSet::from_ranges (vec![3..=5, 10..=10].into()).unwrap());
sourcepub fn remove(&mut self, element: T) -> bool
pub fn remove(&mut self, element: T) -> bool
Remove a single element, returning true if it was successfully removed or else false if it was not present
let mut s = RangeSet::<[RangeInclusive <u32>; 2]>::from (0..=5);
assert!(s.remove (1));
assert_eq!(s, RangeSet::from_ranges (vec![0..=0, 2..=5].into()).unwrap());
assert!(!s.remove (1));
assert_eq!(s, RangeSet::from_ranges (vec![0..=0, 2..=5].into()).unwrap());
assert!(s.remove (4));
assert_eq!(s, RangeSet::from_ranges (vec![0..=0, 2..=3, 5..=5].into()).unwrap());
assert!(s.remove (3));
assert_eq!(s, RangeSet::from_ranges (vec![0..=0, 2..=2, 5..=5].into()).unwrap());
assert!(s.remove (2));
assert_eq!(s, RangeSet::from_ranges (vec![0..=0, 5..=5].into()).unwrap());
assert!(s.remove (0));
assert_eq!(s, RangeSet::from (5..=5));
assert!(s.remove (5));
assert!(s.is_empty());
sourcepub fn insert_range(&mut self, range: A::Item) -> Option<Self>
pub fn insert_range(&mut self, range: A::Item) -> Option<Self>
Returns the intersected values if the range is not disjoint with the curret range set.
let mut s = RangeSet::<[RangeInclusive <u32>; 2]>::from (0..=5);
assert_eq!(s.insert_range ( 3..=10), Some (RangeSet::from (3..=5)));
assert_eq!(s.insert_range (20..=30), None);
sourcepub fn remove_range(&mut self, range: A::Item) -> Option<Self>
pub fn remove_range(&mut self, range: A::Item) -> Option<Self>
Removes and returns the intersected elements, if there were any.
let mut s = RangeSet::<[RangeInclusive <u32>; 2]>::from (0..=5);
assert_eq!(s.remove_range (3..=3), Some (RangeSet::from (3..=3)));
assert_eq!(s, RangeSet::from_ranges (vec![0..=2, 4..=5].into()).unwrap());
assert_eq!(s.remove_range (0..=10), Some (
RangeSet::from_ranges (vec![0..=2, 4..=5].into()).unwrap()));
assert!(s.is_empty());
pub fn iter(&self) -> Iter<'_, A, T>ⓘNotable traits for Iter<'a, A, T>impl<'a, A, T> Iterator for Iter<'a, A, T> where
A: Array<Item = RangeInclusive<T>> + Eq + Debug,
T: PrimInt + Debug,
RangeInclusive<T>: Clone + Iterator<Item = T>, type Item = T;
A: Array<Item = RangeInclusive<T>> + Eq + Debug,
T: PrimInt + Debug,
RangeInclusive<T>: Clone + Iterator<Item = T>, type Item = T;
sourcepub fn valid_range_vec(ranges: &SmallVec<A>) -> bool
pub fn valid_range_vec(ranges: &SmallVec<A>) -> bool
Tests a raw smallvec of ranges for validity as a range set: the element ranges must be properly disjoint (not adjacent) and sorted.
let mut v = SmallVec::<[RangeInclusive <u32>; 2]>::new();
assert!(RangeSet::valid_range_vec (&v));
v.push (0..=3);
assert!(RangeSet::valid_range_vec (&v));
v.push (6..=10);
assert!(RangeSet::valid_range_vec (&v));
v.push (0..=1);
assert!(!RangeSet::valid_range_vec (&v));
sourcepub fn shrink_to_fit(&mut self)
pub fn shrink_to_fit(&mut self)
Calls shrink_to_fit
on the underlying smallvec
Trait Implementations
sourceimpl<A, T> AsRef<SmallVec<A>> for RangeSet<A> where
A: Array<Item = RangeInclusive<T>> + Eq + Debug,
T: PrimInt + Debug,
impl<A, T> AsRef<SmallVec<A>> for RangeSet<A> where
A: Array<Item = RangeInclusive<T>> + Eq + Debug,
T: PrimInt + Debug,
sourceimpl<A: Clone> Clone for RangeSet<A> where
A: Array + Eq + Debug,
A::Item: Clone + Eq + Debug,
impl<A: Clone> Clone for RangeSet<A> where
A: Array + Eq + Debug,
A::Item: Clone + Eq + Debug,
sourceimpl<A: Debug> Debug for RangeSet<A> where
A: Array + Eq + Debug,
A::Item: Clone + Eq + Debug,
impl<A: Debug> Debug for RangeSet<A> where
A: Array + Eq + Debug,
A::Item: Clone + Eq + Debug,
sourceimpl<A, T> From<RangeInclusive<T>> for RangeSet<A> where
A: Array<Item = RangeInclusive<T>> + Eq + Debug,
T: PrimInt + Debug,
impl<A, T> From<RangeInclusive<T>> for RangeSet<A> where
A: Array<Item = RangeInclusive<T>> + Eq + Debug,
T: PrimInt + Debug,
sourcefn from(range: RangeInclusive<T>) -> Self
fn from(range: RangeInclusive<T>) -> Self
Converts to this type from the input type.
sourceimpl<A: PartialEq> PartialEq<RangeSet<A>> for RangeSet<A> where
A: Array + Eq + Debug,
A::Item: Clone + Eq + Debug,
impl<A: PartialEq> PartialEq<RangeSet<A>> for RangeSet<A> where
A: Array + Eq + Debug,
A::Item: Clone + Eq + Debug,
impl<A: Eq> Eq for RangeSet<A> where
A: Array + Eq + Debug,
A::Item: Clone + Eq + Debug,
impl<A> StructuralEq for RangeSet<A> where
A: Array + Eq + Debug,
A::Item: Clone + Eq + Debug,
impl<A> StructuralPartialEq for RangeSet<A> where
A: Array + Eq + Debug,
A::Item: Clone + Eq + Debug,
Auto Trait Implementations
impl<A> RefUnwindSafe for RangeSet<A> where
A: RefUnwindSafe,
<A as Array>::Item: RefUnwindSafe,
impl<A> Send for RangeSet<A> where
<A as Array>::Item: Send,
impl<A> Sync for RangeSet<A> where
A: Sync,
impl<A> Unpin for RangeSet<A> where
A: Unpin,
impl<A> UnwindSafe for RangeSet<A> where
A: UnwindSafe,
<A as Array>::Item: RefUnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
sourceimpl<T> ToOwned for T where
T: Clone,
impl<T> ToOwned for T where
T: Clone,
type Owned = T
type Owned = T
The resulting type after obtaining ownership.
sourcefn clone_into(&self, target: &mut T)
fn clone_into(&self, target: &mut T)
toowned_clone_into
)Uses borrowed data to replace owned data, usually by cloning. Read more