// // 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 <algorithm> #include <mutex> #include <memory> #include <vector> // Distribution sink (mux). Stores a vector of sinks which get called when log is called namespace spdlog { namespace sinks { template<class Mutex> class dist_sink: public base_sink<Mutex> { public: explicit dist_sink() :_sinks() {} dist_sink(const dist_sink&) = delete; dist_sink& operator=(const dist_sink&) = delete; virtual ~dist_sink() = default; protected: std::vector<std::shared_ptr<sink>> _sinks; void _sink_it(const details::log_msg& msg) override { for (auto &sink : _sinks) { if( sink->should_log( msg.level)) { sink->log(msg); } } } public: void flush() override { std::lock_guard<Mutex> lock(base_sink<Mutex>::_mutex); for (auto &sink : _sinks) sink->flush(); } void add_sink(std::shared_ptr<sink> sink) { std::lock_guard<Mutex> lock(base_sink<Mutex>::_mutex); _sinks.push_back(sink); } void remove_sink(std::shared_ptr<sink> sink) { std::lock_guard<Mutex> lock(base_sink<Mutex>::_mutex); _sinks.erase(std::remove(_sinks.begin(), _sinks.end(), sink), _sinks.end()); } }; typedef dist_sink<std::mutex> dist_sink_mt; typedef dist_sink<details::null_mutex> dist_sink_st; } }