UCILoader 1.1.2
Small C++ library that allows user to connect to a chess engines via UCI protocol.
Loading...
Searching...
No Matches
Logger.h
1#pragma once
2
3#include <chrono>
4#include <mutex>
5#include <ostream>
6#include <functional>
7#include <vector>
8#include <memory>
9#include <mutex>
10#include <ostream>
11#include <type_traits>
12
13namespace UCILoader {
14
32 class Logger {
33 public:
41 };
42
46 virtual ~Logger() = default;
47
54 virtual void log(MessageDirection dir, const std::string & msg) = 0;
55 };
56
64 class LoggerWrapper : public Logger {
65 std::unique_ptr<Logger> wrapped;
66 protected:
73 void delegate(MessageDirection dir, const std::string & msg);
74 public:
80 LoggerWrapper(std::unique_ptr<Logger> && logger);
81 };
82
83
107 public:
111 virtual ~LoggerTrait() = default;
112
122 virtual std::unique_ptr<Logger> addTo(std::unique_ptr<Logger> && logger) const = 0;
123 };
124
159 std::unique_ptr<Logger> logger;
160 public:
166 LoggerBuilder(std::unique_ptr<Logger> && base);
167
174
184 LoggerBuilder & addTrait(const LoggerTrait & trait);
185
191 std::unique_ptr<Logger> build();
192
205 friend LoggerBuilder operator |(LoggerBuilder builder, const LoggerTrait & trait) {
206 builder.addTrait(trait);
207 return std::move(builder);
208 };
209 };
210
211 class LogBuffer;
212
248 namespace Loggers {
254 extern LoggerBuilder toNoting();
255
261 extern LoggerBuilder toStd();
262
268 extern LoggerBuilder toStderr();
269
276 extern LoggerBuilder toFile(const std::string & filename);
277
284 extern LoggerBuilder toFile(const char * filename);
285
294 extern LoggerBuilder toBuffer(LogBuffer & buffer);
295
304 extern LoggerBuilder toCallback(std::function<void(Logger::MessageDirection, const std::string & msg)> callback);
305
312 extern LoggerBuilder toOstream(std::ostream & os);
313
331 template <class CustomLogger, typename ... args>
332 LoggerBuilder from(args... params) {
333 static_assert(std::is_base_of<Logger, CustomLogger>::value,
334 "CustomLogger must derive from Logger");
335 auto logger = std::make_unique<CustomLogger>(params...);
336 return LoggerBuilder(std::move(logger));
337 };
338 };
339
373 namespace LoggerTraits {
380 extern const LoggerTrait & Pretty;
381
387 extern const LoggerTrait & IgnoreParser;
388
394 extern const LoggerTrait & IgnoreEngine;
395
401 extern const LoggerTrait & IgnoreApplication;
402
408 extern const LoggerTrait & Timestamp;
409 };
410
411 // Forward declaration of log buffer implementation details.
417 namespace _LogBufferPrivate {
418 struct CriticalSection;
419 class Friend;
420 };
421
449 class LogBuffer {
450 std::shared_ptr<_LogBufferPrivate::CriticalSection> criticalSection;
451 friend _LogBufferPrivate::Friend;
452 public:
458 void push_back(const std::string & msg);
459
465 std::vector<std::string> snapshot() const;
466 };
467
468 namespace _LogBufferPrivate{
474 struct CriticalSection {
475 std::mutex lock;
476 std::vector<std::string> buffer;
477 };
478
484 class Friend {
485 protected:
486 std::shared_ptr<CriticalSection> criticalSection;
487 public:
493 Friend(LogBuffer & buffer) {
494 this->criticalSection = buffer.criticalSection;
495 }
496 };
497 };
498};
Thread-safe buffer for storing log messages.
Definition: Logger.h:449
std::vector< std::string > snapshot() const
Get a snapshot of all messages currently in the buffer.
Definition: Logger.cpp:236
void push_back(const std::string &msg)
Add a message to the buffer.
Definition: Logger.cpp:231
Builder class for constructing and composing loggers with traits.
Definition: Logger.h:158
friend LoggerBuilder operator|(LoggerBuilder builder, const LoggerTrait &trait)
Operator overload for applying traits using pipe operator.
Definition: Logger.h:205
LoggerBuilder & addTrait(const LoggerTrait &trait)
Add a trait to customize the logger behavior.
Definition: Logger.cpp:221
std::unique_ptr< Logger > build()
Build and return the final logger instance.
Definition: Logger.cpp:227
Abstract base class for logger traits that customize logger behavior.
Definition: Logger.h:106
virtual std::unique_ptr< Logger > addTo(std::unique_ptr< Logger > &&logger) const =0
Apply this trait to a logger by wrapping it.
virtual ~LoggerTrait()=default
Virtual destructor for proper cleanup of derived classes.
Base class for loggers that wrap and delegate to another logger.
Definition: Logger.h:64
void delegate(MessageDirection dir, const std::string &msg)
Delegate a log message to the wrapped logger.
Definition: Logger.cpp:210
Base interface for logging UCI protocol messages.
Definition: Logger.h:32
virtual ~Logger()=default
Virtual destructor for proper cleanup of derived classes.
MessageDirection
Enumeration of message directions for logging purposes.
Definition: Logger.h:37
@ ToEngine
Message sent from the application to the chess engine.
Definition: Logger.h:38
@ FromParser
Message generated or parsed by the UCI parser.
Definition: Logger.h:40
@ FromEngine
Message received from the chess engine.
Definition: Logger.h:39
virtual void log(MessageDirection dir, const std::string &msg)=0
Log a message with a specified direction.
const LoggerTrait & Timestamp
Trait that prepends timestamps to all logged messages.
Definition: Logger.cpp:169
const LoggerTrait & IgnoreApplication
Trait that filters out messages sent to the engine.
Definition: Logger.cpp:168
const LoggerTrait & IgnoreParser
Trait that filters out messages generated by the parser.
Definition: Logger.cpp:166
const LoggerTrait & Pretty
Trait that formats log messages for human readability.
Definition: Logger.cpp:165
const LoggerTrait & IgnoreEngine
Trait that filters out messages received from the engine.
Definition: Logger.cpp:167
LoggerBuilder from(args... params)
Create a custom logger of the specified type.
Definition: Logger.h:332
LoggerBuilder toBuffer(LogBuffer &buffer)
Create a logger that stores messages in abuffer.
Definition: Logger.cpp:195
LoggerBuilder toOstream(std::ostream &os)
Create a logger that outputs to an arbitrary output stream.
Definition: Logger.cpp:205
LoggerBuilder toFile(const std::string &filename)
Create a logger that outputs to a file.
Definition: Logger.cpp:185
LoggerBuilder toStderr()
Create a logger that outputs to standard error.
Definition: Logger.cpp:181
LoggerBuilder toCallback(std::function< void(Logger::MessageDirection, const std::string &msg)> callback)
Create a logger that forwards all messages to a callback function.
Definition: Logger.cpp:200
LoggerBuilder toStd()
Create a logger that outputs to standard output.
Definition: Logger.cpp:176
LoggerBuilder toNoting()
Create a logger that discards all messages.
Definition: Logger.cpp:171