#ifndef LOGGER_H #define LOGGER_H #include "fmt/format.h" class DiskFlux; class TrackDataFlux; class TrackFlux; class Sector; struct ErrorLogMessage { std::string message; }; struct EmergencyStopMessage { }; struct BeginSpeedOperationLogMessage { }; struct EndSpeedOperationLogMessage { nanoseconds_t rotationalPeriod; }; struct TrackReadLogMessage { std::shared_ptr track; }; struct DiskReadLogMessage { std::shared_ptr disk; }; struct BeginReadOperationLogMessage { unsigned track; unsigned head; }; struct EndReadOperationLogMessage { std::shared_ptr trackDataFlux; std::set> sectors; }; struct BeginWriteOperationLogMessage { unsigned track; unsigned head; }; struct EndWriteOperationLogMessage { }; struct BeginOperationLogMessage { std::string message; }; struct EndOperationLogMessage { std::string message; }; struct OperationProgressLogMessage { unsigned progress; }; class TrackFlux; typedef std::variant AnyLogMessage; template inline void log(const T& message) { log(std::make_shared(message)); } extern void log(std::shared_ptr message); template inline void log(fmt::string_view fstr, const Args&... args) { log(fmt::format(fstr, args...)); } namespace Logger { extern void setLogger( std::function)> cb); extern std::string toString(const AnyLogMessage&); } #endif