@@ -170,6 +170,9 @@ template<class T> class interval_templatet
170170
171171 bool is_less_than_eq (const interval_templatet &i)
172172 {
173+ // Empty intervals are less than or equal to any interval
174+ if (empty () || i.empty ())
175+ return true ;
173176 if (i.lower_set && upper_set && upper <= i.lower )
174177 return true ;
175178 else
@@ -178,6 +181,9 @@ template<class T> class interval_templatet
178181
179182 bool is_less_than (const interval_templatet &i)
180183 {
184+ // Empty intervals are less than any interval
185+ if (empty () || i.empty ())
186+ return true ;
181187 if (i.lower_set && upper_set && upper < i.lower )
182188 return true ;
183189 else
@@ -186,6 +192,17 @@ template<class T> class interval_templatet
186192
187193 void approx_union_with (const interval_templatet &i)
188194 {
195+ // If i is empty, union is just this interval
196+ if (i.empty ())
197+ return ;
198+
199+ // If this interval is empty, union is just i
200+ if (empty ())
201+ {
202+ *this = i;
203+ return ;
204+ }
205+
189206 if (i.lower_set && lower_set)
190207 lower=std::min (lower, i.lower );
191208 else if (!i.lower_set && lower_set)
@@ -201,6 +218,9 @@ template<class T> class interval_templatet
201218template <class T >
202219tvt operator <=(const interval_templatet<T> &a, const interval_templatet<T> &b)
203220{
221+ // Empty sets compare as less than or equal
222+ if (a.empty () || b.empty ())
223+ return tvt (true );
204224 if (a.upper_set && b.lower_set && a.upper <=b.lower )
205225 return tvt (true );
206226 if (a.lower_set && b.upper_set && a.lower >b.upper )
@@ -230,6 +250,10 @@ tvt operator>(const interval_templatet<T> &a, const interval_templatet<T> &b)
230250template <class T >
231251bool operator ==(const interval_templatet<T> &a, const interval_templatet<T> &b)
232252{
253+ // Empty sets are always equal
254+ if (a.empty () && b.empty ())
255+ return true ;
256+
233257 if (a.lower_set !=b.lower_set )
234258 return false ;
235259 if (a.upper_set !=b.upper_set )
0 commit comments