exception.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 297 行

HPP
297
字号
////  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 {    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    };    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

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?