mirror of
https://github.com/enduro2d/enduro2d.git
synced 2025-12-14 16:09:06 +07:00
rename debug add_sink to register_sink. add unregister_sink.
This commit is contained in:
@@ -18,7 +18,6 @@ namespace e2d
|
||||
error,
|
||||
fatal
|
||||
};
|
||||
|
||||
class sink : private e2d::noncopyable {
|
||||
public:
|
||||
virtual ~sink() noexcept = default;
|
||||
@@ -27,15 +26,16 @@ namespace e2d
|
||||
using sink_uptr = std::unique_ptr<sink>;
|
||||
public:
|
||||
debug();
|
||||
~debug();
|
||||
~debug() noexcept;
|
||||
|
||||
template < typename T, typename... Args >
|
||||
T& add_sink(Args&&... args);
|
||||
sink& add_sink(sink_uptr sink);
|
||||
T& register_sink(Args&&... args);
|
||||
sink& register_sink(sink_uptr sink);
|
||||
void unregister_sink(const sink& sink);
|
||||
|
||||
template < typename T, typename... Args >
|
||||
T& add_sink_ex(level min_lvl, Args&&... args);
|
||||
sink& add_sink_ex(level min_lvl, sink_uptr sink);
|
||||
T& register_sink_ex(level min_lvl, Args&&... args);
|
||||
sink& register_sink_ex(level min_lvl, sink_uptr sink);
|
||||
|
||||
void set_min_level(level lvl) noexcept;
|
||||
level min_level() const noexcept;
|
||||
@@ -56,8 +56,8 @@ namespace e2d
|
||||
debug& fatal(str_view fmt, Args&&... args);
|
||||
private:
|
||||
mutable std::mutex mutex_;
|
||||
level min_level_ = level::trace;
|
||||
vector<std::pair<level, sink_uptr>> sinks_;
|
||||
level min_level_ = level::trace;
|
||||
};
|
||||
|
||||
class debug_file_sink final : public debug::sink {
|
||||
@@ -77,28 +77,17 @@ namespace e2d
|
||||
namespace e2d
|
||||
{
|
||||
template < typename T, typename... Args >
|
||||
T& debug::add_sink(Args&&... args) {
|
||||
return add_sink_ex<T>(level::trace, std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
inline debug::sink& debug::add_sink(sink_uptr sink) {
|
||||
return add_sink_ex(level::trace, std::move(sink));
|
||||
T& debug::register_sink(Args&&... args) {
|
||||
return register_sink_ex<T>(level::trace, std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
template < typename T, typename... Args >
|
||||
T& debug::add_sink_ex(level min_lvl, Args&&... args) {
|
||||
return static_cast<T&>(add_sink_ex(
|
||||
T& debug::register_sink_ex(level min_lvl, Args&&... args) {
|
||||
return static_cast<T&>(register_sink_ex(
|
||||
min_lvl,
|
||||
std::make_unique<T>(std::forward<Args>(args)...)));
|
||||
}
|
||||
|
||||
inline debug::sink& debug::add_sink_ex(level min_lvl, sink_uptr sink) {
|
||||
E2D_ASSERT(sink);
|
||||
std::lock_guard<std::mutex> guard(mutex_);
|
||||
sinks_.push_back(std::make_pair(min_lvl, std::move(sink)));
|
||||
return *sinks_.back().second;
|
||||
}
|
||||
|
||||
template < typename... Args >
|
||||
debug& debug::log(level lvl, str_view fmt, Args&&... args) {
|
||||
std::lock_guard<std::mutex> guard(mutex_);
|
||||
|
||||
@@ -13,7 +13,7 @@ int e2d_main() {
|
||||
window& w = modules::initialize<window>(
|
||||
v2u{640, 480}, "Enduro2D", true, false);
|
||||
|
||||
d.add_sink<debug_console_sink>();
|
||||
d.register_sink<debug_console_sink>();
|
||||
w.register_event_listener<window_input_source>(i);
|
||||
w.register_event_listener<window_trace_event_listener>(d);
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ int e2d_main() {
|
||||
window& w = modules::initialize<window>(
|
||||
v2u{640, 480}, "Enduro2D", true, false);
|
||||
|
||||
d.add_sink<debug_console_sink>();
|
||||
d.register_sink<debug_console_sink>();
|
||||
w.register_event_listener<window_input_source>(i);
|
||||
w.register_event_listener<window_trace_event_listener>(d);
|
||||
|
||||
|
||||
@@ -10,35 +10,50 @@ namespace
|
||||
{
|
||||
using namespace e2d;
|
||||
|
||||
const char* level_to_str(debug::level lvl) noexcept {
|
||||
switch ( lvl ) {
|
||||
case debug::level::trace: return "trace";
|
||||
case debug::level::warning: return "warning";
|
||||
case debug::level::error: return "error";
|
||||
case debug::level::fatal: return "fatal";
|
||||
const char* level_to_cstr(debug::level l) noexcept {
|
||||
#define DEFINE_CASE(x) case debug::level::x: return #x
|
||||
switch ( l ) {
|
||||
DEFINE_CASE(trace);
|
||||
DEFINE_CASE(warning);
|
||||
DEFINE_CASE(error);
|
||||
DEFINE_CASE(fatal);
|
||||
default:
|
||||
E2D_ASSERT(false);
|
||||
E2D_ASSERT_MSG(false, "unexpected level");
|
||||
return "unknown";
|
||||
}
|
||||
#undef DEFINE_CASE
|
||||
}
|
||||
|
||||
str log_text_format(debug::level lvl, str_view text) {
|
||||
return strings::rformat(
|
||||
"[%0](%1) -> %2\n",
|
||||
level_to_str(lvl), time::now_ms(), text);
|
||||
level_to_cstr(lvl), time::now_ms(), text);
|
||||
}
|
||||
}
|
||||
|
||||
namespace e2d
|
||||
{
|
||||
//
|
||||
// debug
|
||||
//
|
||||
debug::debug() = default;
|
||||
debug::~debug() noexcept = default;
|
||||
|
||||
debug::debug() {
|
||||
debug::sink& debug::register_sink(sink_uptr sink) {
|
||||
return register_sink_ex(level::trace, std::move(sink));
|
||||
}
|
||||
|
||||
debug::~debug() {
|
||||
void debug::unregister_sink(const sink& sink) {
|
||||
std::lock_guard<std::mutex> guard(mutex_);
|
||||
sinks_.erase(std::remove_if(
|
||||
sinks_.begin(), sinks_.end(),
|
||||
[&sink](const std::pair<level, sink_uptr>& p){
|
||||
return p.second.get() == &sink;
|
||||
}), sinks_.end());
|
||||
}
|
||||
|
||||
debug::sink& debug::register_sink_ex(level min_lvl, sink_uptr sink) {
|
||||
E2D_ASSERT(sink);
|
||||
std::lock_guard<std::mutex> guard(mutex_);
|
||||
sinks_.push_back(std::make_pair(min_lvl, std::move(sink)));
|
||||
return *sinks_.back().second;
|
||||
}
|
||||
|
||||
void debug::set_min_level(level lvl) noexcept {
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace
|
||||
TEST_CASE("debug"){
|
||||
{
|
||||
debug d;
|
||||
test_sink& s = d.add_sink<test_sink>();
|
||||
test_sink& s = d.register_sink<test_sink>();
|
||||
REQUIRE(s.on_message_acc.empty());
|
||||
d.trace("h");
|
||||
d.warning("e");
|
||||
@@ -39,11 +39,14 @@ TEST_CASE("debug"){
|
||||
REQUIRE(s.on_message_acc == "hell");
|
||||
d.fatal("o");
|
||||
REQUIRE(s.on_message_acc == "hello");
|
||||
d.unregister_sink(s);
|
||||
d.fatal("!!!");
|
||||
REQUIRE(s.on_message_acc == "hello");
|
||||
}
|
||||
{
|
||||
modules::initialize<debug>();
|
||||
test_sink& s1 = the<debug>().add_sink_ex<test_sink>(debug::level::warning);
|
||||
test_sink& s2 = the<debug>().add_sink_ex<test_sink>(debug::level::error);
|
||||
test_sink& s1 = the<debug>().register_sink_ex<test_sink>(debug::level::warning);
|
||||
test_sink& s2 = the<debug>().register_sink_ex<test_sink>(debug::level::error);
|
||||
REQUIRE(s1.on_message_acc.empty());
|
||||
REQUIRE(s2.on_message_acc.empty());
|
||||
the<debug>().trace("w");
|
||||
|
||||
Reference in New Issue
Block a user