001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
042:
043:
044:
045:
046:
047:
048:
049:
050:
051:
052:
053:
054:
055:
056:
057:
058:
059:
060:
061:
062:
063:
064:
065:
066:
067:
068:
069:
070:
071:
072:
073:
074:
075:
076:
077:
078:
079:
080:
081:
082:
083:
084:
085:
086:
087:
088:
089:
090:
091:
092:
093:
094:
095:
096:
097:
098:
099:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
Min/Max




























































































































































































































































































































































/*
* Copyright (c), Zeriph Enterprises
* All rights reserved.
*
* Contributor(s):
* Zechariah Perez, omni (at) zeriph (dot) com
*
* THIS SOFTWARE IS PROVIDED BY ZERIPH AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL ZERIPH AND CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#if !defined(OMNI_EXCEPTIONS_HPP)
#define OMNI_EXCEPTIONS_HPP 1

#include <omni/defs/global.hpp>
// for the order of exception handling, see the following header
#include <omni/defs/except_def.hpp>

#if defined(OMNI_THROW)
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <omni/defs/consts.hpp>
    
    // DEV_NOTE: If you wish to have something other than std::terminate be called below, define OMNI_EXCEPTION_TERMINATE
    #if !defined(OMNI_EXCEPTION_TERMINATE)
        // std::terminate is called when an exception happens within an exception (i.e. a null pointer reference)
        #define OMNI_EXCEPTION_TERMINATE OMNI_TERMINATE;
    #endif
    #define OMNI_ERR_APPEND_FW(val) std::stringstream cval; cval << val; this->m_what.append(cval.str())

    // DEV_NOTE: the exception specification for throw() is an implicit noexcept(false)
    // DEV_NOTE: all exceptions in Omni will be explicit for single parameter ctor's to avoid any collision
    
    namespace omni {
        class exception : virtual public std::exception
        {
            public:
                exception() OMNI_FUNC_NO_THROW : m_what(OMNI_GENERAL_EXCEPTION_STR) {}

                explicit exception(const char* reason) OMNI_FUNC_NO_THROW : m_what("")
                {
                    if (reason) { this->m_what.append(reason); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                }
                
                explicit exception(const std::string& reason) OMNI_FUNC_NO_THROW : m_what(reason) {}
                
                exception(const char* reason, const char* extra) OMNI_FUNC_NO_THROW : m_what("")
                {
                    if (reason) { this->m_what.append(reason); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                    if (extra) { this->m_what.append(extra); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                }
                
                exception(const char* reason, const char* extra, int errnum) OMNI_FUNC_NO_THROW : m_what("")
                {
                    if (reason) { this->m_what.append(reason); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR)
                        OMNI_EXCEPTION_TERMINATE
                    }
                    if (extra) { this->m_what.append(extra); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR)
                        OMNI_EXCEPTION_TERMINATE
                    }
                    OMNI_ERR_APPEND_FW(errnum);
                }
                
                exception(const char* reason, const char* extra, long errnum) OMNI_FUNC_NO_THROW : m_what("")
                {
                    if (reason) { this->m_what.append(reason); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                    if (extra) { this->m_what.append(extra); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                    OMNI_ERR_APPEND_FW(errnum);
                }

                exception(const char* reason, const char* extra, std::size_t errnum) OMNI_FUNC_NO_THROW : m_what("")
                {
                    if (reason) { this->m_what.append(reason); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                    if (extra) { this->m_what.append(extra); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                    OMNI_ERR_APPEND_FW(errnum);
                }

                exception(const std::string& reason, const std::string& extra) OMNI_FUNC_NO_THROW : m_what(reason)
                {
                    this->m_what.append(extra);
                }
                
                exception(const std::string& reason, const std::string& extra, int errnum) OMNI_FUNC_NO_THROW : m_what(reason)
                {
                    this->m_what.append(extra);
                    OMNI_ERR_APPEND_FW(errnum);
                }

                exception(const std::string& reason, const std::string& extra, long errnum) OMNI_FUNC_NO_THROW : m_what(reason)
                {
                    this->m_what.append(extra);
                    OMNI_ERR_APPEND_FW(errnum);
                }

                exception(const std::string& reason, const std::string& extra, std::size_t errnum) OMNI_FUNC_NO_THROW : m_what(reason)
                {
                    this->m_what.append(extra);
                    OMNI_ERR_APPEND_FW(errnum);
                }

                exception(const char* reason, int errnum) OMNI_FUNC_NO_THROW : m_what("")
                {
                    if (reason) { this->m_what.append(reason); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                    OMNI_ERR_APPEND_FW(errnum);
                }
                
                exception(const std::string& reason, int errnum) OMNI_FUNC_NO_THROW : m_what(reason)
                {
                    OMNI_ERR_APPEND_FW(errnum);
                }

                exception(const char* reason, long errnum) OMNI_FUNC_NO_THROW : m_what("")
                {
                    if (reason) { this->m_what.append(reason); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                    OMNI_ERR_APPEND_FW(errnum);
                }
                
                exception(const std::string& reason, long errnum) OMNI_FUNC_NO_THROW : m_what(reason)
                {
                    OMNI_ERR_APPEND_FW(errnum);
                }
                
                exception(const char* reason, std::size_t errnum) OMNI_FUNC_NO_THROW : m_what("")
                {
                    if (reason) { this->m_what.append(reason); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                    OMNI_ERR_APPEND_FW(errnum);
                }
                
                exception(const std::string& reason, std::size_t errnum) OMNI_FUNC_NO_THROW : m_what(reason)
                {
                    OMNI_ERR_APPEND_FW(errnum);
                }
                
                virtual ~exception() OMNI_DTOR_NO_THROW
                {

                }
                
                virtual void append(const char* ex)
                {
                    if (ex) { this->m_what.append(ex); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                }
                
                virtual void append(const std::string& ex)
                {
                    this->m_what.append(ex);
                }
                
                virtual void append(const char* ex, int errnum)
                {
                    if (ex) { this->m_what.append(ex); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                    OMNI_ERR_APPEND_FW(errnum);
                }
                
                virtual void append(const std::string& ex, int errnum)
                {
                    this->m_what.append(ex);
                    OMNI_ERR_APPEND_FW(errnum);
                }

                virtual void append(const char* ex, long errnum)
                {
                    if (ex) { this->m_what.append(ex); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                    OMNI_ERR_APPEND_FW(errnum);
                }
                
                virtual void append(const std::string& ex, long errnum)
                {
                    this->m_what.append(ex);
                    OMNI_ERR_APPEND_FW(errnum);
                }
                
                virtual void append(const char* ex, std::size_t errnum)
                {
                    if (ex) { this->m_what.append(ex); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                    OMNI_ERR_APPEND_FW(errnum);
                }
                
                virtual void append(const std::string& ex, std::size_t errnum)
                {
                    this->m_what.append(ex);
                    OMNI_ERR_APPEND_FW(errnum);
                }
                
                virtual const char* what() const throw() { return this->m_what.c_str(); }
                
                virtual void seterr(const char* ex)
                {
                    if (ex) { this->m_what = std::string(ex); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                }
                
                virtual void seterr(const std::string& ex) { this->m_what = ex; }
                
                virtual void seterr(const char* ex, int errnum)
                {
                    if (ex) { this->m_what = std::string(ex); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                    OMNI_ERR_APPEND_FW(errnum);
                }
                
                virtual void seterr(const std::string& ex, int errnum)
                {
                    this->m_what = ex;
                    OMNI_ERR_APPEND_FW(errnum);
                }

                virtual void seterr(const char* ex, long errnum)
                {
                    if (ex) { this->m_what = std::string(ex); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                    OMNI_ERR_APPEND_FW(errnum);
                }
                
                virtual void seterr(const std::string& ex, long errnum)
                {
                    this->m_what = ex;
                    OMNI_ERR_APPEND_FW(errnum);
                }
                
                virtual void seterr(const char* ex, std::size_t errnum)
                {
                    if (ex) { this->m_what = std::string(ex); }
                    else {
                        OMNI_DBGE(OMNI_NULL_PTR_STR);
                        OMNI_EXCEPTION_TERMINATE
                    }
                    OMNI_ERR_APPEND_FW(errnum);
                }
                
                virtual void seterr(const std::string& ex, std::size_t errnum)
                {
                    std::stringstream cval(ex);
                    cval << errnum;
                    this->m_what = cval.str();
                }
                
                operator std::string() const
                {
                    return this->m_what;
                }
                
                operator std::wstring() const
                {
                    std::wstringstream o;
                    o << this->m_what.c_str();
                    return o.str();
                }
                
                friend std::ostream& operator<<(std::ostream& s, const omni::exception& e)
                {
                    s << e.m_what;
                    return s;
                }
                
                friend std::wostream& operator<<(std::wostream& s, const omni::exception& e)
                {
                    s << e.m_what.c_str();
                    return s;
                }
                
            protected:
                std::string m_what;
        };
    }
    
    // include the omni::exceptions namespace and it is exceptions
    #include <omni/xx/exceptions.hxx>
    #undef OMNI_ERR_APPEND_FW
#endif // OMNI_THROW
#endif // OMNI_EXCEPTIONS_HPP