$search
00001 /* 00002 * Copyright (c) 2008, Willow Garage, Inc. 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions are met: 00007 * 00008 * * Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * * Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * * Neither the name of Willow Garage, Inc. nor the names of its 00014 * contributors may be used to endorse or promote products derived from 00015 * this software without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00018 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00019 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00020 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00021 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00022 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00023 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00024 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00025 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00026 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00027 * POSSIBILITY OF SUCH DAMAGE. 00028 */ 00029 00030 // Author: Josh Faust 00031 00032 #ifndef ROSCONSOLE_ROSASSERT_H 00033 #define ROSCONSOLE_ROSASSERT_H 00034 00035 #include "ros/console.h" 00036 #include "ros/static_assert.h" 00037 00092 #include <ros/platform.h> 00093 00094 #ifdef WIN32 00095 # if defined (__MINGW32__) 00096 # define ROS_ISSUE_BREAK() DebugBreak(); 00097 # else // MSVC 00098 # define ROS_ISSUE_BREAK() __debugbreak(); 00099 # endif 00100 #elif defined(__powerpc64__) 00101 # define ROS_ISSUE_BREAK() asm volatile ("tw 31,1,1"); 00102 #elif defined(__i386__) || defined(__ia64__) || defined(__x86_64__) 00103 # define ROS_ISSUE_BREAK() asm("int $3"); 00104 #else 00105 # include <stdlib.h> 00106 # define ROS_ISSUE_BREAK() abort(); 00107 #endif 00108 00109 #ifndef NDEBUG 00110 #define ROS_ASSERT_ENABLED 00111 #endif 00112 00113 #ifdef ROS_ASSERT_ENABLED 00114 #define ROS_BREAK() \ 00115 do { \ 00116 ROS_FATAL("BREAKPOINT HIT\n\tfile = %s\n\tline=%d\n", __FILE__, __LINE__); \ 00117 ROS_ISSUE_BREAK() \ 00118 } while (0) 00119 00120 #define ROS_ASSERT(cond) \ 00121 do { \ 00122 if (!(cond)) { \ 00123 ROS_FATAL("ASSERTION FAILED\n\tfile = %s\n\tline = %d\n\tcond = %s\n", __FILE__, __LINE__, #cond); \ 00124 ROS_ISSUE_BREAK() \ 00125 } \ 00126 } while (0) 00127 00128 #define ROS_ASSERT_MSG(cond, ...) \ 00129 do { \ 00130 if (!(cond)) { \ 00131 ROS_FATAL("ASSERTION FAILED\n\tfile = %s\n\tline = %d\n\tcond = %s\n\tmessage = ", __FILE__, __LINE__, #cond); \ 00132 ROS_FATAL(__VA_ARGS__); \ 00133 ROS_FATAL("\n"); \ 00134 ROS_ISSUE_BREAK(); \ 00135 } \ 00136 } while (0) 00137 00138 #define ROS_ASSERT_CMD(cond, cmd) \ 00139 do { \ 00140 if (!cond) { \ 00141 cmd; \ 00142 } \ 00143 } while (0) 00144 00145 00146 #else 00147 #define ROS_BREAK() 00148 #define ROS_ASSERT(cond) 00149 #define ROS_ASSERT_MSG(cond, ...) 00150 #define ROS_ASSERT_CMD(cond, cmd) 00151 #endif 00152 00153 #endif // ROSCONSOLE_ROSASSERT_H