chronologic/ops/
compl.rs

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);