summaryrefslogtreecommitdiff
path: root/matching/include/spdlog/sinks/stdout_sinks.h
diff options
context:
space:
mode:
Diffstat (limited to 'matching/include/spdlog/sinks/stdout_sinks.h')
-rw-r--r--matching/include/spdlog/sinks/stdout_sinks.h102
1 files changed, 102 insertions, 0 deletions
diff --git a/matching/include/spdlog/sinks/stdout_sinks.h b/matching/include/spdlog/sinks/stdout_sinks.h
new file mode 100644
index 0000000..bf8e979
--- /dev/null
+++ b/matching/include/spdlog/sinks/stdout_sinks.h
@@ -0,0 +1,102 @@
+//
+// Copyright(c) 2015 Gabi Melman.
+// Distributed under the MIT License (http://opensource.org/licenses/MIT)
+//
+
+#pragma once
+
+#ifndef SPDLOG_H
+#include "spdlog/spdlog.h"
+#endif
+
+#include "spdlog/details/console_globals.h"
+#include "spdlog/details/null_mutex.h"
+
+#include <cstdio>
+#include <memory>
+#include <mutex>
+
+namespace spdlog {
+
+namespace sinks {
+
+template<typename TargetStream, typename ConsoleMutex>
+class stdout_sink final : public sink
+{
+public:
+ using mutex_t = typename ConsoleMutex::mutex_t;
+ stdout_sink()
+ : mutex_(ConsoleMutex::mutex())
+ , file_(TargetStream::stream())
+ {
+ }
+ ~stdout_sink() override = default;
+
+ stdout_sink(const stdout_sink &other) = delete;
+ stdout_sink &operator=(const stdout_sink &other) = delete;
+
+ void log(const details::log_msg &msg) override
+ {
+ std::lock_guard<mutex_t> lock(mutex_);
+ fmt::memory_buffer formatted;
+ formatter_->format(msg, formatted);
+ fwrite(formatted.data(), sizeof(char), formatted.size(), file_);
+ fflush(TargetStream::stream());
+ }
+
+ void flush() override
+ {
+ std::lock_guard<mutex_t> lock(mutex_);
+ fflush(file_);
+ }
+
+ void set_pattern(const std::string &pattern) override
+ {
+ std::lock_guard<mutex_t> lock(mutex_);
+ formatter_ = std::unique_ptr<spdlog::formatter>(new pattern_formatter(pattern));
+ }
+
+ void set_formatter(std::unique_ptr<spdlog::formatter> sink_formatter) override
+ {
+ std::lock_guard<mutex_t> lock(mutex_);
+ formatter_ = std::move(sink_formatter);
+ }
+
+private:
+ mutex_t &mutex_;
+ FILE *file_;
+};
+
+using stdout_sink_mt = stdout_sink<details::console_stdout, details::console_mutex>;
+using stdout_sink_st = stdout_sink<details::console_stdout, details::console_nullmutex>;
+
+using stderr_sink_mt = stdout_sink<details::console_stderr, details::console_mutex>;
+using stderr_sink_st = stdout_sink<details::console_stderr, details::console_nullmutex>;
+
+} // namespace sinks
+
+// factory methods
+template<typename Factory = default_factory>
+inline std::shared_ptr<logger> stdout_logger_mt(const std::string &logger_name)
+{
+ return Factory::template create<sinks::stdout_sink_mt>(logger_name);
+}
+
+template<typename Factory = default_factory>
+inline std::shared_ptr<logger> stdout_logger_st(const std::string &logger_name)
+{
+ return Factory::template create<sinks::stdout_sink_st>(logger_name);
+}
+
+template<typename Factory = default_factory>
+inline std::shared_ptr<logger> stderr_logger_mt(const std::string &logger_name)
+{
+ return Factory::template create<sinks::stderr_sink_mt>(logger_name);
+}
+
+template<typename Factory = default_factory>
+inline std::shared_ptr<logger> stderr_logger_st(const std::string &logger_name)
+{
+ return Factory::template create<sinks::stderr_sink_st>(logger_name);
+}
+} // namespace spdlog