Chris@16
|
1 // Copyright (c) 2000-2011 Joerg Walter, Mathias Koch, David Bellot
|
Chris@16
|
2 //
|
Chris@16
|
3 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
4 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
5 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
6
|
Chris@16
|
7 #ifndef _BOOST_UBLAS_EXCEPTION_
|
Chris@16
|
8 #define _BOOST_UBLAS_EXCEPTION_
|
Chris@16
|
9
|
Chris@16
|
10 #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS)
|
Chris@16
|
11 #include <stdexcept>
|
Chris@16
|
12 #else
|
Chris@16
|
13 #include <cstdlib>
|
Chris@16
|
14 #endif
|
Chris@16
|
15 #ifndef BOOST_UBLAS_NO_STD_CERR
|
Chris@16
|
16 #include <iostream>
|
Chris@16
|
17 #endif
|
Chris@16
|
18
|
Chris@16
|
19 #include <boost/numeric/ublas/detail/config.hpp>
|
Chris@16
|
20
|
Chris@16
|
21 namespace boost { namespace numeric { namespace ublas {
|
Chris@16
|
22
|
Chris@16
|
23 /** \brief Exception raised when a division by zero occurs
|
Chris@16
|
24 */
|
Chris@16
|
25 struct divide_by_zero
|
Chris@16
|
26 #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS)
|
Chris@16
|
27 // Inherit from standard exceptions as requested during review.
|
Chris@16
|
28 : public std::runtime_error
|
Chris@16
|
29 {
|
Chris@16
|
30 explicit divide_by_zero (const char *s = "divide by zero") :
|
Chris@16
|
31 std::runtime_error (s) {}
|
Chris@16
|
32 void raise () {
|
Chris@16
|
33 throw *this;
|
Chris@16
|
34 }
|
Chris@16
|
35 #else
|
Chris@16
|
36 {
|
Chris@16
|
37 divide_by_zero ()
|
Chris@16
|
38 {}
|
Chris@16
|
39 explicit divide_by_zero (const char *)
|
Chris@16
|
40 {}
|
Chris@16
|
41 void raise () {
|
Chris@16
|
42 std::abort ();
|
Chris@16
|
43 }
|
Chris@16
|
44 #endif
|
Chris@16
|
45 };
|
Chris@16
|
46
|
Chris@16
|
47 /** \brief Expception raised when some interal errors occurs like computations errors, zeros values where you should not have zeros, etc...
|
Chris@16
|
48 */
|
Chris@16
|
49 struct internal_logic
|
Chris@16
|
50 #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS)
|
Chris@16
|
51 // Inherit from standard exceptions as requested during review.
|
Chris@16
|
52 : public std::logic_error {
|
Chris@16
|
53 explicit internal_logic (const char *s = "internal logic") :
|
Chris@16
|
54 std::logic_error (s) {}
|
Chris@16
|
55 void raise () {
|
Chris@16
|
56 throw *this;
|
Chris@16
|
57 }
|
Chris@16
|
58 #else
|
Chris@16
|
59 {
|
Chris@16
|
60 internal_logic ()
|
Chris@16
|
61 {}
|
Chris@16
|
62 explicit internal_logic (const char *)
|
Chris@16
|
63 {}
|
Chris@16
|
64 void raise () {
|
Chris@16
|
65 std::abort ();
|
Chris@16
|
66 }
|
Chris@16
|
67 #endif
|
Chris@16
|
68 };
|
Chris@16
|
69
|
Chris@16
|
70 struct external_logic
|
Chris@16
|
71 #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS)
|
Chris@16
|
72 // Inherit from standard exceptions as requested during review.
|
Chris@16
|
73 : public std::logic_error {
|
Chris@16
|
74 explicit external_logic (const char *s = "external logic") :
|
Chris@16
|
75 std::logic_error (s) {}
|
Chris@16
|
76 // virtual const char *what () const throw () {
|
Chris@16
|
77 // return "exception: external logic";
|
Chris@16
|
78 // }
|
Chris@16
|
79 void raise () {
|
Chris@16
|
80 throw *this;
|
Chris@16
|
81 }
|
Chris@16
|
82 #else
|
Chris@16
|
83 {
|
Chris@16
|
84 external_logic ()
|
Chris@16
|
85 {}
|
Chris@16
|
86 explicit external_logic (const char *)
|
Chris@16
|
87 {}
|
Chris@16
|
88 void raise () {
|
Chris@16
|
89 std::abort ();
|
Chris@16
|
90 }
|
Chris@16
|
91 #endif
|
Chris@16
|
92 };
|
Chris@16
|
93
|
Chris@16
|
94 struct bad_argument
|
Chris@16
|
95 #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS)
|
Chris@16
|
96 // Inherit from standard exceptions as requested during review.
|
Chris@16
|
97 : public std::invalid_argument {
|
Chris@16
|
98 explicit bad_argument (const char *s = "bad argument") :
|
Chris@16
|
99 std::invalid_argument (s) {}
|
Chris@16
|
100 void raise () {
|
Chris@16
|
101 throw *this;
|
Chris@16
|
102 }
|
Chris@16
|
103 #else
|
Chris@16
|
104 {
|
Chris@16
|
105 bad_argument ()
|
Chris@16
|
106 {}
|
Chris@16
|
107 explicit bad_argument (const char *)
|
Chris@16
|
108 {}
|
Chris@16
|
109 void raise () {
|
Chris@16
|
110 std::abort ();
|
Chris@16
|
111 }
|
Chris@16
|
112 #endif
|
Chris@16
|
113 };
|
Chris@16
|
114
|
Chris@16
|
115 /**
|
Chris@16
|
116 */
|
Chris@16
|
117 struct bad_size
|
Chris@16
|
118 #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS)
|
Chris@16
|
119 // Inherit from standard exceptions as requested during review.
|
Chris@16
|
120 : public std::domain_error {
|
Chris@16
|
121 explicit bad_size (const char *s = "bad size") :
|
Chris@16
|
122 std::domain_error (s) {}
|
Chris@16
|
123 void raise () {
|
Chris@16
|
124 throw *this;
|
Chris@16
|
125 }
|
Chris@16
|
126 #else
|
Chris@16
|
127 {
|
Chris@16
|
128 bad_size ()
|
Chris@16
|
129 {}
|
Chris@16
|
130 explicit bad_size (const char *)
|
Chris@16
|
131 {}
|
Chris@16
|
132 void raise () {
|
Chris@16
|
133 std::abort ();
|
Chris@16
|
134 }
|
Chris@16
|
135 #endif
|
Chris@16
|
136 };
|
Chris@16
|
137
|
Chris@16
|
138 struct bad_index
|
Chris@16
|
139 #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS)
|
Chris@16
|
140 // Inherit from standard exceptions as requested during review.
|
Chris@16
|
141 : public std::out_of_range {
|
Chris@16
|
142 explicit bad_index (const char *s = "bad index") :
|
Chris@16
|
143 std::out_of_range (s) {}
|
Chris@16
|
144 void raise () {
|
Chris@16
|
145 throw *this;
|
Chris@16
|
146 }
|
Chris@16
|
147 #else
|
Chris@16
|
148 {
|
Chris@16
|
149 bad_index ()
|
Chris@16
|
150 {}
|
Chris@16
|
151 explicit bad_index (const char *)
|
Chris@16
|
152 {}
|
Chris@16
|
153 void raise () {
|
Chris@16
|
154 std::abort ();
|
Chris@16
|
155 }
|
Chris@16
|
156 #endif
|
Chris@16
|
157 };
|
Chris@16
|
158
|
Chris@16
|
159 struct singular
|
Chris@16
|
160 #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS)
|
Chris@16
|
161 // Inherit from standard exceptions as requested during review.
|
Chris@16
|
162 : public std::runtime_error {
|
Chris@16
|
163 explicit singular (const char *s = "singular") :
|
Chris@16
|
164 std::runtime_error (s) {}
|
Chris@16
|
165 void raise () {
|
Chris@16
|
166 throw *this;
|
Chris@16
|
167 }
|
Chris@16
|
168 #else
|
Chris@16
|
169 {
|
Chris@16
|
170 singular ()
|
Chris@16
|
171 {}
|
Chris@16
|
172 explicit singular (const char *)
|
Chris@16
|
173 {}
|
Chris@16
|
174 void raise () {
|
Chris@16
|
175 std::abort ();
|
Chris@16
|
176 }
|
Chris@16
|
177 #endif
|
Chris@16
|
178 };
|
Chris@16
|
179
|
Chris@16
|
180 struct non_real
|
Chris@16
|
181 #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS)
|
Chris@16
|
182 // Inherit from standard exceptions as requested during review.
|
Chris@16
|
183 : public std::domain_error {
|
Chris@16
|
184 explicit non_real (const char *s = "exception: non real") :
|
Chris@16
|
185 std::domain_error (s) {}
|
Chris@16
|
186 void raise () {
|
Chris@16
|
187 throw *this;
|
Chris@16
|
188 }
|
Chris@16
|
189 #else
|
Chris@16
|
190 {
|
Chris@16
|
191 non_real ()
|
Chris@16
|
192 {}
|
Chris@16
|
193 explicit non_real (const char *)
|
Chris@16
|
194 {}
|
Chris@16
|
195 void raise () {
|
Chris@16
|
196 std::abort ();
|
Chris@16
|
197 }
|
Chris@16
|
198 #endif
|
Chris@16
|
199 };
|
Chris@16
|
200
|
Chris@16
|
201 #if BOOST_UBLAS_CHECK_ENABLE
|
Chris@16
|
202 // Macros are equivilent to
|
Chris@16
|
203 // template<class E>
|
Chris@16
|
204 // BOOST_UBLAS_INLINE
|
Chris@16
|
205 // void check (bool expression, const E &e) {
|
Chris@16
|
206 // if (! expression)
|
Chris@16
|
207 // e.raise ();
|
Chris@16
|
208 // }
|
Chris@16
|
209 // template<class E>
|
Chris@16
|
210 // BOOST_UBLAS_INLINE
|
Chris@16
|
211 // void check_ex (bool expression, const char *file, int line, const E &e) {
|
Chris@16
|
212 // if (! expression)
|
Chris@16
|
213 // e.raise ();
|
Chris@16
|
214 // }
|
Chris@16
|
215 #ifndef BOOST_UBLAS_NO_STD_CERR
|
Chris@16
|
216 #define BOOST_UBLAS_CHECK_FALSE(e) \
|
Chris@16
|
217 std::cerr << "Check failed in file " << __FILE__ << " at line " << __LINE__ << ":" << std::endl; \
|
Chris@16
|
218 e.raise ();
|
Chris@16
|
219 #define BOOST_UBLAS_CHECK(expression, e) \
|
Chris@16
|
220 if (! (expression)) { \
|
Chris@16
|
221 std::cerr << "Check failed in file " << __FILE__ << " at line " << __LINE__ << ":" << std::endl; \
|
Chris@16
|
222 std::cerr << #expression << std::endl; \
|
Chris@16
|
223 e.raise (); \
|
Chris@16
|
224 }
|
Chris@16
|
225 #define BOOST_UBLAS_CHECK_EX(expression, file, line, e) \
|
Chris@16
|
226 if (! (expression)) { \
|
Chris@16
|
227 std::cerr << "Check failed in file " << (file) << " at line " << (line) << ":" << std::endl; \
|
Chris@16
|
228 std::cerr << #expression << std::endl; \
|
Chris@16
|
229 e.raise (); \
|
Chris@16
|
230 }
|
Chris@16
|
231 #else
|
Chris@16
|
232 #define BOOST_UBLAS_CHECK_FALSE(e) \
|
Chris@16
|
233 e.raise ();
|
Chris@16
|
234 #define BOOST_UBLAS_CHECK(expression, e) \
|
Chris@16
|
235 if (! (expression)) { \
|
Chris@16
|
236 e.raise (); \
|
Chris@16
|
237 }
|
Chris@16
|
238 #define BOOST_UBLAS_CHECK_EX(expression, file, line, e) \
|
Chris@16
|
239 if (! (expression)) { \
|
Chris@16
|
240 e.raise (); \
|
Chris@16
|
241 }
|
Chris@16
|
242 #endif
|
Chris@16
|
243 #else
|
Chris@16
|
244 // Macros are equivilent to
|
Chris@16
|
245 // template<class E>
|
Chris@16
|
246 // BOOST_UBLAS_INLINE
|
Chris@16
|
247 // void check (bool expression, const E &e) {}
|
Chris@16
|
248 // template<class E>
|
Chris@16
|
249 // BOOST_UBLAS_INLINE
|
Chris@16
|
250 // void check_ex (bool expression, const char *file, int line, const E &e) {}
|
Chris@16
|
251 #define BOOST_UBLAS_CHECK_FALSE(e)
|
Chris@16
|
252 #define BOOST_UBLAS_CHECK(expression, e)
|
Chris@16
|
253 #define BOOST_UBLAS_CHECK_EX(expression, file, line, e)
|
Chris@16
|
254 #endif
|
Chris@16
|
255
|
Chris@16
|
256
|
Chris@16
|
257 #ifndef BOOST_UBLAS_USE_FAST_SAME
|
Chris@16
|
258 // Macro is equivilent to
|
Chris@16
|
259 // template<class T>
|
Chris@16
|
260 // BOOST_UBLAS_INLINE
|
Chris@16
|
261 // const T &same_impl (const T &size1, const T &size2) {
|
Chris@16
|
262 // BOOST_UBLAS_CHECK (size1 == size2, bad_argument ());
|
Chris@16
|
263 // return (std::min) (size1, size2);
|
Chris@16
|
264 // }
|
Chris@16
|
265 // #define BOOST_UBLAS_SAME(size1, size2) same_impl ((size1), (size2))
|
Chris@16
|
266 // need two types here because different containers can have
|
Chris@16
|
267 // different size_types (especially sparse types)
|
Chris@16
|
268 template<class T1, class T2>
|
Chris@16
|
269 BOOST_UBLAS_INLINE
|
Chris@16
|
270 // Kresimir Fresl and Dan Muller reported problems with COMO.
|
Chris@16
|
271 // We better change the signature instead of libcomo ;-)
|
Chris@16
|
272 // const T &same_impl_ex (const T &size1, const T &size2, const char *file, int line) {
|
Chris@16
|
273 T1 same_impl_ex (const T1 &size1, const T2 &size2, const char *file, int line) {
|
Chris@16
|
274 BOOST_UBLAS_CHECK_EX (size1 == size2, file, line, bad_argument ());
|
Chris@16
|
275 return (size1 < size2)?(size1):(size2);
|
Chris@16
|
276 }
|
Chris@16
|
277 template<class T>
|
Chris@16
|
278 BOOST_UBLAS_INLINE
|
Chris@16
|
279 T same_impl_ex (const T &size1, const T &size2, const char *file, int line) {
|
Chris@16
|
280 BOOST_UBLAS_CHECK_EX (size1 == size2, file, line, bad_argument ());
|
Chris@16
|
281 return (std::min) (size1, size2);
|
Chris@16
|
282 }
|
Chris@16
|
283 #define BOOST_UBLAS_SAME(size1, size2) same_impl_ex ((size1), (size2), __FILE__, __LINE__)
|
Chris@16
|
284 #else
|
Chris@16
|
285 // Macros are equivilent to
|
Chris@16
|
286 // template<class T>
|
Chris@16
|
287 // BOOST_UBLAS_INLINE
|
Chris@16
|
288 // const T &same_impl (const T &size1, const T &size2) {
|
Chris@16
|
289 // return size1;
|
Chris@16
|
290 // }
|
Chris@16
|
291 // #define BOOST_UBLAS_SAME(size1, size2) same_impl ((size1), (size2))
|
Chris@16
|
292 #define BOOST_UBLAS_SAME(size1, size2) (size1)
|
Chris@16
|
293 #endif
|
Chris@16
|
294
|
Chris@16
|
295 }}}
|
Chris@16
|
296
|
Chris@16
|
297 #endif
|