comparison DEPENDENCIES/generic/include/boost/numeric/interval/checking.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children
comparison
equal deleted inserted replaced
15:663ca0da4350 16:2665513ce2d3
1 /* Boost interval/checking.hpp template implementation file
2 *
3 * Copyright 2002 Hervé Brönnimann, Guillaume Melquiond, Sylvain Pion
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_CHECKING_HPP
11 #define BOOST_NUMERIC_INTERVAL_CHECKING_HPP
12
13 #include <stdexcept>
14 #include <string>
15 #include <cassert>
16 #include <boost/limits.hpp>
17
18 namespace boost {
19 namespace numeric {
20 namespace interval_lib {
21
22 struct exception_create_empty
23 {
24 void operator()()
25 {
26 throw std::runtime_error("boost::interval: empty interval created");
27 }
28 };
29
30 struct exception_invalid_number
31 {
32 void operator()()
33 {
34 throw std::invalid_argument("boost::interval: invalid number");
35 }
36 };
37
38 template<class T>
39 struct checking_base
40 {
41 static T pos_inf()
42 {
43 assert(std::numeric_limits<T>::has_infinity);
44 return std::numeric_limits<T>::infinity();
45 }
46 static T neg_inf()
47 {
48 assert(std::numeric_limits<T>::has_infinity);
49 return -std::numeric_limits<T>::infinity();
50 }
51 static T nan()
52 {
53 assert(std::numeric_limits<T>::has_quiet_NaN);
54 return std::numeric_limits<T>::quiet_NaN();
55 }
56 static bool is_nan(const T& x)
57 {
58 return std::numeric_limits<T>::has_quiet_NaN && (x != x);
59 }
60 static T empty_lower()
61 {
62 return (std::numeric_limits<T>::has_quiet_NaN ?
63 std::numeric_limits<T>::quiet_NaN() : static_cast<T>(1));
64 }
65 static T empty_upper()
66 {
67 return (std::numeric_limits<T>::has_quiet_NaN ?
68 std::numeric_limits<T>::quiet_NaN() : static_cast<T>(0));
69 }
70 static bool is_empty(const T& l, const T& u)
71 {
72 return !(l <= u); // safety for partial orders
73 }
74 };
75
76 template<class T, class Checking = checking_base<T>,
77 class Exception = exception_create_empty>
78 struct checking_no_empty: Checking
79 {
80 static T nan()
81 {
82 assert(false);
83 return Checking::nan();
84 }
85 static T empty_lower()
86 {
87 Exception()();
88 return Checking::empty_lower();
89 }
90 static T empty_upper()
91 {
92 Exception()();
93 return Checking::empty_upper();
94 }
95 static bool is_empty(const T&, const T&)
96 {
97 return false;
98 }
99 };
100
101 template<class T, class Checking = checking_base<T> >
102 struct checking_no_nan: Checking
103 {
104 static bool is_nan(const T&)
105 {
106 return false;
107 }
108 };
109
110 template<class T, class Checking = checking_base<T>,
111 class Exception = exception_invalid_number>
112 struct checking_catch_nan: Checking
113 {
114 static bool is_nan(const T& x)
115 {
116 if (Checking::is_nan(x)) Exception()();
117 return false;
118 }
119 };
120
121 template<class T>
122 struct checking_strict:
123 checking_no_nan<T, checking_no_empty<T> >
124 {};
125
126 } // namespace interval_lib
127 } // namespace numeric
128 } // namespace boost
129
130 #endif // BOOST_NUMERIC_INTERVAL_CHECKING_HPP