playit_agent_core/utils/
non_overlapping.rs1pub struct NonOverlapping<T> {
2 elements: Vec<T>,
3}
4
5impl<T> NonOverlapping<T> {
6 pub fn new() -> Self {
7 NonOverlapping {
8 elements: vec![],
9 }
10 }
11
12 pub fn with(elem: T) -> Self {
13 NonOverlapping {
14 elements: vec![elem],
15 }
16 }
17
18 pub fn add<C: NonOverlappingCheck<Element = T>>(&mut self, to_add: C::Element) -> Result<(), C::Element> {
19 for item in &self.elements {
20 if C::is_overlapping(&to_add, item) {
21 return Err(to_add);
22 }
23 }
24
25 self.elements.push(to_add);
26 Ok(())
27 }
28
29 pub fn remove<C: NonOverlappingCheck<Element = T>>(&mut self, item: &C::Element) -> bool {
30 let Some(pos) = self.elements.iter().position(|a| C::is_same(a, item)) else {
31 return false;
32 };
33
34 self.elements.swap_remove(pos);
35 true
36 }
37
38 pub fn contains<C: NonOverlappingCheck<Element = T>>(&self, item: &C::Element) -> bool {
39 self.elements.iter().position(|a| C::is_same(a, item)).is_some()
40 }
41
42 pub fn iter(&self) -> std::slice::Iter<T> {
43 self.elements.iter()
44 }
45}
46
47pub trait NonOverlappingCheck {
48 type Element;
49
50 fn is_same(a: &Self::Element, b: &Self::Element) -> bool;
51
52 fn is_overlapping(a: &Self::Element, b: &Self::Element) -> bool;
53}