efl/src/bindings/eina_cxx/eina_log.hh

127 lines
4.0 KiB
C++

#ifndef EFL_EINA_LOG_HH
#define EFL_EINA_LOG_HH
#include <sstream>
namespace efl { namespace eina {
namespace log_level {
struct critical_t { static constexpr ::Eina_Log_Level value = ::EINA_LOG_LEVEL_CRITICAL; };
critical_t const critical = {};
struct error_t { static constexpr ::Eina_Log_Level value = ::EINA_LOG_LEVEL_ERR; };
error_t const error = {};
struct info_t { static constexpr ::Eina_Log_Level value = ::EINA_LOG_LEVEL_INFO; };
info_t const info = {};
struct debug_t { static constexpr ::Eina_Log_Level value = ::EINA_LOG_LEVEL_DBG; };
debug_t const debug = {};
struct warn_t { static constexpr ::Eina_Log_Level value = ::EINA_LOG_LEVEL_WARN; };
warn_t const warning = {};
}
template <typename D>
struct _domain_base
{
void set_level(log_level::critical_t l) { set_level(l.value); }
void set_level(log_level::error_t l) { set_level(l.value); }
void set_level(log_level::info_t l) { set_level(l.value); }
void set_level(log_level::debug_t l) { set_level(l.value); }
void set_level(log_level::warn_t l) { set_level(l.value); }
void set_level( ::Eina_Log_Level l)
{
::eina_log_domain_registered_level_set(static_cast<D&>(*this).domain_raw(), l);
}
::Eina_Log_Level get_level() const
{
return static_cast< ::Eina_Log_Level>
(::eina_log_domain_registered_level_get(static_cast<D const&>(*this).domain_raw()));
}
};
struct global_domain : _domain_base<global_domain>
{
int domain_raw() const { return EINA_LOG_DOMAIN_GLOBAL; }
};
struct global_domain const global_domain = {};
struct default_domain : _domain_base<default_domain>
{
int domain_raw() const { return EINA_LOG_DOMAIN_DEFAULT; }
};
struct default_domain const default_domain = {};
struct log_domain : _domain_base<log_domain>
{
log_domain(char const* name, char const* color = "black")
: _domain( ::eina_log_domain_register(name, color))
{
}
~log_domain()
{
::eina_log_domain_unregister(_domain);
}
int domain_raw() const { return _domain; }
private:
int _domain;
};
inline void _log(std::stringstream const& stream, int domain, ::Eina_Log_Level level
, const char* file, const char* function, int line)
{
::eina_log_print(domain, level, file, function, line
, "%s", stream.str().c_str());
}
#define EINA_CXX_DOM_LOG(DOMAIN, LEVEL, EXPR) \
if( ::eina_log_domain_level_check((DOMAIN), LEVEL)) \
{ \
std::stringstream stream; \
stream << EXPR; \
::efl::eina::_log(std::move(stream), (DOMAIN), LEVEL \
, __FILE__, __FUNCTION__, __LINE__); \
}
#define EINA_CXX_DOM_LOG_CRIT(DOMAIN, EXPR) \
EINA_CXX_DOM_LOG(DOMAIN.domain_raw(), ::EINA_LOG_LEVEL_CRITICAL, EXPR)
#define EINA_CXX_DOM_LOG_ERR(DOMAIN, EXPR) \
EINA_CXX_DOM_LOG(DOMAIN.domain_raw(), ::EINA_LOG_LEVEL_ERR, EXPR)
#define EINA_CXX_DOM_LOG_INFO(DOMAIN, EXPR) \
EINA_CXX_DOM_LOG(DOMAIN.domain_raw(), ::EINA_LOG_LEVEL_INFO, EXPR)
#define EINA_CXX_DOM_LOG_DBG(DOMAIN, EXPR) \
EINA_CXX_DOM_LOG(DOMAIN.domain_raw(), ::EINA_LOG_LEVEL_DBG, EXPR)
#define EINA_CXX_DOM_LOG_WARN(DOMAIN, EXPR) \
EINA_CXX_DOM_LOG(DOMAIN.domain_raw(), ::EINA_LOG_LEVEL_WARN, EXPR)
#define EINA_CXX_LOG(LEVEL, EXPR) \
EINA_CXX_DOM_LOG(EINA_LOG_DOMAIN_DEFAULT, LEVEL, EXPR)
#define EINA_CXX_LOG_CRIT(EXPR) \
EINA_CXX_LOG(EINA_LOG_LEVEL_CRITICAL, EXPR)
#define EINA_CXX_LOG_ERR(EXPR) \
EINA_CXX_LOG(EINA_LOG_LEVEL_ERR, EXPR)
#define EINA_CXX_LOG_INFO(EXPR) \
EINA_CXX_LOG(EINA_LOG_LEVEL_INFO, EXPR)
#define EINA_CXX_LOG_DBG(EXPR) \
EINA_CXX_LOG(EINA_LOG_LEVEL_DBG, EXPR)
#define EINA_CXX_LOG_WARN(EXPR) \
EINA_CXX_LOG(EINA_LOG_LEVEL_WARN, EXPR)
} }
#endif