14#ifndef INCLUDED_SAL_LOG_HXX
15#define INCLUDED_SAL_LOG_HXX
33enum sal_detail_LogAction
35 SAL_DETAIL_LOG_ACTION_IGNORE,
36 SAL_DETAIL_LOG_ACTION_LOG,
37 SAL_DETAIL_LOG_ACTION_FATAL
41 sal_detail_LogLevel level,
char const * area,
char const * where,
42 char const * message, sal_uInt32 backtraceDepth);
44extern "C" SAL_DLLPUBLIC void SAL_CALL sal_detail_set_log_selector(
char const *logSelector);
48extern "C" SAL_DLLPUBLIC unsigned char SAL_CALL sal_detail_log_report(
49 sal_detail_LogLevel level,
char const * area);
51namespace sal {
namespace detail {
54 sal_detail_LogLevel level,
char const * area,
char const * where,
55 std::ostringstream
const & stream, sal_uInt32 backtraceDepth)
65 sal_detail_log(level, area, where, stream.str().c_str(), backtraceDepth);
74 StreamString(
char const * s): string(s) {}
82 typedef struct {
char a[2]; } Result;
85inline StreamString operator <<(
88 return StreamString(s);
91template<
typename T >
inline StreamIgnore operator <<(
95#if defined _MSC_VER && _MSC_VER < 1700
96 return StreamIgnore();
100template<
typename T >
inline StreamIgnore operator <<(
104#if defined _MSC_VER && _MSC_VER < 1700
105 return StreamIgnore();
109template<
typename T >
inline StreamIgnore operator <<(
113#if defined _MSC_VER && _MSC_VER < 1700
114 return StreamIgnore();
118template<
typename T >
typename T::Result getResult(T
const &);
120inline char const * unwrapStream(StreamString
const & s) {
return s.string; }
124#if defined _MSC_VER && _MSC_VER < 1700
133#define SAL_DETAIL_LOG_STREAM_PRIVATE_(level, area, where, stream) \
134 if (sizeof ::sal::detail::getResult( \
135 ::sal::detail::StreamStart() << stream) == 1) \
138 (level), (area), (where), \
139 ::sal::detail::unwrapStream( \
140 ::sal::detail::StreamStart() << stream), \
143 ::std::ostringstream sal_detail_stream; \
144 sal_detail_stream << stream; \
145 ::sal::detail::log( \
146 (level), (area), (where), sal_detail_stream, 0); \
149#if defined LIBO_INTERNAL_ONLY && defined __GNUC__ && !defined __clang__
151#define SAL_DETAIL_LOG_STREAM(condition, level, area, where, stream) \
153 if (SAL_UNLIKELY(condition)) \
155 [&]() __attribute__((noinline,cold)) \
157 switch (sal_detail_log_report(level, area)) \
159 case SAL_DETAIL_LOG_ACTION_IGNORE: break; \
160 case SAL_DETAIL_LOG_ACTION_LOG: \
161 SAL_DETAIL_LOG_STREAM_PRIVATE_(level, area, where, stream); \
163 case SAL_DETAIL_LOG_ACTION_FATAL: \
164 SAL_DETAIL_LOG_STREAM_PRIVATE_(level, area, where, stream); \
172#define SAL_DETAIL_LOG_STREAM(condition, level, area, where, stream) \
174 if (SAL_UNLIKELY(condition)) \
176 switch (sal_detail_log_report(level, area)) \
178 case SAL_DETAIL_LOG_ACTION_IGNORE: break; \
179 case SAL_DETAIL_LOG_ACTION_LOG: \
180 SAL_DETAIL_LOG_STREAM_PRIVATE_(level, area, where, stream); \
182 case SAL_DETAIL_LOG_ACTION_FATAL: \
183 SAL_DETAIL_LOG_STREAM_PRIVATE_(level, area, where, stream); \
203#define SAL_WHERE SAL_DETAIL_WHERE
219#if defined _LIBCPP_VERSION \
220 || (defined _GLIBCXX_RELEASE \
221 && (_GLIBCXX_RELEASE >= 12 || (_GLIBCXX_RELEASE == 11 && __GLIBCXX__ > 20210428))) \
222 || (defined _MSC_VER && _MSC_VER >= 1915)
223#define SAL_STREAM(stream) \
224 (::std::ostringstream() << stream).str()
226#define SAL_STREAM(stream) \
227 (dynamic_cast< ::std::ostringstream & >(::std::ostringstream() << stream).str())
368#define SAL_INFO(area, stream) \
369 SAL_DETAIL_LOG_STREAM( \
370 SAL_DETAIL_ENABLE_LOG_INFO, ::SAL_DETAIL_LOG_LEVEL_INFO, area, \
378#define SAL_INFO_IF(condition, area, stream) \
379 SAL_DETAIL_LOG_STREAM( \
380 SAL_DETAIL_ENABLE_LOG_INFO && (condition), \
381 ::SAL_DETAIL_LOG_LEVEL_INFO, area, SAL_WHERE, stream)
388#define SAL_WARN(area, stream) \
389 SAL_DETAIL_LOG_STREAM( \
390 SAL_DETAIL_ENABLE_LOG_WARN, ::SAL_DETAIL_LOG_LEVEL_WARN, area, \
398#define SAL_WARN_IF(condition, area, stream) \
399 SAL_DETAIL_LOG_STREAM( \
400 SAL_DETAIL_ENABLE_LOG_WARN && (condition), \
401 ::SAL_DETAIL_LOG_LEVEL_WARN, area, SAL_WHERE, stream)
409#define SAL_DEBUG(stream) \
410 SAL_DETAIL_LOG_STREAM( \
411 SAL_LOG_TRUE, ::SAL_DETAIL_LOG_LEVEL_DEBUG, NULL, NULL, stream)
420#define SAL_DEBUG_IF(condition, stream) \
421 SAL_DETAIL_LOG_STREAM( \
422 (condition), ::SAL_DETAIL_LOG_LEVEL_DEBUG, NULL, NULL, stream)
438#define SAL_DEBUG_BACKTRACE(stream, backtraceDepth) \
440 if (sizeof ::sal::detail::getResult( \
441 ::sal::detail::StreamStart() << stream) == 1) \
444 ::SAL_DETAIL_LOG_LEVEL_DEBUG, NULL, NULL, \
445 ::sal::detail::unwrapStream( \
446 ::sal::detail::StreamStart() << stream), \
449 ::std::ostringstream sal_detail_stream; \
450 sal_detail_stream << stream; \
451 ::sal::detail::log( \
452 ::SAL_DETAIL_LOG_LEVEL_DEBUG, NULL, NULL, sal_detail_stream, \
#define SAL_DLLPUBLIC
Definition saldllapi.h:34
#define SAL_UNUSED_PARAMETER
Annotate unused but required C++ function parameters.
Definition types.h:592