rename debug add_sink to register_sink. add unregister_sink.

This commit is contained in:
2018-10-02 17:52:16 +07:00
parent 63065596b5
commit 8caca3d7d2
5 changed files with 47 additions and 40 deletions

View File

@@ -18,7 +18,6 @@ namespace e2d
error, error,
fatal fatal
}; };
class sink : private e2d::noncopyable { class sink : private e2d::noncopyable {
public: public:
virtual ~sink() noexcept = default; virtual ~sink() noexcept = default;
@@ -27,15 +26,16 @@ namespace e2d
using sink_uptr = std::unique_ptr<sink>; using sink_uptr = std::unique_ptr<sink>;
public: public:
debug(); debug();
~debug(); ~debug() noexcept;
template < typename T, typename... Args > template < typename T, typename... Args >
T& add_sink(Args&&... args); T& register_sink(Args&&... args);
sink& add_sink(sink_uptr sink); sink& register_sink(sink_uptr sink);
void unregister_sink(const sink& sink);
template < typename T, typename... Args > template < typename T, typename... Args >
T& add_sink_ex(level min_lvl, Args&&... args); T& register_sink_ex(level min_lvl, Args&&... args);
sink& add_sink_ex(level min_lvl, sink_uptr sink); sink& register_sink_ex(level min_lvl, sink_uptr sink);
void set_min_level(level lvl) noexcept; void set_min_level(level lvl) noexcept;
level min_level() const noexcept; level min_level() const noexcept;
@@ -56,8 +56,8 @@ namespace e2d
debug& fatal(str_view fmt, Args&&... args); debug& fatal(str_view fmt, Args&&... args);
private: private:
mutable std::mutex mutex_; mutable std::mutex mutex_;
level min_level_ = level::trace;
vector<std::pair<level, sink_uptr>> sinks_; vector<std::pair<level, sink_uptr>> sinks_;
level min_level_ = level::trace;
}; };
class debug_file_sink final : public debug::sink { class debug_file_sink final : public debug::sink {
@@ -77,28 +77,17 @@ namespace e2d
namespace e2d namespace e2d
{ {
template < typename T, typename... Args > template < typename T, typename... Args >
T& debug::add_sink(Args&&... args) { T& debug::register_sink(Args&&... args) {
return add_sink_ex<T>(level::trace, std::forward<Args>(args)...); return register_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));
} }
template < typename T, typename... Args > template < typename T, typename... Args >
T& debug::add_sink_ex(level min_lvl, Args&&... args) { T& debug::register_sink_ex(level min_lvl, Args&&... args) {
return static_cast<T&>(add_sink_ex( return static_cast<T&>(register_sink_ex(
min_lvl, min_lvl,
std::make_unique<T>(std::forward<Args>(args)...))); 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 > template < typename... Args >
debug& debug::log(level lvl, str_view fmt, Args&&... args) { debug& debug::log(level lvl, str_view fmt, Args&&... args) {
std::lock_guard<std::mutex> guard(mutex_); std::lock_guard<std::mutex> guard(mutex_);

View File

@@ -13,7 +13,7 @@ int e2d_main() {
window& w = modules::initialize<window>( window& w = modules::initialize<window>(
v2u{640, 480}, "Enduro2D", true, false); 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_input_source>(i);
w.register_event_listener<window_trace_event_listener>(d); w.register_event_listener<window_trace_event_listener>(d);

View File

@@ -13,7 +13,7 @@ int e2d_main() {
window& w = modules::initialize<window>( window& w = modules::initialize<window>(
v2u{640, 480}, "Enduro2D", true, false); 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_input_source>(i);
w.register_event_listener<window_trace_event_listener>(d); w.register_event_listener<window_trace_event_listener>(d);

View File

@@ -10,35 +10,50 @@ namespace
{ {
using namespace e2d; using namespace e2d;
const char* level_to_str(debug::level lvl) noexcept { const char* level_to_cstr(debug::level l) noexcept {
switch ( lvl ) { #define DEFINE_CASE(x) case debug::level::x: return #x
case debug::level::trace: return "trace"; switch ( l ) {
case debug::level::warning: return "warning"; DEFINE_CASE(trace);
case debug::level::error: return "error"; DEFINE_CASE(warning);
case debug::level::fatal: return "fatal"; DEFINE_CASE(error);
DEFINE_CASE(fatal);
default: default:
E2D_ASSERT(false); E2D_ASSERT_MSG(false, "unexpected level");
return "unknown"; return "unknown";
} }
#undef DEFINE_CASE
} }
str log_text_format(debug::level lvl, str_view text) { str log_text_format(debug::level lvl, str_view text) {
return strings::rformat( return strings::rformat(
"[%0](%1) -> %2\n", "[%0](%1) -> %2\n",
level_to_str(lvl), time::now_ms(), text); level_to_cstr(lvl), time::now_ms(), text);
} }
} }
namespace e2d namespace e2d
{ {
// debug::debug() = default;
// debug 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 { void debug::set_min_level(level lvl) noexcept {

View File

@@ -26,7 +26,7 @@ namespace
TEST_CASE("debug"){ TEST_CASE("debug"){
{ {
debug d; debug d;
test_sink& s = d.add_sink<test_sink>(); test_sink& s = d.register_sink<test_sink>();
REQUIRE(s.on_message_acc.empty()); REQUIRE(s.on_message_acc.empty());
d.trace("h"); d.trace("h");
d.warning("e"); d.warning("e");
@@ -39,11 +39,14 @@ TEST_CASE("debug"){
REQUIRE(s.on_message_acc == "hell"); REQUIRE(s.on_message_acc == "hell");
d.fatal("o"); d.fatal("o");
REQUIRE(s.on_message_acc == "hello"); REQUIRE(s.on_message_acc == "hello");
d.unregister_sink(s);
d.fatal("!!!");
REQUIRE(s.on_message_acc == "hello");
} }
{ {
modules::initialize<debug>(); modules::initialize<debug>();
test_sink& s1 = the<debug>().add_sink_ex<test_sink>(debug::level::warning); test_sink& s1 = the<debug>().register_sink_ex<test_sink>(debug::level::warning);
test_sink& s2 = the<debug>().add_sink_ex<test_sink>(debug::level::error); test_sink& s2 = the<debug>().register_sink_ex<test_sink>(debug::level::error);
REQUIRE(s1.on_message_acc.empty()); REQUIRE(s1.on_message_acc.empty());
REQUIRE(s2.on_message_acc.empty()); REQUIRE(s2.on_message_acc.empty());
the<debug>().trace("w"); the<debug>().trace("w");