1 //=================================================================================================
2 /*!
3 //  \file blaze/math/Exception.h
4 //  \brief Header file for the exception macros of the math module
5 //
6 //  Copyright (C) 2012-2020 Klaus Iglberger - All Rights Reserved
7 //
8 //  This file is part of the Blaze library. You can redistribute it and/or modify it under
9 //  the terms of the New (Revised) BSD License. Redistribution and use in source and binary
10 //  forms, with or without modification, are permitted provided that the following conditions
11 //  are met:
12 //
13 //  1. Redistributions of source code must retain the above copyright notice, this list of
14 //     conditions and the following disclaimer.
15 //  2. Redistributions in binary form must reproduce the above copyright notice, this list
16 //     of conditions and the following disclaimer in the documentation and/or other materials
17 //     provided with the distribution.
18 //  3. Neither the names of the Blaze development group nor the names of its contributors
19 //     may be used to endorse or promote products derived from this software without specific
20 //     prior written permission.
21 //
22 //  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
23 //  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 //  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
25 //  SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 //  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
27 //  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28 //  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 //  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30 //  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
31 //  DAMAGE.
32 */
33 //=================================================================================================
34 
35 #ifndef _BLAZE_MATH_EXCEPTION_H_
36 #define _BLAZE_MATH_EXCEPTION_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
43 #include <blaze/util/Exception.h>
44 
45 
46 
47 
48 //=================================================================================================
49 //
50 //  EXCEPTION MACROS
51 //
52 //=================================================================================================
53 
54 //*************************************************************************************************
55 /*!\def BLAZE_THROW_DIVISION_BY_ZERO
56 // \brief Macro for the emission of an exception on detection of a division by zero.
57 // \ingroup math
58 //
59 // This macro encapsulates the default way of \b Blaze to throw an exception on detection of
60 // a division by zero. Also, since it may be desirable to replace the type of exception by a
61 // custom exception type this macro provides an opportunity to customize the behavior.
62 //
63 // The macro excepts a single argument, which specifies the message of the exception:
64 
65    \code
66    #define BLAZE_THROW_DIVISION_BY_ZERO( MESSAGE ) \
67       BLAZE_THROW_RUNTIME_ERROR( MESSAGE )
68    \endcode
69 
70 // In order to customize the type of exception all that needs to be done is to define the macro
71 // prior to including any \a Blaze header file. This will override the \b Blaze default behavior.
72 // The following example demonstrates this by replacing \a std::runtime_error by a custom
73 // exception type:
74 
75    \code
76    class DivisionByZero
77    {
78     public:
79       DivisionByZero();
80       explicit DivisionByZero( const std::string& message );
81       // ...
82    };
83 
84    #define BLAZE_THROW_DIVISION_BY_ZERO( MESSAGE ) \
85       throw DivisionByZero( MESSAGE )
86 
87    #include <blaze/Blaze.h>
88    \endcode
89 
90 // \note It is recommended to define the macro such that a subsequent semicolon is required!
91 //
92 // \warning This macro is provided with the intention to assist in adapting \b Blaze to special
93 // conditions and environments. However, the customization of the type of exception via this
94 // macro may have an effect on the library. Thus be advised to use the macro with due care!
95 */
96 #ifndef BLAZE_THROW_DIVISION_BY_ZERO
97 #  define BLAZE_THROW_DIVISION_BY_ZERO( MESSAGE ) BLAZE_THROW_RUNTIME_ERROR( MESSAGE )
98 #endif
99 //*************************************************************************************************
100 
101 
102 //*************************************************************************************************
103 /*!\def BLAZE_THROW_LAPACK_ERROR
104 // \brief Macro for the emission of an exception on detection of a LAPACK error.
105 // \ingroup math
106 //
107 // This macro encapsulates the default way of \b Blaze to throw an exception when encountering
108 // a LAPACK error (for instance when trying to invert a singular matrix). Also, since it may be
109 // desirable to replace the type of exception by a custom exception type this macro provides an
110 // opportunity to customize the behavior.
111 //
112 // The macro excepts a single argument, which specifies the message of the exception:
113 
114    \code
115    #define BLAZE_THROW_LAPACK_ERROR( MESSAGE ) \
116       BLAZE_THROW_RUNTIME_ERROR( MESSAGE )
117    \endcode
118 
119 // In order to customize the type of exception all that needs to be done is to define the macro
120 // prior to including any \a Blaze header file. This will override the \b Blaze default behavior.
121 // The following example demonstrates this by replacing \a std::runtime_error by a custom
122 // exception type:
123 
124    \code
125    class LapackError
126    {
127     public:
128       LapackError();
129       explicit LapackError( const std::string& message );
130       // ...
131    };
132 
133    #define BLAZE_THROW_LAPACK_ERROR( MESSAGE ) \
134       throw LapackError( MESSAGE )
135 
136    #include <blaze/Blaze.h>
137    \endcode
138 
139 // \note It is recommended to define the macro such that a subsequent semicolon is required!
140 //
141 // \warning This macro is provided with the intention to assist in adapting \b Blaze to special
142 // conditions and environments. However, the customization of the type of exception via this
143 // macro may have an effect on the library. Thus be advised to use the macro with due care!
144 */
145 #ifndef BLAZE_THROW_LAPACK_ERROR
146 #  define BLAZE_THROW_LAPACK_ERROR( MESSAGE ) BLAZE_THROW_RUNTIME_ERROR( MESSAGE )
147 #endif
148 //*************************************************************************************************
149 
150 #endif
151