1 /* Boost interval/compare/tribool.hpp template implementation file
2  *
3  * Copyright 2002-2003 Guillaume Melquiond
4  *
5  * Distributed under the Boost Software License, Version 1.0.
6  * (See accompanying file LICENSE_1_0.txt or
7  * copy at http://www.boost.org/LICENSE_1_0.txt)
8  */
9 
10 #ifndef BOOST_NUMERIC_INTERVAL_COMPARE_TRIBOOL_HPP
11 #define BOOST_NUMERIC_INTERVAL_COMPARE_TRIBOOL_HPP
12 
13 #include <boost/numeric/interval/detail/interval_prototype.hpp>
14 #include <boost/numeric/interval/detail/test_input.hpp>
15 #include <boost/logic/tribool.hpp>
16 
17 namespace boost {
18 namespace numeric {
19 namespace interval_lib {
20 namespace compare {
21 namespace tribool {
22 
23 template<class T, class Policies1, class Policies2> inline
operator <(const interval<T,Policies1> & x,const interval<T,Policies2> & y)24 logic::tribool operator<(const interval<T, Policies1>& x, const interval<T, Policies2>& y)
25 {
26   if (detail::test_input(x, y)) throw comparison_error();
27   if (x.upper() < y.lower()) return true;
28   if (x.lower() >= y.upper()) return false;
29   return logic::indeterminate;
30 }
31 
32 template<class T, class Policies> inline
operator <(const interval<T,Policies> & x,const T & y)33 logic::tribool operator<(const interval<T, Policies>& x, const T& y)
34 {
35   if (detail::test_input(x, y)) throw comparison_error();
36   if (x.upper() < y) return true;
37   if (x.lower() >= y) return false;
38   return logic::indeterminate;
39 }
40 
41 template<class T, class Policies1, class Policies2> inline
operator <=(const interval<T,Policies1> & x,const interval<T,Policies2> & y)42 logic::tribool operator<=(const interval<T, Policies1>& x, const interval<T, Policies2>& y)
43 {
44   if (detail::test_input(x, y)) throw comparison_error();
45   if (x.upper() <= y.lower()) return true;
46   if (x.lower() > y.upper()) return false;
47   return logic::indeterminate;
48 }
49 
50 template<class T, class Policies> inline
operator <=(const interval<T,Policies> & x,const T & y)51 logic::tribool operator<=(const interval<T, Policies>& x, const T& y)
52 {
53   if (detail::test_input(x, y)) throw comparison_error();
54   if (x.upper() <= y) return true;
55   if (x.lower() > y) return false;
56   return logic::indeterminate;
57 }
58 
59 template<class T, class Policies1, class Policies2> inline
operator >(const interval<T,Policies1> & x,const interval<T,Policies2> & y)60 logic::tribool operator>(const interval<T, Policies1>& x, const interval<T, Policies2>& y)
61 {
62   if (detail::test_input(x, y)) throw comparison_error();
63   if (x.lower() > y.upper()) return true;
64   if (x.upper() <= y.lower()) return false;
65   return logic::indeterminate;
66 }
67 
68 template<class T, class Policies> inline
operator >(const interval<T,Policies> & x,const T & y)69 logic::tribool operator>(const interval<T, Policies>& x, const T& y)
70 {
71   if (detail::test_input(x, y)) throw comparison_error();
72   if (x.lower() > y) return true;
73   if (x.upper() <= y) return false;
74   return logic::indeterminate;
75 }
76 
77 template<class T, class Policies1, class Policies2> inline
operator >=(const interval<T,Policies1> & x,const interval<T,Policies2> & y)78 logic::tribool operator>=(const interval<T, Policies1>& x, const interval<T, Policies2>& y)
79 {
80   if (detail::test_input(x, y)) throw comparison_error();
81   if (x.lower() >= y.upper()) return true;
82   if (x.upper() < y.lower()) return false;
83   return logic::indeterminate;
84 }
85 
86 template<class T, class Policies> inline
operator >=(const interval<T,Policies> & x,const T & y)87 logic::tribool operator>=(const interval<T, Policies>& x, const T& y)
88 {
89   if (detail::test_input(x, y)) throw comparison_error();
90   if (x.lower() >= y) return true;
91   if (x.upper() < y) return false;
92   return logic::indeterminate;
93 }
94 
95 template<class T, class Policies1, class Policies2> inline
operator ==(const interval<T,Policies1> & x,const interval<T,Policies2> & y)96 logic::tribool operator==(const interval<T, Policies1>& x, const interval<T, Policies2>& y)
97 {
98   if (detail::test_input(x, y)) throw comparison_error();
99   if (x.upper() == y.lower() && x.lower() == y.upper()) return true;
100   if (x.upper() < y.lower() || x.lower() > y.upper()) return false;
101   return logic::indeterminate;
102 }
103 
104 template<class T, class Policies> inline
operator ==(const interval<T,Policies> & x,const T & y)105 logic::tribool operator==(const interval<T, Policies>& x, const T& y)
106 {
107   if (detail::test_input(x, y)) throw comparison_error();
108   if (x.upper() == y && x.lower() == y) return true;
109   if (x.upper() < y || x.lower() > y) return false;
110   return logic::indeterminate;
111 }
112 
113 template<class T, class Policies1, class Policies2> inline
operator !=(const interval<T,Policies1> & x,const interval<T,Policies2> & y)114 logic::tribool operator!=(const interval<T, Policies1>& x, const interval<T, Policies2>& y)
115 {
116   if (detail::test_input(x, y)) throw comparison_error();
117   if (x.upper() < y.lower() || x.lower() > y.upper()) return true;
118   if (x.upper() == y.lower() && x.lower() == y.upper()) return false;
119   return logic::indeterminate;
120 }
121 
122 template<class T, class Policies> inline
operator !=(const interval<T,Policies> & x,const T & y)123 logic::tribool operator!=(const interval<T, Policies>& x, const T& y)
124 {
125   if (detail::test_input(x, y)) throw comparison_error();
126   if (x.upper() < y || x.lower() > y) return true;
127   if (x.upper() == y && x.lower() == y) return false;
128   return logic::indeterminate;
129 }
130 
131 } // namespace tribool
132 } // namespace compare
133 } // namespace interval_lib
134 } // namespace numeric
135 } // namespace boost
136 
137 
138 #endif // BOOST_NUMERIC_INTERVAL_COMPARE_TRIBOOL_HPP
139