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