10 #ifndef INCLUDED_SAL_LOG_HXX 11 #define INCLUDED_SAL_LOG_HXX 29 enum sal_detail_LogAction
31 SAL_DETAIL_LOG_ACTION_IGNORE,
32 SAL_DETAIL_LOG_ACTION_LOG,
33 SAL_DETAIL_LOG_ACTION_FATAL
37 sal_detail_LogLevel level,
char const * area,
char const * where,
38 char const * message, sal_uInt32 backtraceDepth);
42 extern "C" SAL_DLLPUBLIC unsigned char SAL_CALL sal_detail_log_report(
43 sal_detail_LogLevel level,
char const * area);
45 namespace sal {
namespace detail {
48 sal_detail_LogLevel level,
char const * area,
char const * where,
49 std::ostringstream
const & stream, sal_uInt32 backtraceDepth)
59 sal_detail_log(level, area, where, stream.str().c_str(), backtraceDepth);
65 struct StreamStart {};
68 StreamString(
char const * s): string(s) {}
76 typedef struct {
char a[2]; } Result;
82 return StreamString(s);
85 template<
typename T >
inline StreamIgnore
operator <<(
89 #if defined _MSC_VER && _MSC_VER < 1700 90 return StreamIgnore();
94 template<
typename T >
inline StreamIgnore
operator <<(
98 #if defined _MSC_VER && _MSC_VER < 1700 99 return StreamIgnore();
103 template<
typename T >
inline StreamIgnore
operator <<(
107 #if defined _MSC_VER && _MSC_VER < 1700 108 return StreamIgnore();
112 template<
typename T >
typename T::Result getResult(T
const &);
114 inline char const * unwrapStream(StreamString
const & s) {
return s.string; }
118 #if defined _MSC_VER && _MSC_VER < 1700 127 #define SAL_DETAIL_LOG_STREAM_PRIVATE_(level, area, where, stream) \ 128 if (sizeof ::sal::detail::getResult( \ 129 ::sal::detail::StreamStart() << stream) == 1) \ 132 (level), (area), (where), \ 133 ::sal::detail::unwrapStream( \ 134 ::sal::detail::StreamStart() << stream), \ 137 ::std::ostringstream sal_detail_stream; \ 138 sal_detail_stream << stream; \ 139 ::sal::detail::log( \ 140 (level), (area), (where), sal_detail_stream, 0); \ 143 #define SAL_DETAIL_LOG_STREAM(condition, level, area, where, stream) \ 147 switch (sal_detail_log_report(level, area)) \ 149 case SAL_DETAIL_LOG_ACTION_IGNORE: break; \ 150 case SAL_DETAIL_LOG_ACTION_LOG: \ 151 SAL_DETAIL_LOG_STREAM_PRIVATE_(level, area, where, stream); \ 153 case SAL_DETAIL_LOG_ACTION_FATAL: \ 154 SAL_DETAIL_LOG_STREAM_PRIVATE_(level, area, where, stream); \ 173 #define SAL_WHERE SAL_DETAIL_WHERE 189 #if defined _LIBCPP_VERSION \ 190 || (defined _GLIBCXX_RELEASE \ 191 && (_GLIBCXX_RELEASE >= 12 || (_GLIBCXX_RELEASE == 11 && __GLIBCXX__ > 20210428))) \ 192 || (defined _MSC_VER && _MSC_VER >= 1915) 193 #define SAL_STREAM(stream) \ 194 (::std::ostringstream() << stream).str() 196 #define SAL_STREAM(stream) \ 197 (dynamic_cast< ::std::ostringstream & >(::std::ostringstream() << stream).str()) 337 #define SAL_INFO(area, stream) \ 338 SAL_DETAIL_LOG_STREAM( \ 339 SAL_DETAIL_ENABLE_LOG_INFO, ::SAL_DETAIL_LOG_LEVEL_INFO, area, \ 347 #define SAL_INFO_IF(condition, area, stream) \ 348 SAL_DETAIL_LOG_STREAM( \ 349 SAL_DETAIL_ENABLE_LOG_INFO && (condition), \ 350 ::SAL_DETAIL_LOG_LEVEL_INFO, area, SAL_WHERE, stream) 357 #define SAL_WARN(area, stream) \ 358 SAL_DETAIL_LOG_STREAM( \ 359 SAL_DETAIL_ENABLE_LOG_WARN, ::SAL_DETAIL_LOG_LEVEL_WARN, area, \ 367 #define SAL_WARN_IF(condition, area, stream) \ 368 SAL_DETAIL_LOG_STREAM( \ 369 SAL_DETAIL_ENABLE_LOG_WARN && (condition), \ 370 ::SAL_DETAIL_LOG_LEVEL_WARN, area, SAL_WHERE, stream) 378 #define SAL_DEBUG(stream) \ 379 SAL_DETAIL_LOG_STREAM( \ 380 SAL_LOG_TRUE, ::SAL_DETAIL_LOG_LEVEL_DEBUG, NULL, NULL, stream) 396 #define SAL_DEBUG_BACKTRACE(stream, backtraceDepth) \ 398 if (sizeof ::sal::detail::getResult( \ 399 ::sal::detail::StreamStart() << stream) == 1) \ 402 ::SAL_DETAIL_LOG_LEVEL_DEBUG, NULL, NULL, \ 403 ::sal::detail::unwrapStream( \ 404 ::sal::detail::StreamStart() << stream), \ 407 ::std::ostringstream sal_detail_stream; \ 408 sal_detail_stream << stream; \ 409 ::sal::detail::log( \ 410 ::SAL_DETAIL_LOG_LEVEL_DEBUG, NULL, NULL, sal_detail_stream, \ std::basic_ostream< charT, traits > & operator<<(std::basic_ostream< charT, traits > &stream, OString const &rString)
Support for rtl::OString in std::ostream (and thus in CPPUNIT_ASSERT or SAL_INFO macros, for example).
Definition: string.hxx:2095
#define SAL_DLLPUBLIC
Definition: saldllapi.h:30
#define SAL_UNUSED_PARAMETER
Annotate unused but required C++ function parameters.
Definition: types.h:539