// // Copyright (c) 2015 David Schury, Gabi Melman // Distributed under the MIT License (http://opensource.org/licenses/MIT) // #pragma once #include "../details/log_msg.h" #include "../details/null_mutex.h" #include "base_sink.h" #include "sink.h" #include #include #include #include // Distribution sink (mux). Stores a vector of sinks which get called when log is called namespace spdlog { namespace sinks { template class dist_sink : public base_sink { public: explicit dist_sink() : _sinks() { } dist_sink(const dist_sink &) = delete; dist_sink &operator=(const dist_sink &) = delete; protected: std::vector> _sinks; void _sink_it(const details::log_msg &msg) override { for (auto &sink : _sinks) { if (sink->should_log(msg.level)) { sink->log(msg); } } } void _flush() override { for (auto &sink : _sinks) sink->flush(); } public: void add_sink(std::shared_ptr sink) { std::lock_guard lock(base_sink::_mutex); _sinks.push_back(sink); } void remove_sink(std::shared_ptr sink) { std::lock_guard lock(base_sink::_mutex); _sinks.erase(std::remove(_sinks.begin(), _sinks.end(), sink), _sinks.end()); } void remove_all_sinks() { std::lock_guard lock(base_sink::_mutex); _sinks.clear(); } }; using dist_sink_mt = dist_sink; using dist_sink_st = dist_sink; } // namespace sinks } // namespace spdlog