Chris@16: // Copyright (c) 2000-2011 Joerg Walter, Mathias Koch, David Bellot Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef _BOOST_UBLAS_EXCEPTION_ Chris@16: #define _BOOST_UBLAS_EXCEPTION_ Chris@16: Chris@16: #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS) Chris@16: #include Chris@16: #else Chris@16: #include Chris@16: #endif Chris@16: #ifndef BOOST_UBLAS_NO_STD_CERR Chris@16: #include Chris@16: #endif Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { namespace numeric { namespace ublas { Chris@16: Chris@16: /** \brief Exception raised when a division by zero occurs Chris@16: */ Chris@16: struct divide_by_zero Chris@16: #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS) Chris@16: // Inherit from standard exceptions as requested during review. Chris@16: : public std::runtime_error Chris@16: { Chris@16: explicit divide_by_zero (const char *s = "divide by zero") : Chris@16: std::runtime_error (s) {} Chris@16: void raise () { Chris@16: throw *this; Chris@16: } Chris@16: #else Chris@16: { Chris@16: divide_by_zero () Chris@16: {} Chris@16: explicit divide_by_zero (const char *) Chris@16: {} Chris@16: void raise () { Chris@16: std::abort (); Chris@16: } Chris@16: #endif Chris@16: }; Chris@16: Chris@16: /** \brief Expception raised when some interal errors occurs like computations errors, zeros values where you should not have zeros, etc... Chris@16: */ Chris@16: struct internal_logic Chris@16: #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS) Chris@16: // Inherit from standard exceptions as requested during review. Chris@16: : public std::logic_error { Chris@16: explicit internal_logic (const char *s = "internal logic") : Chris@16: std::logic_error (s) {} Chris@16: void raise () { Chris@16: throw *this; Chris@16: } Chris@16: #else Chris@16: { Chris@16: internal_logic () Chris@16: {} Chris@16: explicit internal_logic (const char *) Chris@16: {} Chris@16: void raise () { Chris@16: std::abort (); Chris@16: } Chris@16: #endif Chris@16: }; Chris@16: Chris@16: struct external_logic Chris@16: #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS) Chris@16: // Inherit from standard exceptions as requested during review. Chris@16: : public std::logic_error { Chris@16: explicit external_logic (const char *s = "external logic") : Chris@16: std::logic_error (s) {} Chris@16: // virtual const char *what () const throw () { Chris@16: // return "exception: external logic"; Chris@16: // } Chris@16: void raise () { Chris@16: throw *this; Chris@16: } Chris@16: #else Chris@16: { Chris@16: external_logic () Chris@16: {} Chris@16: explicit external_logic (const char *) Chris@16: {} Chris@16: void raise () { Chris@16: std::abort (); Chris@16: } Chris@16: #endif Chris@16: }; Chris@16: Chris@16: struct bad_argument Chris@16: #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS) Chris@16: // Inherit from standard exceptions as requested during review. Chris@16: : public std::invalid_argument { Chris@16: explicit bad_argument (const char *s = "bad argument") : Chris@16: std::invalid_argument (s) {} Chris@16: void raise () { Chris@16: throw *this; Chris@16: } Chris@16: #else Chris@16: { Chris@16: bad_argument () Chris@16: {} Chris@16: explicit bad_argument (const char *) Chris@16: {} Chris@16: void raise () { Chris@16: std::abort (); Chris@16: } Chris@16: #endif Chris@16: }; Chris@16: Chris@16: /** Chris@16: */ Chris@16: struct bad_size Chris@16: #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS) Chris@16: // Inherit from standard exceptions as requested during review. Chris@16: : public std::domain_error { Chris@16: explicit bad_size (const char *s = "bad size") : Chris@16: std::domain_error (s) {} Chris@16: void raise () { Chris@16: throw *this; Chris@16: } Chris@16: #else Chris@16: { Chris@16: bad_size () Chris@16: {} Chris@16: explicit bad_size (const char *) Chris@16: {} Chris@16: void raise () { Chris@16: std::abort (); Chris@16: } Chris@16: #endif Chris@16: }; Chris@16: Chris@16: struct bad_index Chris@16: #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS) Chris@16: // Inherit from standard exceptions as requested during review. Chris@16: : public std::out_of_range { Chris@16: explicit bad_index (const char *s = "bad index") : Chris@16: std::out_of_range (s) {} Chris@16: void raise () { Chris@16: throw *this; Chris@16: } Chris@16: #else Chris@16: { Chris@16: bad_index () Chris@16: {} Chris@16: explicit bad_index (const char *) Chris@16: {} Chris@16: void raise () { Chris@16: std::abort (); Chris@16: } Chris@16: #endif Chris@16: }; Chris@16: Chris@16: struct singular Chris@16: #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS) Chris@16: // Inherit from standard exceptions as requested during review. Chris@16: : public std::runtime_error { Chris@16: explicit singular (const char *s = "singular") : Chris@16: std::runtime_error (s) {} Chris@16: void raise () { Chris@16: throw *this; Chris@16: } Chris@16: #else Chris@16: { Chris@16: singular () Chris@16: {} Chris@16: explicit singular (const char *) Chris@16: {} Chris@16: void raise () { Chris@16: std::abort (); Chris@16: } Chris@16: #endif Chris@16: }; Chris@16: Chris@16: struct non_real Chris@16: #if ! defined (BOOST_NO_EXCEPTIONS) && ! defined (BOOST_UBLAS_NO_EXCEPTIONS) Chris@16: // Inherit from standard exceptions as requested during review. Chris@16: : public std::domain_error { Chris@16: explicit non_real (const char *s = "exception: non real") : Chris@16: std::domain_error (s) {} Chris@16: void raise () { Chris@16: throw *this; Chris@16: } Chris@16: #else Chris@16: { Chris@16: non_real () Chris@16: {} Chris@16: explicit non_real (const char *) Chris@16: {} Chris@16: void raise () { Chris@16: std::abort (); Chris@16: } Chris@16: #endif Chris@16: }; Chris@16: Chris@16: #if BOOST_UBLAS_CHECK_ENABLE Chris@16: // Macros are equivilent to Chris@16: // template Chris@16: // BOOST_UBLAS_INLINE Chris@16: // void check (bool expression, const E &e) { Chris@16: // if (! expression) Chris@16: // e.raise (); Chris@16: // } Chris@16: // template Chris@16: // BOOST_UBLAS_INLINE Chris@16: // void check_ex (bool expression, const char *file, int line, const E &e) { Chris@16: // if (! expression) Chris@16: // e.raise (); Chris@16: // } Chris@16: #ifndef BOOST_UBLAS_NO_STD_CERR Chris@16: #define BOOST_UBLAS_CHECK_FALSE(e) \ Chris@16: std::cerr << "Check failed in file " << __FILE__ << " at line " << __LINE__ << ":" << std::endl; \ Chris@16: e.raise (); Chris@16: #define BOOST_UBLAS_CHECK(expression, e) \ Chris@16: if (! (expression)) { \ Chris@16: std::cerr << "Check failed in file " << __FILE__ << " at line " << __LINE__ << ":" << std::endl; \ Chris@16: std::cerr << #expression << std::endl; \ Chris@16: e.raise (); \ Chris@16: } Chris@16: #define BOOST_UBLAS_CHECK_EX(expression, file, line, e) \ Chris@16: if (! (expression)) { \ Chris@16: std::cerr << "Check failed in file " << (file) << " at line " << (line) << ":" << std::endl; \ Chris@16: std::cerr << #expression << std::endl; \ Chris@16: e.raise (); \ Chris@16: } Chris@16: #else Chris@16: #define BOOST_UBLAS_CHECK_FALSE(e) \ Chris@16: e.raise (); Chris@16: #define BOOST_UBLAS_CHECK(expression, e) \ Chris@16: if (! (expression)) { \ Chris@16: e.raise (); \ Chris@16: } Chris@16: #define BOOST_UBLAS_CHECK_EX(expression, file, line, e) \ Chris@16: if (! (expression)) { \ Chris@16: e.raise (); \ Chris@16: } Chris@16: #endif Chris@16: #else Chris@16: // Macros are equivilent to Chris@16: // template Chris@16: // BOOST_UBLAS_INLINE Chris@16: // void check (bool expression, const E &e) {} Chris@16: // template Chris@16: // BOOST_UBLAS_INLINE Chris@16: // void check_ex (bool expression, const char *file, int line, const E &e) {} Chris@16: #define BOOST_UBLAS_CHECK_FALSE(e) Chris@16: #define BOOST_UBLAS_CHECK(expression, e) Chris@16: #define BOOST_UBLAS_CHECK_EX(expression, file, line, e) Chris@16: #endif Chris@16: Chris@16: Chris@16: #ifndef BOOST_UBLAS_USE_FAST_SAME Chris@16: // Macro is equivilent to Chris@16: // template Chris@16: // BOOST_UBLAS_INLINE Chris@16: // const T &same_impl (const T &size1, const T &size2) { Chris@16: // BOOST_UBLAS_CHECK (size1 == size2, bad_argument ()); Chris@16: // return (std::min) (size1, size2); Chris@16: // } Chris@16: // #define BOOST_UBLAS_SAME(size1, size2) same_impl ((size1), (size2)) Chris@16: // need two types here because different containers can have Chris@16: // different size_types (especially sparse types) Chris@16: template Chris@16: BOOST_UBLAS_INLINE Chris@16: // Kresimir Fresl and Dan Muller reported problems with COMO. Chris@16: // We better change the signature instead of libcomo ;-) Chris@16: // const T &same_impl_ex (const T &size1, const T &size2, const char *file, int line) { Chris@16: T1 same_impl_ex (const T1 &size1, const T2 &size2, const char *file, int line) { Chris@16: BOOST_UBLAS_CHECK_EX (size1 == size2, file, line, bad_argument ()); Chris@16: return (size1 < size2)?(size1):(size2); Chris@16: } Chris@16: template Chris@16: BOOST_UBLAS_INLINE Chris@16: T same_impl_ex (const T &size1, const T &size2, const char *file, int line) { Chris@16: BOOST_UBLAS_CHECK_EX (size1 == size2, file, line, bad_argument ()); Chris@16: return (std::min) (size1, size2); Chris@16: } Chris@16: #define BOOST_UBLAS_SAME(size1, size2) same_impl_ex ((size1), (size2), __FILE__, __LINE__) Chris@16: #else Chris@16: // Macros are equivilent to Chris@16: // template Chris@16: // BOOST_UBLAS_INLINE Chris@16: // const T &same_impl (const T &size1, const T &size2) { Chris@16: // return size1; Chris@16: // } Chris@16: // #define BOOST_UBLAS_SAME(size1, size2) same_impl ((size1), (size2)) Chris@16: #define BOOST_UBLAS_SAME(size1, size2) (size1) Chris@16: #endif Chris@16: Chris@16: }}} Chris@16: Chris@16: #endif