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
28 # define MRPT_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 ) ); \
217 # define ASSERT_(f) \
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
335 # define MRPT_TRY_END
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.