Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/libraries/util/OrxAssert.h @ 8400

Last change on this file since 8400 was 8372, checked in by rgrieder, 13 years ago

Improved output of OrxAssert (line number, function name and file) and added OrxVerify.
You can use the latter like OrxAssert, but the condition will also be evaluated in release mode. However abort() will still only be called in debug mode.

  • Property svn:eol-style set to native
File size: 3.5 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Reto Grieder
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30@file
31@ingroup ExceptionAssertion
32@brief
33    Declaration of custom assertion facilities
34*/
35
36#ifndef _OrxAssert_H__
37#define _OrxAssert_H__
38
39#include "UtilPrereqs.h"
40
41#include <cassert>
42#include "Debug.h"
43
44#ifndef NDEBUG
45
46/** Run time assertion like assert(), but with an embedded message.
47@details
48    The message will be printed as error with COUT(1). <br>
49    You can use the same magic here as you can with \ref ThrowException
50    @code
51        OrxAssert(condition, "Text: " << number << " more text");
52    @endcode
53*/
54#define OrxAssert(condition, errorMessage) \
55    do \
56    { \
57        if (!(condition)) \
58        { \
59            COUT(1) << __FILE__ << "(" << __LINE__ << "): "; \
60            COUT(1) << "Assertion failed in " << __FUNCTIONNAME__ << std::endl; \
61            COUT(1) << "Expression: " << #condition << std::endl; \
62            COUT(1) << "Message   : " << errorMessage << std::endl; \
63            /* Don't use the condition again to avoid double evaluation */ \
64            /* Instead, stringify the expression and negate it */ \
65            assert(!#condition); \
66        } \
67    } while (false)
68
69/** Works like OrxAssert in debug mode, but also checks the condition in release
70    mode (no abort() triggered then).
71@details
72    The message will be printed as error with COUT(1). <br>
73    You can use the same magic here as you can with \ref ThrowException
74    @code
75        OrxVerify(condition, "Text: " << number << " more text");
76    @endcode
77*/
78#define OrxVerify(condition, errorMessage) \
79    do \
80    { \
81        if (!(condition)) \
82        { \
83            COUT(1) << __FILE__ << "(" << __LINE__ << "): "; \
84            COUT(1) << "Verification failed in " << __FUNCTIONNAME__ << std::endl; \
85            COUT(1) << "Expression: " << #condition << std::endl; \
86            COUT(1) << "Message   : " << errorMessage << std::endl; \
87            /* Don't use the condition again to avoid double evaluation */ \
88            /* Instead, stringify the expression and negate it */ \
89            assert(!#condition); \
90        } \
91    } while (false)
92
93#else
94
95#define OrxAssert(condition, errorMessage)  ((void)0)
96
97#define OrxVerify(condition, errorMessage) \
98    do \
99    { \
100        if (!(condition)) \
101        { \
102            COUT(1) << __FILE__ << "(" << __LINE__ << "): "; \
103            COUT(1) << "Verification failed in " << __FUNCTIONNAME__ << std::endl; \
104            COUT(1) << "Expression: " << #condition << std::endl; \
105            COUT(1) << "Message   : " << errorMessage << std::endl; \
106            /* No assert() in release configuration */ \
107        } \
108    } while (false)
109
110#endif
111
112#endif /* _OrxAssert_H__ */
Note: See TracBrowser for help on using the repository browser.