1use std::ops::Not;
2use crate::*;
3
4
5impl<T:TimePoint> Not for TimeSet<T>
6{
7 type Output = Self;
8
9 fn not(self) -> Self::Output
10 {
11 if let Some(first) = self.0.first() {
12 let mut compl = Vec::with_capacity(self.0.len() + 1);
13 if !first.lower.just_before().is_past_infinite() {
14 compl.push((..first.lower).into());
15 }
16 let mut previous = first.upper.just_after();
17 self.0.iter().skip(1)
18 .for_each(|tw| {
19 compl.push(TimeInterval { lower: previous, upper: tw.lower.just_before() });
20 previous = tw.upper.just_after();
21 });
22 if !previous.is_future_infinite() {
23 compl.push((previous..).into() );
24 }
25 TimeSet(compl)
26 } else {
27 TimeSet::all()
28 }
29 }
30}
31
32
33impl<T:TimePoint> Not for TimeInterval<T> {
34
35 type Output = TimeSet<T>;
36
37 fn not(self) -> Self::Output
38 {
39 if self.is_empty() {
40 TimeSet::all()
41 } else {
42 let cut1 = self.lower_bound().just_before();
43 let cut2 = self.upper_bound().just_after();
44 match (cut1.is_past_infinite(), cut2.is_future_infinite()) {
45 (true, true) => TimeSet::empty(),
46 (true, false) => TimeSet(vec![TimeInterval { lower: cut2, upper: T::INFINITE }]),
47 (false, true) => TimeSet(vec![TimeInterval { lower: -T::INFINITE, upper: cut1 }]),
48 (false, false) => TimeSet(vec![
49 TimeInterval { lower: -T::INFINITE, upper: cut1 },
50 TimeInterval { lower: cut2, upper: T::INFINITE },
51 ])
52 }
53 }
54 }
55}
56
57
58
59macro_rules! timepoint {
60 ($timepoint:ty) => {
61 impl Not for $timepoint {
62 type Output = TimeSet<$timepoint>;
63 fn not(self) -> Self::Output {
64 let first = TimeInterval::before(self.just_before());
65 let second = TimeInterval::after(self.just_after());
66 if first.is_empty() {
67 if second.is_empty() {
68 TimeSet(vec![])
69 } else {
70 TimeSet(vec![second])
71 }
72 } else {
73 if second.is_empty() {
74 TimeSet(vec![first])
75 } else {
76 TimeSet(vec![first, second])
77 }
78 }
79 }
80 }
81 }
82}
83
84timepoint!(TimeValue);
85timepoint!(Timestamp);