use core::fmt::{self, Debug};
use crate::{
map::{Key, MaybeMap},
Bound::{self, *},
RangeBounds, Segment, SegmentMap,
};
pub mod iterators;
pub mod ops;
#[cfg(test)]
mod tests;
#[derive(Clone)]
pub struct SegmentSet<T> {
pub(crate) map: SegmentMap<T, ()>,
}
impl<T> SegmentSet<T> {
pub fn new() -> Self
where
T: Ord,
{
SegmentSet {
map: SegmentMap::new(),
}
}
pub fn full() -> Self
where
T: Ord,
{
let mut set = Self::new();
set.map
.map
.insert(Key(Segment::new(Unbounded, Unbounded)), ());
set
}
pub fn clear(&mut self) {
self.map.clear()
}
pub fn contains(&self, value: &T) -> bool
where
T: Clone + Ord,
{
self.map.contains(value)
}
pub fn get_range_for(&self, value: &T) -> Option<&Segment<T>>
where
T: Clone + Ord,
{
self.map.get_range_value(value).map(|(range, _)| range)
}
pub fn insert<R>(&mut self, range: R)
where
R: RangeBounds<T>,
T: Clone + Ord,
{
self.map.set(range, ())
}
pub fn remove<R>(&mut self, range: R) -> bool
where
R: RangeBounds<T>,
T: Clone + Ord,
{
let mut removed_ranges = MaybeMap::None;
self.map
.remove_internal(Segment::from(&range), &mut removed_ranges);
removed_ranges.into()
}
pub fn take<R>(&mut self, range: R) -> Self
where
R: RangeBounds<T>,
T: Clone + Ord,
{
Self {
map: self.map.remove(range).unwrap_or_default(),
}
}
pub fn retain<F>(&mut self, mut f: F)
where
T: Ord,
F: FnMut(&Segment<T>) -> bool,
{
self.map.retain(|r, _| f(r))
}
pub fn append(&mut self, other: &mut Self)
where
T: Clone + Ord,
{
self.map.append(&mut other.map)
}
pub fn split_off(&mut self, at: Bound<T>) -> Self
where
T: Clone + Ord,
{
Self {
map: self.map.split_off(at),
}
}
}
impl<T: Clone + Ord> SegmentSet<&T> {
pub fn cloned(&self) -> SegmentSet<T> {
SegmentSet {
map: SegmentMap {
map: self.map.map.iter().map(|(k, _)| (k.cloned(), ())).collect(),
store: alloc::vec::Vec::with_capacity(self.map.store.len()),
},
}
}
}
impl<T> Default for SegmentSet<T>
where
T: Clone + Ord,
{
fn default() -> Self {
SegmentSet::new()
}
}
impl<K, V> From<SegmentMap<K, V>> for SegmentSet<K>
where
K: Ord,
{
fn from(map: SegmentMap<K, V>) -> Self {
let SegmentMap { map, store } = map;
SegmentSet {
map: SegmentMap {
map: map.into_iter().map(|(k, _)| (k, ())).collect(),
store,
},
}
}
}
impl<T: Debug> Debug for SegmentSet<T>
where
T: Ord + Clone,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_set().entries(self.iter()).finish()
}
}
impl<T: PartialEq> PartialEq for SegmentSet<T> {
fn eq(&self, other: &Self) -> bool {
self.map == other.map
}
}