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) ) 259 #else // MRPT_HAS_ASSERT 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) { } 273 #endif // MRPT_HAS_ASSERT 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 // The 2*PI constant 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 std::string BASE_IMPEXP format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
#define MRPT_printf_format_check(_FMT_, _VARARGS_)
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.