Skip to content

Commit 3bbbfd5

Browse files
committed
copy in assert.h from rosconsole
1 parent 57b85f3 commit 3bbbfd5

File tree

1 file changed

+155
-0
lines changed

1 file changed

+155
-0
lines changed

include/rcutils/assert.h

+155
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
/*
2+
* Copyright (c) 2008, Willow Garage, Inc.
3+
* All rights reserved.
4+
*
5+
* Redistribution and use in source and binary forms, with or without
6+
* modification, are permitted provided that the following conditions are met:
7+
*
8+
* * Redistributions of source code must retain the above copyright
9+
* notice, this list of conditions and the following disclaimer.
10+
* * Redistributions in binary form must reproduce the above copyright
11+
* notice, this list of conditions and the following disclaimer in the
12+
* documentation and/or other materials provided with the distribution.
13+
* * Neither the name of Willow Garage, Inc. nor the names of its
14+
* contributors may be used to endorse or promote products derived from
15+
* this software without specific prior written permission.
16+
*
17+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27+
* POSSIBILITY OF SUCH DAMAGE.
28+
*/
29+
30+
// Author: Josh Faust
31+
32+
#ifndef ROSCONSOLE_ROSASSERT_H
33+
#define ROSCONSOLE_ROSASSERT_H
34+
35+
#include "ros/console.h"
36+
#include "ros/static_assert.h"
37+
38+
/** \file */
39+
40+
/** \def ROS_ASSERT(cond)
41+
* \brief Asserts that the provided condition evaluates to true.
42+
*
43+
* If it is false, program execution will abort, with an informative
44+
* statement about which assertion failed, in what file. Use ROS_ASSERT
45+
* instead of assert() itself.
46+
*
47+
* If running inside a debugger, ROS_ASSERT will allow you to step past the assertion.
48+
*/
49+
50+
/** \def ROS_ASSERT_MSG(cond, ...)
51+
* \brief Asserts that the provided condition evaluates to true.
52+
*
53+
* If it is false, program execution will abort, with an informative
54+
* statement about which assertion failed, in what file, and it will print out
55+
* a printf-style message you define. Example usage:
56+
@verbatim
57+
ROS_ASSERT_MSG(x > 0, "Uh oh, x went negative. Value = %d", x);
58+
@endverbatim
59+
*
60+
* If running inside a debugger, ROS_ASSERT will allow you to step past the assertion.
61+
*/
62+
63+
/**
64+
* \def ROS_ASSERT_CMD()
65+
* \brief Runs a command if the provided condition is false
66+
*
67+
* For example:
68+
\verbatim
69+
ROS_ASSERT_CMD(x > 0, handleError(...));
70+
\endverbatim
71+
*/
72+
73+
/** \def ROS_BREAK()
74+
* \brief Aborts program execution.
75+
*
76+
* Aborts program execution with an informative message stating what file and
77+
* line it was called from. Use ROS_BREAK instead of calling assert(0) or
78+
* ROS_ASSERT(0).
79+
*
80+
* If running inside a debugger, ROS_BREAK will allow you to step past the breakpoint.
81+
*/
82+
83+
/** \def ROS_ISSUE_BREAK()
84+
* \brief Always issues a breakpoint instruction.
85+
*
86+
* This define is mostly for internal use, but is useful if you want to simply issue a break
87+
* instruction in a cross-platform way.
88+
*
89+
* Currently implemented for Windows (any platform), powerpc64, and x86
90+
*/
91+
92+
#include <ros/platform.h>
93+
94+
#ifdef WIN32
95+
# if defined (__MINGW32__)
96+
# define ROS_ISSUE_BREAK() DebugBreak();
97+
# else // MSVC
98+
# define ROS_ISSUE_BREAK() __debugbreak();
99+
# endif
100+
#elif defined(__powerpc64__)
101+
# define ROS_ISSUE_BREAK() asm volatile ("tw 31,1,1");
102+
#elif defined(__i386__) || defined(__ia64__) || defined(__x86_64__)
103+
# define ROS_ISSUE_BREAK() asm("int $3");
104+
#else
105+
# include <stdlib.h>
106+
# define ROS_ISSUE_BREAK() abort();
107+
#endif
108+
109+
#ifndef NDEBUG
110+
#ifndef ROS_ASSERT_ENABLED
111+
#define ROS_ASSERT_ENABLED
112+
#endif
113+
#endif
114+
115+
#ifdef ROS_ASSERT_ENABLED
116+
#define ROS_BREAK() \
117+
do { \
118+
ROS_FATAL("BREAKPOINT HIT\n\tfile = %s\n\tline=%d\n", __FILE__, __LINE__); \
119+
ROS_ISSUE_BREAK() \
120+
} while (false)
121+
122+
#define ROS_ASSERT(cond) \
123+
do { \
124+
if (!(cond)) { \
125+
ROS_FATAL("ASSERTION FAILED\n\tfile = %s\n\tline = %d\n\tcond = %s\n", __FILE__, __LINE__, #cond); \
126+
ROS_ISSUE_BREAK() \
127+
} \
128+
} while (false)
129+
130+
#define ROS_ASSERT_MSG(cond, ...) \
131+
do { \
132+
if (!(cond)) { \
133+
ROS_FATAL("ASSERTION FAILED\n\tfile = %s\n\tline = %d\n\tcond = %s\n\tmessage = ", __FILE__, __LINE__, #cond); \
134+
ROS_FATAL(__VA_ARGS__); \
135+
ROS_FATAL("\n"); \
136+
ROS_ISSUE_BREAK(); \
137+
} \
138+
} while (false)
139+
140+
#define ROS_ASSERT_CMD(cond, cmd) \
141+
do { \
142+
if (!(cond)) { \
143+
cmd; \
144+
} \
145+
} while (false)
146+
147+
148+
#else
149+
#define ROS_BREAK()
150+
#define ROS_ASSERT(cond)
151+
#define ROS_ASSERT_MSG(cond, ...)
152+
#define ROS_ASSERT_CMD(cond, cmd)
153+
#endif
154+
155+
#endif // ROSCONSOLE_ROSASSERT_H

0 commit comments

Comments
 (0)