15 #include <mrpt/config.h> 18 #if defined(__GNUC__) && defined(__GNUC_MINOR__) 19 #define MRPT_CHECK_GCC_VERSION(major, minor) \ 20 ((__GNUC__ > (major)) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))) 22 #define MRPT_CHECK_GCC_VERSION(major, minor) 0 28 #define MRPT_VISUALC_VERSION(major) 0 29 #define MRPT_CHECK_VISUALC_VERSION(major) 0 37 #define MRPT_VISUALC_VERSION(major) \ 38 ((6 + (major >= 14 ? (-1) : 0) + major) * 100) 39 #define MRPT_CHECK_VISUALC_VERSION(major) \ 40 (_MSC_VER >= MRPT_VISUALC_VERSION(major)) 44 #define __has_feature(x) 0 // Compatibility with non-clang compilers. 46 #ifndef __has_extension 47 #define __has_extension __has_feature // Compatibility with pre-3.0 compilers. 52 #if defined(__clang__) && defined(__has_extension) 53 #if __has_extension(attribute_deprecated_with_message) 54 #define MRPT_DEPRECATED(msg) __attribute__((deprecated(msg))) 56 #define MRPT_DEPRECATED(msg) __attribute__((deprecated)) 58 #elif MRPT_CHECK_GCC_VERSION(4, 5) 59 #define MRPT_DEPRECATED(msg) __attribute__((deprecated(msg))) 60 #elif MRPT_CHECK_VISUALC_VERSION(8) 61 #define MRPT_DEPRECATED(msg) __declspec(deprecated("deprecated: " msg)) 63 #define MRPT_DEPRECATED(msg) 68 #define MRPT_DO_PRAGMA(x) __pragma(x) 69 #define __STR2__(x) #x 70 #define __STR1__(x) __STR2__(x) 71 #define __MSVCLOC__ __FILE__ "("__STR1__(__LINE__) ") : " 72 #define MRPT_MSG_PRAGMA(_msg) MRPT_DO_PRAGMA(message(__MSVCLOC__ _msg)) 73 #elif defined(__GNUC__) 74 #define MRPT_DO_PRAGMA(x) _Pragma(#x) 75 #define MRPT_MSG_PRAGMA(_msg) MRPT_DO_PRAGMA(message(_msg)) 77 #define MRPT_DO_PRAGMA(x) 78 #define MRPT_MSG_PRAGMA(_msg) 81 #define MRPT_WARNING(x) MRPT_MSG_PRAGMA("Warning: " x) 82 #define MRPT_TODO(x) MRPT_MSG_PRAGMA("TODO: " x) 86 #define MRPT_printf_format_check(_FMT_, _VARARGS_) \ 87 __attribute__((__format__(__printf__, _FMT_, _VARARGS_))) 89 #define MRPT_printf_format_check(_FMT_, _VARARGS_) 93 #define MRPT_scanf_format_check(_FMT_, _VARARGS_) \ 94 __attribute__((__format__(__scanf__, _FMT_, _VARARGS_))) 96 #define MRPT_scanf_format_check(_FMT_, _VARARGS_) 100 #if defined(_MSC_VER) && (_MSC_VER >= 1300) 101 #define __CURRENT_FUNCTION_NAME__ __FUNCTION__ 103 #define __CURRENT_FUNCTION_NAME__ __PRETTY_FUNCTION__ 111 #define THROW_EXCEPTION(msg) \ 113 std::ostringstream auxCompStr; \ 114 auxCompStr << "\n\n =============== MRPT EXCEPTION =============\n"; \ 115 auxCompStr << __CURRENT_FUNCTION_NAME__ << ", line " << __LINE__ \ 117 auxCompStr << msg << std::endl; \ 118 throw std::logic_error(auxCompStr.str()); \ 121 #define THROW_EXCEPTION_FMT(_FORMAT_STRING, ...) \ 122 THROW_EXCEPTION(mrpt::format(_FORMAT_STRING, __VA_ARGS__)) 129 #define THROW_TYPED_EXCEPTION(msg, exceptionClass) \ 131 std::ostringstream auxCompStr; \ 132 auxCompStr << "\n\n =============== MRPT EXCEPTION =============\n"; \ 133 auxCompStr << __CURRENT_FUNCTION_NAME__ << ", line " << __LINE__ \ 135 auxCompStr << msg << std::endl; \ 136 throw exceptionClass(auxCompStr.str()); \ 139 #define THROW_TYPED_EXCEPTION_FMT(exceptionClass, _FORMAT_STRING, ...) \ 140 THROW_TYPED_EXCEPTION( \ 141 mrpt::format(_FORMAT_STRING, __VA_ARGS__), exceptionClass) 146 #define THROW_STACKED_EXCEPTION(e) \ 148 std::string _tse_str(mrpt::format("%s\n", e.what())); \ 149 _tse_str += mrpt::format( \ 150 " %s:%i: In `%s`\n", __FILE__, __LINE__, \ 151 __CURRENT_FUNCTION_NAME__); \ 152 throw std::logic_error(_tse_str); \ 159 #define THROW_STACKED_EXCEPTION_CUSTOM_MSG1(e, msg) \ 161 std::ostringstream auxCompStr; \ 162 auxCompStr << e.what(); \ 163 auxCompStr << msg << std::endl; \ 164 throw std::logic_error(auxCompStr.str()); \ 172 #define THROW_STACKED_EXCEPTION_CUSTOM_MSG2(e, stuff, param1) \ 174 std::ostringstream auxCompStr; \ 175 auxCompStr << e.what(); \ 176 auxCompStr << mrpt::format(stuff, param1) << std::endl; \ 177 throw std::logic_error(auxCompStr.str()); \ 181 #define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V) \ 184 "Cannot parse object: unknown serialization version number: '%i'", \ 185 static_cast<int>(__V))) 194 #define ASSERTMSG_(f, __ERROR_MSG) \ 196 if (!(f)) THROW_EXCEPTION(::std::string(__ERROR_MSG)); \ 206 ASSERTMSG_(f, std::string("Assert condition failed: ") + ::std::string(#f)) 210 #define MRPT_CHECK_NORMAL_NUMBER(v) \ 212 ASSERT_(std::isfinite(v)); \ 213 ASSERT_(!std::isnan(v)); \ 218 #define MRPT_COMPILE_TIME_ASSERT(expression) \ 219 static_assert(expression, #expression); 222 #define ASSERT_EQUAL_(__A, __B) \ 226 std::ostringstream __s__; \ 227 __s__ << "ASSERT_EQUAL_(" << #__A << "," << #__B \ 228 << ") failed with\n" \ 229 << #__A << "=" << __A << "\n" \ 230 << #__B << "=" << __B; \ 231 THROW_EXCEPTION(__s__.str()) \ 234 #define ASSERT_NOT_EQUAL_(__A, __B) \ 238 std::ostringstream __s__; \ 239 __s__ << "ASSERT_NOT_EQUAL_(" << #__A << "," << #__B \ 240 << ") failed with\n" \ 241 << #__A << "=" << __A << "\n" \ 242 << #__B << "=" << __B; \ 243 THROW_EXCEPTION(__s__.str()) \ 246 #define ASSERT_BELOW_(__A, __B) \ 250 std::ostringstream __s__; \ 251 __s__ << "ASSERT_BELOW_(" << #__A << "," << #__B \ 252 << ") failed with\n" \ 253 << #__A << "=" << __A << "\n" \ 254 << #__B << "=" << __B; \ 255 THROW_EXCEPTION(__s__.str()) \ 258 #define ASSERT_ABOVE_(__A, __B) \ 262 std::ostringstream __s__; \ 263 __s__ << "ASSERT_ABOVE_(" << #__A << "," << #__B \ 264 << ") failed with\n" \ 265 << #__A << "=" << __A << "\n" \ 266 << #__B << "=" << __B; \ 267 THROW_EXCEPTION(__s__.str()) \ 270 #define ASSERT_BELOWEQ_(__A, __B) \ 274 std::ostringstream __s__; \ 275 __s__ << "ASSERT_BELOWEQ_(" << #__A << "," << #__B \ 276 << ") failed with\n" \ 277 << #__A << "=" << __A << "\n" \ 278 << #__B << "=" << __B; \ 279 THROW_EXCEPTION(__s__.str()) \ 282 #define ASSERT_ABOVEEQ_(__A, __B) \ 286 std::ostringstream __s__; \ 287 __s__ << "ASSERT_ABOVEEQ_(" << #__A << "," << #__B \ 288 << ") failed with\n" \ 289 << #__A << "=" << __A << "\n" \ 290 << #__B << "=" << __B; \ 291 THROW_EXCEPTION(__s__.str()) \ 295 #define ASSERT_FILE_EXISTS_(FIL) \ 297 mrpt::system::fileExists(FIL), \ 298 std::string("Assert file existence failed: ") + ::std::string(FIL)) 299 #define ASSERT_DIRECTORY_EXISTS_(DIR) \ 301 mrpt::system::directoryExists(DIR), \ 302 std::string("Assert directory existence failed: ") + \ 305 #else // MRPT_HAS_ASSERT 306 #define ASSERTMSG_(f, __ERROR_MSG) \ 312 #define MRPT_CHECK_NORMAL_NUMBER(val) \ 315 #define MRPT_COMPILE_TIME_ASSERT(f) \ 318 #define ASSERT_EQUAL_(__A, __B) \ 321 #define ASSERT_NOT_EQUAL_(__A, __B) \ 324 #define ASSERT_BELOW_(__A, __B) \ 327 #define ASSERT_ABOVE_(__A, __B) \ 330 #define ASSERT_BELOWEQ_(__A, __B) \ 333 #define ASSERT_ABOVEEQ_(__A, __B) \ 337 #define ASSERT_FILE_EXISTS_(FIL) \ 340 #define ASSERT_DIRECTORY_EXISTS_(DIR) \ 343 #endif // MRPT_HAS_ASSERT 352 #define ASSERTDEB_(f) ASSERT_(f) 353 #define ASSERTDEBMSG_(f, __ERROR_MSG) ASSERTMSG_(f, __ERROR_MSG) 355 #define ASSERTDEB_(f) \ 358 #define ASSERTDEBMSG_(f, __ERROR_MSG) \ 365 #define MRPT_UNUSED_PARAM(a) (void)(a) 367 #if MRPT_HAS_STACKED_EXCEPTIONS 372 #define MRPT_TRY_START \ 379 #define MRPT_TRY_END \ 381 catch (std::bad_alloc&) { throw; } \ 382 catch (std::exception & e) { THROW_STACKED_EXCEPTION(e); } \ 383 catch (...) { THROW_EXCEPTION("Unexpected runtime error!"); } 389 #define MRPT_TRY_END_WITH_CLEAN_UP(stuff) \ 391 catch (std::bad_alloc&) { throw; } \ 392 catch (std::exception & e) \ 397 THROW_STACKED_EXCEPTION(e); \ 404 THROW_EXCEPTION("Unexpected runtime error!"); \ 408 #define MRPT_TRY_START 410 #define MRPT_TRY_END_WITH_CLEAN_UP(stuff) 413 #if MRPT_ENABLE_EMBEDDED_GLOBAL_PROFILER 414 #define MRPT_PROFILE_FUNC_START \ 415 ::mrpt::utils::CProfilerProxy BOOST_JOIN( \ 416 __dum_var, __LINE__)(__CURRENT_FUNCTION_NAME__); 418 #define MRPT_PROFILE_FUNC_START 426 MRPT_PROFILE_FUNC_START \ 429 #define MRPT_END MRPT_TRY_END 431 #define MRPT_END_WITH_CLEAN_UP(stuff) MRPT_TRY_END_WITH_CLEAN_UP(stuff) 437 #define M_2PI 6.283185307179586476925286766559 // The 2*PI constant 440 #define M_PIf 3.14159265358979f 441 #define M_2PIf 6.28318530717959f 443 #if defined(HAVE_LONG_DOUBLE) && !defined(M_PIl) 444 #define M_PIl 3.14159265358979323846264338327950288L 445 #define M_2PIl (2.0L * 3.14159265358979323846264338327950288L) 450 #define MRPT_printf_format_check(_FMT_, _VARARGS_) \ 451 __attribute__((__format__(__printf__, _FMT_, _VARARGS_))) 453 #define MRPT_printf_format_check(_FMT_, _VARARGS_) 458 #define MRPT_scanf_format_check(_FMT_, _VARARGS_) \ 459 __attribute__((__format__(__scanf__, _FMT_, _VARARGS_))) 461 #define MRPT_scanf_format_check(_FMT_, _VARARGS_) 465 #if (defined _MSC_VER) || (defined __INTEL_COMPILER) 466 #define MRPT_FORCE_INLINE __forceinline 468 #define MRPT_FORCE_INLINE inline 483 #define QUOTE(name) #name 484 #define STR(macro) QUOTE(macro) 485 #define USIZE_STR STR(PRIuSIZE) 488 #if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || \ 489 defined(__x86_64) || defined(_M_AMD64) || defined(_M_X64) || \ 490 defined(__i386__) || defined(__i386) || defined(_M_I86) || \ 491 defined(i386) || defined(_M_IX86) || defined(_X86_) 492 #define MRPT_IS_X86_AMD64 1 #define MRPT_printf_format_check(_FMT_, _VARARGS_)
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
GLsizei const GLchar ** string
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.