18#if (__cplusplus>199711L || (defined(_MSC_VER) && (_MSC_VER >= 1700)) )
19# define MRPT_HAS_CXX11 1
21# define MRPT_HAS_CXX11 0
26# define MRPT_OVERRIDE override
31#if defined(__GNUC__) && (__GNUC__ - 0 > 3 || (__GNUC__ - 0 == 3 && __GNUC_MINOR__ - 0 >= 2))
33# define MRPT_DEPRECATED_PRE(_MSG)
36# define MRPT_DEPRECATED_POST(_MSG) __attribute__ ((deprecated))
37# elif defined(_MSC_VER) && (_MSC_VER >= 1300)
39# define MRPT_DEPRECATED_PRE(_MSG) __declspec(deprecated (_MSG))
40# define MRPT_DEPRECATED_POST(_MSG)
42# define MRPT_DEPRECATED_PRE(_MSG)
43# define MRPT_DEPRECATED_POST(_MSG)
47#define MRPT_DECLARE_DEPRECATED_FUNCTION(__MSG, __FUNC) MRPT_DEPRECATED_PRE(__MSG) __FUNC MRPT_DEPRECATED_POST(__MSG)
51 #define MRPT_DO_PRAGMA(x) __pragma(x)
52 #define __STR2__(x) #x
53 #define __STR1__(x) __STR2__(x)
54 #define __MSVCLOC__ __FILE__ "("__STR1__(__LINE__)") : "
55 #define MRPT_MSG_PRAGMA(_msg) MRPT_DO_PRAGMA(message (__MSVCLOC__ _msg))
56#elif defined(__GNUC__)
57 #define MRPT_DO_PRAGMA(x) _Pragma (#x)
58 #define MRPT_MSG_PRAGMA(_msg) MRPT_DO_PRAGMA(message (_msg))
60 #define MRPT_DO_PRAGMA(x)
61 #define MRPT_MSG_PRAGMA(_msg)
64#define MRPT_WARNING(x) MRPT_MSG_PRAGMA("Warning: " x)
65#define MRPT_TODO(x) MRPT_MSG_PRAGMA("TODO: " x)
69# define MRPT_printf_format_check(_FMT_,_VARARGS_) __attribute__ ((__format__ (__printf__, _FMT_,_VARARGS_)))
71# define MRPT_printf_format_check(_FMT_,_VARARGS_)
75# define MRPT_scanf_format_check(_FMT_,_VARARGS_) __attribute__ ((__format__ (__scanf__, _FMT_,_VARARGS_)))
77# define MRPT_scanf_format_check(_FMT_,_VARARGS_)
81#define MRPT_NO_THROWS throw()
86 #define MRPT_ALIGN16 __declspec(align(16))
87 #define MRPT_ALIGN32 __declspec(align(32))
88#elif defined(__GNUC__)
89 #define MRPT_ALIGN16 __attribute__((aligned(16)))
90 #define MRPT_ALIGN32 __attribute__((aligned(32)))
97#if defined(__BORLANDC__)
98 #define __CURRENT_FUNCTION_NAME__ __FUNC__
99#elif defined(_MSC_VER) && (_MSC_VER>=1300)
100 #define __CURRENT_FUNCTION_NAME__ __FUNCTION__
102 #define __CURRENT_FUNCTION_NAME__ __PRETTY_FUNCTION__
110#define THROW_EXCEPTION(msg) \
112 std::ostringstream auxCompStr;\
113 auxCompStr << "\n\n =============== MRPT EXCEPTION =============\n";\
114 auxCompStr << __CURRENT_FUNCTION_NAME__ << ", line " << __LINE__ << ":\n";\
115 auxCompStr << msg << std::endl; \
116 throw std::logic_error( auxCompStr.str() );\
123#define THROW_EXCEPTION_CUSTOM_MSG1(msg,param1) \
125 std::ostringstream auxCompStr;\
126 auxCompStr << "\n\n =============== MRPT EXCEPTION =============\n";\
127 auxCompStr << __CURRENT_FUNCTION_NAME__ << ", line " << __LINE__ << ":\n";\
128 auxCompStr << mrpt::format(msg,param1)<< std::endl; \
129 throw std::logic_error( auxCompStr.str() );\
137#define THROW_TYPED_EXCEPTION(msg,exceptionClass) \
139 std::ostringstream auxCompStr;\
140 auxCompStr << "\n\n =============== MRPT EXCEPTION =============\n";\
141 auxCompStr << __CURRENT_FUNCTION_NAME__ << ", line " << __LINE__ << ":\n";\
142 auxCompStr << msg << std::endl; \
143 throw exceptionClass( auxCompStr.str() );\
150#define THROW_TYPED_EXCEPTION_CUSTOM_MSG1(msg,param1,exceptionClass) \
152 std::ostringstream auxCompStr;\
153 auxCompStr << "\n\n =============== MRPT EXCEPTION =============\n";\
154 auxCompStr << __CURRENT_FUNCTION_NAME__ << ", line " << __LINE__ << ":\n";\
155 auxCompStr << mrpt::format(msg,param1)<< std::endl; \
156 throw exceptionClass( auxCompStr.str() );\
163#define THROW_STACKED_EXCEPTION(e) \
165 std::string str( e.what() );\
166 if (str.find("MRPT stack trace")==std::string::npos) \
168 str+= __CURRENT_FUNCTION_NAME__;\
169 str+= mrpt::format(", line %i:\n", __LINE__ );\
170 throw std::logic_error( str );\
172 else throw std::logic_error( e.what() );\
179#define THROW_STACKED_EXCEPTION_CUSTOM_MSG1(e,msg) \
181 std::ostringstream auxCompStr;\
182 auxCompStr << e.what() ; \
183 auxCompStr << msg << std::endl; \
184 throw std::logic_error( auxCompStr.str() );\
191#define THROW_STACKED_EXCEPTION_CUSTOM_MSG2(e,stuff,param1) \
193 std::ostringstream auxCompStr;\
194 auxCompStr << e.what() ; \
195 auxCompStr << mrpt::format( stuff, param1 ) << std::endl; \
196 throw std::logic_error( auxCompStr.str() );\
200#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V) THROW_EXCEPTION(mrpt::format("Cannot parse object: unknown serialization version number: '%i'",static_cast<int>(__V)))
208# define ASSERTMSG_(f,__ERROR_MSG) \
210 if (!(f)) THROW_EXCEPTION( ::std::string( __ERROR_MSG ) ); \
218 ASSERTMSG_(f, std::string("Assert condition failed: ") + ::std::string(#f) )
222#define MRPT_CHECK_NORMAL_NUMBER(v) \
224 if (math::isNaN(v)) THROW_EXCEPTION("Check failed (value is NaN)"); \
225 if (!math::isFinite(v)) THROW_EXCEPTION("Check failed (value is not finite)"); \
229#if (defined(_MSC_VER) && (_MSC_VER>=1600 )) || (defined(__GNUC__) && __cplusplus>=201100L )
230 #define MRPT_COMPILE_TIME_ASSERT(expression) static_assert(expression,#expression);
239 template <
bool value>
struct compile_time_assert;
240 template <>
struct compile_time_assert<true> {
enum {value=1}; };
243 #define MRPT_COMPILE_TIME_ASSERT(expression) \
244 typedef char BOOST_JOIN(MRPT_CTA, __LINE__)[::mrpt::utils::compile_time_assert<(bool)(expression)>::value]; extern BOOST_JOIN(MRPT_CTA, __LINE__) BOOST_JOIN(MRPT_DUMMYVAR_CTA, __LINE__);
249 #define ASSERT_EQUAL_( __A, __B) { if (__A!=__B) { std::ostringstream __s__;__s__<<"ASSERT_EQUAL_("<<#__A<<","<<#__B<<") failed with\n"<<#__A<<"=" <<__A <<"\n"<<#__B<<"="<<__B; THROW_EXCEPTION(__s__.str()) } }
250 #define ASSERT_NOT_EQUAL_( __A, __B) { if (__A==__B) { std::ostringstream __s__;__s__<<"ASSERT_NOT_EQUAL_("<<#__A<<","<<#__B<<") failed with\n"<<#__A<<"=" <<__A <<"\n"<<#__B<<"="<<__B; THROW_EXCEPTION(__s__.str()) } }
251 #define ASSERT_BELOW_( __A, __B) { if (__A>=__B) { std::ostringstream __s__;__s__<<"ASSERT_BELOW_("<<#__A<<","<<#__B<<") failed with\n"<<#__A<<"=" <<__A <<"\n"<<#__B<<"="<<__B; THROW_EXCEPTION(__s__.str()) } }
252 #define ASSERT_ABOVE_( __A, __B) { if (__A<=__B) { std::ostringstream __s__;__s__<<"ASSERT_ABOVE_("<<#__A<<","<<#__B<<") failed with\n"<<#__A<<"=" <<__A <<"\n"<<#__B<<"="<<__B; THROW_EXCEPTION(__s__.str()) } }
253 #define ASSERT_BELOWEQ_( __A, __B) { if (__A>__B) { std::ostringstream __s__;__s__<<"ASSERT_BELOWEQ_("<<#__A<<","<<#__B<<") failed with\n"<<#__A<<"=" <<__A <<"\n"<<#__B<<"="<<__B; THROW_EXCEPTION(__s__.str()) } }
254 #define ASSERT_ABOVEEQ_( __A, __B) { if (__A<__B) { std::ostringstream __s__;__s__<<"ASSERT_ABOVEEQ_("<<#__A<<","<<#__B<<") failed with\n"<<#__A<<"=" <<__A <<"\n"<<#__B<<"="<<__B; THROW_EXCEPTION(__s__.str()) } }
256 #define ASSERT_FILE_EXISTS_(FIL) ASSERTMSG_( mrpt::system::fileExists(FIL), std::string("Assert file existence failed: ") + ::std::string(FIL) )
257 #define ASSERT_DIRECTORY_EXISTS_(DIR) ASSERTMSG_( mrpt::system::directoryExists(DIR), std::string("Assert directory existence failed: ") + ::std::string(DIR) )
260# define ASSERTMSG_(f,__ERROR_MSG) { }
261# define ASSERT_(f) { }
262# define MRPT_CHECK_NORMAL_NUMBER(val) { }
263# define MRPT_COMPILE_TIME_ASSERT(f) { }
264# define ASSERT_EQUAL_( __A, __B) { }
265# define ASSERT_NOT_EQUAL_( __A, __B) { }
266# define ASSERT_BELOW_( __A, __B) { }
267# define ASSERT_ABOVE_( __A, __B) { }
268# define ASSERT_BELOWEQ_( __A, __B) { }
269# define ASSERT_ABOVEEQ_( __A, __B) { }
271# define ASSERT_FILE_EXISTS_(FIL) { }
272# define ASSERT_DIRECTORY_EXISTS_(DIR) { }
280# define ASSERTDEB_(f) ASSERT_(f)
281# define ASSERTDEBMSG_(f,__ERROR_MSG) ASSERTMSG_(f,__ERROR_MSG)
283# define ASSERTDEB_(f) { }
284# define ASSERTDEBMSG_(f,__ERROR_MSG) { }
290#define MRPT_UNUSED_PARAM(a) (void)(a)
292#if MRPT_HAS_STACKED_EXCEPTIONS
296# define MRPT_TRY_START \
302# define MRPT_TRY_END \
304 catch (std::bad_alloc &) \
306 catch (std::exception &e) \
308 THROW_STACKED_EXCEPTION(e); \
312 THROW_EXCEPTION("Unexpected runtime error!"); \
318# define MRPT_TRY_END_WITH_CLEAN_UP(stuff) \
320 catch (std::bad_alloc &) \
322 catch (std::exception &e) \
325 THROW_STACKED_EXCEPTION(e); \
330 THROW_EXCEPTION("Unexpected runtime error!"); \
334# define MRPT_TRY_START
336# define MRPT_TRY_END_WITH_CLEAN_UP(stuff)
339#if MRPT_ENABLE_EMBEDDED_GLOBAL_PROFILER
340# define MRPT_PROFILE_FUNC_START ::mrpt::utils::CProfilerProxy BOOST_JOIN(__dum_var,__LINE__)( __CURRENT_FUNCTION_NAME__);
342# define MRPT_PROFILE_FUNC_START
350 MRPT_PROFILE_FUNC_START \
356#define MRPT_END_WITH_CLEAN_UP(stuff) \
357 MRPT_TRY_END_WITH_CLEAN_UP(stuff)
363# define M_2PI 6.283185307179586476925286766559
366#define M_PIf 3.14159265358979f
367#define M_2PIf 6.28318530717959f
369#if defined(HAVE_LONG_DOUBLE) && !defined(M_PIl)
370# define M_PIl 3.14159265358979323846264338327950288L
371# define M_2PIl (2.0L*3.14159265358979323846264338327950288L)
377# define MRPT_printf_format_check(_FMT_,_VARARGS_) __attribute__ ((__format__ (__printf__, _FMT_,_VARARGS_)))
379# define MRPT_printf_format_check(_FMT_,_VARARGS_)
384# define MRPT_scanf_format_check(_FMT_,_VARARGS_) __attribute__ ((__format__ (__scanf__, _FMT_,_VARARGS_)))
386# define MRPT_scanf_format_check(_FMT_,_VARARGS_)
391#define MRPT_NO_THROWS throw()
394#if (defined _MSC_VER) || (defined __INTEL_COMPILER)
395#define MRPT_FORCE_INLINE __forceinline
397#define MRPT_FORCE_INLINE inline
401#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_AMD64) || defined (_M_X64) \
402 || defined (__i386__)|| defined (__i386) || defined (_M_I86) || defined (i386) || defined(_M_IX86) || defined (_X86_)
403# define MRPT_IS_X86_AMD64 1
#define MRPT_printf_format_check(_FMT_, _VARARGS_)
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
std::string BASE_IMPEXP format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.