Merge branch 'master' into blender2.8
[blender.git] / extern / audaspace / include / Exception.h
1 /*******************************************************************************
2  * Copyright 2009-2016 Jörg Müller
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  ******************************************************************************/
16
17 #pragma once
18
19 /**
20  * \def AUD_NOEXCEPT
21  * Compatibility macro for noexcept.
22  */
23 #ifdef _MSC_VER
24 #define AUD_NOEXCEPT
25 #else
26 #define AUD_NOEXCEPT noexcept
27 #endif
28
29 /**
30  * @file Exception.h
31  * @ingroup general
32  * Defines the Exception class as well as the AUD_THROW macro for easy throwing.
33  */
34
35 #include "Audaspace.h"
36
37 #include <exception>
38 #include <string>
39
40 /// Throws a Exception with the provided error code.
41 #define AUD_THROW(exception, message) { throw exception(message, __FILE__, __LINE__); }
42
43 AUD_NAMESPACE_BEGIN
44
45 /**
46  * The Exception class is the general exception base class.
47  */
48 class AUD_API Exception : public std::exception
49 {
50 protected:
51         /// A message describing the problem.
52         const std::string m_message;
53
54         /// The source code file in which the exception was thrown.
55         const std::string m_file;
56
57         /// The source code line from which the exception was thrown.
58         const int m_line;
59
60         /**
61          * Copy constructor.
62          * @param exception The exception to be copied.
63          */
64         Exception(const Exception& exception);
65
66         /**
67          * Creates a new Exception object.
68          * @param message A message describing the problem.
69          * @param file The source code file in which the exception was thrown.
70          * @param line The source code line from which the exception was thrown.
71          */
72         Exception(std::string message, std::string file, int line);
73 public:
74         /**
75          * Destroys the object.
76          */
77         virtual ~Exception() AUD_NOEXCEPT;
78
79         /**
80          * Returns the error message.
81          * @return A C string error message.
82          */
83         virtual const char* what() const AUD_NOEXCEPT;
84
85         /**
86          * Returns the error message plus file and line number for debugging purposes.
87          * @return The error message including debug information.
88          */
89         virtual std::string getDebugMessage() const;
90
91         /**
92          * Returns the error message.
93          * @return The error message as string.
94          */
95         const std::string& getMessage() const;
96
97         /**
98          * Returns the file in which the exception was thrown.
99          * @return The name of the file in which the exception was thrown.
100          */
101         const std::string& getFile() const;
102
103         /**
104          * Returns the line where the exception was originally thrown.
105          * @return The line of the source file where the exception was generated.
106          */
107         int getLine() const;
108 };
109
110 /**
111  * The FileException class is used for error cases in which files cannot
112  * be read or written due to unknown containers or codecs.
113  */
114 class AUD_API FileException : public Exception
115 {
116 public:
117         /**
118          * Creates a new FileException object.
119          * @param message A message describing the problem.
120          * @param file The source code file in which the exception was thrown.
121          * @param line The source code line from which the exception was thrown.
122          */
123         FileException(std::string message, std::string file, int line);
124
125         /**
126          * Copy constructor.
127          * @param exception The exception to be copied.
128          */
129         FileException(const FileException& exception);
130
131         ~FileException() AUD_NOEXCEPT;
132 };
133
134 /**
135  * The DeviceException class is used for error cases in connection with
136  * devices, which usually happens when specific features or requests
137  * cannot be fulfilled by a device, for example when the device is opened.
138  */
139 class AUD_API DeviceException : public Exception
140 {
141 public:
142         /**
143          * Creates a new DeviceException object.
144          * @param message A message describing the problem.
145          * @param file The source code file in which the exception was thrown.
146          * @param line The source code line from which the exception was thrown.
147          */
148         DeviceException(std::string message, std::string file, int line);
149
150         /**
151          * Copy constructor.
152          * @param exception The exception to be copied.
153          */
154         DeviceException(const DeviceException& exception);
155
156         ~DeviceException() AUD_NOEXCEPT;
157 };
158
159 /**
160  * The StateException class is used for error cases of sounds or readers
161  * with illegal states or requirements for states of dependent classes.
162  * It is used for example when an effect reader needs a specific
163  * specification from its input.
164  */
165 class AUD_API StateException : public Exception
166 {
167 public:
168         /**
169          * Creates a new StateException object.
170          * @param message A message describing the problem.
171          * @param file The source code file in which the exception was thrown.
172          * @param line The source code line from which the exception was thrown.
173          */
174         StateException(std::string message, std::string file, int line);
175
176         /**
177          * Copy constructor.
178          * @param exception The exception to be copied.
179          */
180         StateException(const StateException& exception);
181
182         ~StateException() AUD_NOEXCEPT;
183 };
184
185 AUD_NAMESPACE_END