30 #ifndef INCLUDED_SAL_LOG_HXX
31 #define INCLUDED_SAL_LOG_HXX
50 enum sal_detail_LogLevel level,
char const * area,
char const * where,
51 char const * message);
53 namespace sal {
namespace detail {
55 inline void SAL_CALL log(
56 sal_detail_LogLevel level,
char const * area,
char const * where,
57 std::ostringstream
const & stream)
67 sal_detail_log(level, area, where, stream.str().c_str());
73 struct StreamStart {};
76 StreamString(
char const * s): string(s) {}
84 typedef struct {
char a[2]; } Result;
90 return StreamString(s);
93 template<
typename T >
inline StreamIgnore
operator <<(
97 #if defined _MSC_VER && _MSC_VER < 1700
98 return StreamIgnore();
102 template<
typename T >
inline StreamIgnore
operator <<(
106 #if defined _MSC_VER && _MSC_VER < 1700
107 return StreamIgnore();
111 template<
typename T >
inline StreamIgnore
operator <<(
115 #if defined _MSC_VER && _MSC_VER < 1700
116 return StreamIgnore();
120 template<
typename T >
typename T::Result getResult(T
const &);
122 inline char const * unwrapStream(StreamString
const & s) {
return s.string; }
126 #if defined _MSC_VER && _MSC_VER < 1700
133 #define SAL_DETAIL_LOG_STREAM(condition, level, area, where, stream) \
136 if (sizeof ::sal::detail::getResult( \
137 ::sal::detail::StreamStart() << stream) == 1) \
140 (level), (area), (where), \
141 ::sal::detail::unwrapStream( \
142 ::sal::detail::StreamStart() << stream)); \
144 ::std::ostringstream sal_detail_stream; \
145 sal_detail_stream << stream; \
146 ::sal::detail::log( \
147 (level), (area), (where), sal_detail_stream); \
164 #define SAL_WHERE SAL_DETAIL_WHERE
180 #define SAL_STREAM(stream) \
181 (dynamic_cast< ::std::ostringstream & >(::std::ostringstream() << stream). \
281 #define SAL_INFO(area, stream) \
282 SAL_DETAIL_LOG_STREAM( \
283 SAL_DETAIL_ENABLE_LOG_INFO, ::SAL_DETAIL_LOG_LEVEL_INFO, area, \
291 #define SAL_INFO_IF(condition, area, stream) \
292 SAL_DETAIL_LOG_STREAM( \
293 SAL_DETAIL_ENABLE_LOG_INFO && (condition), \
294 ::SAL_DETAIL_LOG_LEVEL_INFO, area, SAL_WHERE, stream)
301 #define SAL_WARN(area, stream) \
302 SAL_DETAIL_LOG_STREAM( \
303 SAL_DETAIL_ENABLE_LOG_WARN, ::SAL_DETAIL_LOG_LEVEL_WARN, area, \
311 #define SAL_WARN_IF(condition, area, stream) \
312 SAL_DETAIL_LOG_STREAM( \
313 SAL_DETAIL_ENABLE_LOG_WARN && (condition), \
314 ::SAL_DETAIL_LOG_LEVEL_WARN, area, SAL_WHERE, stream)
322 #define SAL_DEBUG(stream) \
323 SAL_DETAIL_LOG_STREAM( \
324 SAL_LOG_TRUE, ::SAL_DETAIL_LOG_LEVEL_DEBUG, 0, 0, stream)