#ifndef DMSDK_LOG_H
#define DMSDK_LOG_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef enum LogSeverity
{
LOG_SEVERITY_DEBUG = 0, LOG_SEVERITY_USER_DEBUG = 1, LOG_SEVERITY_INFO = 2, LOG_SEVERITY_WARNING = 3, LOG_SEVERITY_ERROR = 4, LOG_SEVERITY_FATAL = 5,} LogSeverity;
#if defined(NDEBUG)
#define dmLogDebug(format, ... ) do {} while(0);
#define dmLogUserDebug(format, ... ) do {} while(0);
#define dmLogInfo(format, args...) do {} while(0);
#define dmLogWarning(format, args...) do {} while(0);
#define dmLogError(format, args...) do {} while(0);
#define dmLogFatal(format, args...) do {} while(0);
#define dmLogOnceDebug(format, args... ) do {} while(0);
#define dmLogOnceUserDebug(format, args... ) do {} while(0);
#define dmLogOnceInfo(format, args... ) do {} while(0);
#define dmLogOnceWarning(format, args... ) do {} while(0);
#define dmLogOnceError(format, args... ) do {} while(0);
#define dmLogOnceFatal(format, args... ) do {} while(0);
#else
#ifndef DLIB_LOG_DOMAIN
#define DLIB_LOG_DOMAIN "DEFAULT"
#ifdef __GNUC__
#warning "DLIB_LOG_DOMAIN is not defined"
#endif
#endif
#ifdef __GNUC__
void LogInternal(LogSeverity severity, const char* domain, const char* format, ...)
__attribute__ ((format (printf, 3, 4)));
#else
void LogInternal(LogSeverity severity, const char* domain, const char* format, ...);
#endif
#ifdef _MSC_VER
#define dmLogDebug(format, ... ) LogInternal(LOG_SEVERITY_DEBUG, DLIB_LOG_DOMAIN, format, __VA_ARGS__ );
#define dmLogUserDebug(format, ... ) LogInternal(LOG_SEVERITY_USER_DEBUG, DLIB_LOG_DOMAIN, format, __VA_ARGS__ );
#define dmLogInfo(format, ... ) LogInternal(LOG_SEVERITY_INFO, DLIB_LOG_DOMAIN, format, __VA_ARGS__ );
#define dmLogWarning(format, ... ) LogInternal(LOG_SEVERITY_WARNING, DLIB_LOG_DOMAIN, format, __VA_ARGS__ );
#define dmLogError(format, ... ) LogInternal(LOG_SEVERITY_ERROR, DLIB_LOG_DOMAIN, format, __VA_ARGS__ );
#define dmLogFatal(format, ... ) LogInternal(LOG_SEVERITY_FATAL, DLIB_LOG_DOMAIN, format, __VA_ARGS__ );
#else
#define dmLogDebug(format, args...) LogInternal(LOG_SEVERITY_DEBUG, DLIB_LOG_DOMAIN, format, ## args);
#define dmLogUserDebug(format, args...) LogInternal(LOG_SEVERITY_USER_DEBUG, DLIB_LOG_DOMAIN, format, ## args);
#define dmLogInfo(format, args...) LogInternal(LOG_SEVERITY_INFO, DLIB_LOG_DOMAIN, format, ## args);
#define dmLogWarning(format, args...) LogInternal(LOG_SEVERITY_WARNING, DLIB_LOG_DOMAIN, format, ## args);
#define dmLogError(format, args...) LogInternal(LOG_SEVERITY_ERROR, DLIB_LOG_DOMAIN, format, ## args);
#define dmLogFatal(format, args...) LogInternal(LOG_SEVERITY_FATAL, DLIB_LOG_DOMAIN, format, ## args);
#endif
#define dmLogOnceIdentifier __dmLogOnce
#define __DM_LOG_PASTE(x, y) x ## y
#define DM_LOG_PASTE(x, y) __DM_LOG_PASTE(x, y)
#ifdef _MSC_VER
#define dmLogOnceInternal(method, format, ... ) \
{ \
static int DM_LOG_PASTE(dmLogOnceIdentifier, __LINE__) = 0; \
if (DM_LOG_PASTE(dmLogOnceIdentifier, __LINE__) == 0) \
{ \
DM_LOG_PASTE(dmLogOnceIdentifier, __LINE__) = 1; \
method(format, __VA_ARGS__ ); \
} \
}
#define dmLogOnceDebug(format, ... ) dmLogOnceInternal(dmLogDebug, format, __VA_ARGS__ )
#define dmLogOnceUserDebug(format, ... ) dmLogOnceInternal(dmLogUserDebug, format, __VA_ARGS__ )
#define dmLogOnceInfo(format, ... ) dmLogOnceInternal(dmLogInfo, format, __VA_ARGS__ )
#define dmLogOnceWarning(format, ... ) dmLogOnceInternal(dmLogWarning, format, __VA_ARGS__ )
#define dmLogOnceError(format, ... ) dmLogOnceInternal(dmLogError, format, __VA_ARGS__ )
#define dmLogOnceFatal(format, ... ) dmLogOnceInternal(dmLogFatal, format, __VA_ARGS__ )
#else
#define dmLogOnceInternal(method, format, args... ) \
{ \
static int DM_LOG_PASTE(dmLogOnceIdentifier, __LINE__) = 0; \
if (DM_LOG_PASTE(dmLogOnceIdentifier, __LINE__) == 0) \
{ \
DM_LOG_PASTE(dmLogOnceIdentifier, __LINE__) = 1; \
method(format, ## args ); \
} \
}
#define dmLogOnceDebug(format, args... ) dmLogOnceInternal(dmLogDebug, format, ## args )
#define dmLogOnceUserDebug(format, args... ) dmLogOnceInternal(dmLogUserDebug, format, ## args )
#define dmLogOnceInfo(format, args... ) dmLogOnceInternal(dmLogInfo, format, ## args )
#define dmLogOnceWarning(format, args... ) dmLogOnceInternal(dmLogWarning, format, ## args )
#define dmLogOnceError(format, args... ) dmLogOnceInternal(dmLogError, format, ## args )
#define dmLogOnceFatal(format, args... ) dmLogOnceInternal(dmLogFatal, format, ## args )
#endif
typedef void (*FLogListener)(LogSeverity severity, const char* domain, const char* formatted_string);
void dmLogRegisterListener(FLogListener listener);
void dmLogUnregisterListener(FLogListener listener);
void dmLogSetLevel(LogSeverity severity);
LogSeverity dmLogGetLevel();
#endif
#ifdef __cplusplus
} #endif
#ifdef __cplusplus
namespace dmLog
{
void RegisterLogListener(FLogListener listener);
void UnregisterLogListener(FLogListener listener);
void Setlevel(LogSeverity severity);
}
#endif
#endif