24 #include "../globals.hpp"
34 : s(Global::dtime::duration::zero()), e(Global::dtime::duration::zero()), sopen(0), eopen(0) { }
36 interval(Global::dtime s_p, Global::dtime e_p, uint32_t sopen_p, uint32_t eopen_p)
37 : s(s_p), e(e_p), sopen(sopen_p), eopen(eopen_p) {
39 throw std::range_error(
"interval end smaller than interval start");
56 inline bool operator==(
const interval& i1,
const interval& i2) {
57 return i1.s == i2.s && i1.e == i2.e && i1.sopen == i2.sopen &&
61 inline bool operator!=(
const interval& i1,
const interval& i2) {
65 inline bool operator<=(
const interval& i1,
const interval& i2) {
66 if (i1.s < i2.s)
return true;
68 if (!i1.sopen && i2.sopen)
return true;
69 if (i1.sopen && !i2.sopen)
return false;
71 if (i1.e < i2.e)
return true;
73 if (i1.eopen == i2.eopen)
return true;
74 if (i1.eopen && !i2.eopen)
return true;
80 inline bool operator<(
const interval& i1,
const interval& i2) {
81 if (i1.s < i2.s)
return true;
83 if (!i1.sopen && i2.sopen)
return true;
84 if (i1.sopen && !i2.sopen)
return false;
86 if (i1.e < i2.e)
return true;
88 if (i1.eopen == i2.eopen)
return false;
89 if (i1.eopen && !i2.eopen)
return true;
95 inline bool operator>(
const interval& i1,
const interval& i2) {
99 inline bool operator>=(
const interval& i1,
const interval& i2) {
103 inline bool operator<(
const Global::dtime& i1,
const interval& i2) {
104 if (i1 < i2.s)
return true;
105 if (i1 == i2.s)
return i2.sopen;
109 inline bool operator>(
const Global::dtime& i1,
const interval& i2) {
110 if (i1 > i2.e)
return true;
111 if (i1 == i2.e)
return i2.eopen;
115 inline interval operator+(
const interval& i,
const Global::duration d) {
116 return interval(i.s + d, i.e + d, i.sopen, i.eopen);
119 inline interval operator-(
const interval& i,
const Global::duration d) {
120 return interval(i.s - d, i.e - d, i.sopen, i.eopen);
123 inline interval operator+(
const Global::duration d,
const interval& i) {
124 return interval(i.s + d, i.e + d, i.sopen, i.eopen);
128 inline bool start_lt(Global::dtime s1,
bool sopen1, Global::dtime s2,
bool sopen2) {
129 if (s1 < s2)
return true;
130 if (s1 > s2)
return false;
131 return !sopen1 && sopen2;
133 inline bool start_gt(Global::dtime s1,
bool sopen1, Global::dtime s2,
bool sopen2) {
134 if (s1 > s2)
return true;
135 if (s1 < s2)
return false;
136 return sopen1 && !sopen2;
138 inline bool start_le(Global::dtime s1,
bool sopen1, Global::dtime s2,
bool sopen2) {
139 return !start_gt(s1, sopen1, s2, sopen2);
141 inline bool start_ge(Global::dtime s1,
bool sopen1, Global::dtime s2,
bool sopen2) {
142 return !start_lt(s1, sopen1, s2, sopen2);
144 inline bool end_lt(Global::dtime e1,
bool eopen1, Global::dtime e2,
bool eopen2) {
145 if (e1 < e2)
return true;
146 if (e1 > e2)
return false;
147 return eopen1 && !eopen2;
149 inline bool end_gt(Global::dtime e1,
bool eopen1, Global::dtime e2,
bool eopen2) {
150 if (e1 > e2)
return true;
151 if (e1 < e2)
return false;
152 return !eopen1 && eopen2;
154 inline bool end_le(Global::dtime e1,
bool eopen1, Global::dtime e2,
bool eopen2) {
155 return !end_gt(e1, eopen1, e2, eopen2);
157 inline bool end_ge(Global::dtime e1,
bool eopen1, Global::dtime e2,
bool eopen2) {
158 return !end_lt(e1, eopen1, e2, eopen2);
162 inline bool start_lt(
const interval& i1,
const interval& i2) {
163 return start_lt(i1.s, i1.sopen, i2.s, i2.sopen);
165 inline bool start_gt(
const interval& i1,
const interval& i2) {
166 return start_gt(i1.s, i1.sopen, i2.s, i2.sopen);
168 inline bool start_le(
const interval& i1,
const interval& i2) {
169 return !start_gt(i1,i2);
171 inline bool start_ge(
const interval& i1,
const interval& i2) {
172 return !start_lt(i1,i2);
174 inline bool end_lt(
const interval& i1,
const interval& i2) {
175 return end_lt(i1.e, i1.eopen, i2.e, i2.eopen);
177 inline bool end_gt(
const interval& i1,
const interval& i2) {
178 return end_gt(i1.e, i1.eopen, i2.e, i2.eopen);
180 inline bool end_le(
const interval& i1,
const interval& i2) {
181 return !end_gt(i1,i2);
183 inline bool end_ge(
const interval& i1,
const interval& i2) {
184 return !end_lt(i1,i2);
190 return end_lt(i1.e, i1.eopen, i2.s, i2.sopen);
192 inline bool end_gt_start(
const interval& i1,
const interval& i2) {
193 return end_gt(i1.e, i1.eopen, i2.s, i2.sopen);
201 inline bool end_le_start(
const interval& i1,
const interval& i2) {
202 return !end_gt_start(i1, i2);
210 inline bool union_start_lt(Global::dtime s1,
bool sopen1, Global::dtime s2,
bool sopen2) {
211 if (s1 < s2)
return true;
212 if (s1 > s2)
return false;
213 return sopen1 || sopen2;
215 inline bool union_start_gt(Global::dtime s1,
bool sopen1, Global::dtime s2,
bool sopen2) {
216 if (s1 > s2)
return true;
217 if (s1 < s2)
return false;
218 return sopen1 || sopen2;
220 inline bool union_start_le(Global::dtime s1,
bool sopen1, Global::dtime s2,
bool sopen2) {
221 return !union_start_gt(s1, sopen1, s2, sopen2);
223 inline bool union_start_ge(Global::dtime s1,
bool sopen1, Global::dtime s2,
bool sopen2) {
226 inline bool union_end_lt(Global::dtime e1,
bool eopen1, Global::dtime e2,
bool eopen2) {
227 if (e1 < e2)
return true;
228 if (e1 > e2)
return false;
229 return eopen1 && eopen2;
231 inline bool union_end_gt(Global::dtime e1,
bool eopen1, Global::dtime e2,
bool eopen2) {
232 if (e1 > e2)
return true;
233 if (e1 < e2)
return false;
234 return eopen1 && eopen2;
236 inline bool union_end_le(Global::dtime e1,
bool eopen1, Global::dtime e2,
bool eopen2) {
237 return !union_end_gt(e1, eopen1, e2, eopen2);
239 inline bool union_end_ge(Global::dtime e1,
bool eopen1, Global::dtime e2,
bool eopen2) {
240 return !union_end_lt(e1, eopen1, e2, eopen2);
244 inline bool union_start_lt(
const interval& i1,
const interval& i2) {
247 inline bool union_start_gt(
const interval& i1,
const interval& i2) {
248 return union_start_gt(i1.s, i1.sopen, i2.s, i2.sopen);
250 inline bool union_start_le(
const interval& i1,
const interval& i2) {
251 return !union_start_gt(i1,i2);
253 inline bool union_start_ge(
const interval& i1,
const interval& i2) {
256 inline bool union_end_lt(
const interval& i1,
const interval& i2) {
257 return union_end_lt(i1.e, i1.eopen, i2.e, i2.eopen);
259 inline bool union_end_gt(
const interval& i1,
const interval& i2) {
260 return union_end_gt(i1.e, i1.eopen, i2.e, i2.eopen);
262 inline bool union_end_le(
const interval& i1,
const interval& i2) {
263 return !union_end_gt(i1,i2);
265 inline bool union_end_ge(
const interval& i1,
const interval& i2) {
266 return !union_end_lt(i1,i2);
272 return union_end_lt(i1.e, i1.eopen, i2.s, i2.sopen);
274 inline bool union_end_gt_start(
const interval& i1,
const interval& i2) {
275 return union_end_gt(i1.e, i1.eopen, i2.s, i2.sopen);
283 inline bool union_end_le_start(
const interval& i1,
const interval& i2) {
284 return !union_end_gt_start(i1, i2);