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
46 #ifndef __has_extension
47 #define __has_extension __has_feature
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: ") + \
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) \
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
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
GLsizei const GLchar ** string
#define MRPT_printf_format_check(_FMT_, _VARARGS_)
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.