From e5c522af7a242319bf05037dc5bb00e7a077a57c Mon Sep 17 00:00:00 2001 From: itqop Date: Wed, 15 May 2024 12:30:34 +0300 Subject: [PATCH] Add logger --- CMakeLists.txt | 2 +- include/log.h | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 include/log.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b62df52..248d82e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ add_executable("${CMAKE_PROJECT_NAME}") set_property(TARGET "${CMAKE_PROJECT_NAME}" PROPERTY CXX_STANDARD 17) target_compile_definitions("${CMAKE_PROJECT_NAME}" PUBLIC _CRT_SECURE_NO_WARNINGS) target_compile_definitions("${CMAKE_PROJECT_NAME}" PUBLIC RESOURCES_PATH="${CMAKE_CURRENT_SOURCE_DIR}/resources/") -target_sources("${CMAKE_PROJECT_NAME}" PRIVATE ${MY_SOURCES}) +target_sources("${CMAKE_PROJECT_NAME}" PRIVATE ${MY_SOURCES} "include/log.h") if(MSVC) set_target_properties("${CMAKE_PROJECT_NAME}" PROPERTIES LINK_FLAGS_DEBUG "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") set_target_properties("${CMAKE_PROJECT_NAME}" PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") diff --git a/include/log.h b/include/log.h new file mode 100644 index 0000000..58c4243 --- /dev/null +++ b/include/log.h @@ -0,0 +1,72 @@ +#pragma once +#include +#include +#include + +class LogType +{ +public: + virtual void log(std::stringstream& ss) const = 0; +}; + + +class DefaultLog : public LogType +{ +public: + void log(std::stringstream& ss) const override + { + std::cout << ss.str() << "\n"; + }; +}; + +class ErrorLog : public LogType +{ +public: + void log(std::stringstream& ss) const override + { +#ifdef PLATFORM_WIN32 + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12); + std::cout << ss.str() << "\n"; + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15); +#else + std::cout << "Error: " << ss << "\n"; +#endif + }; +}; + +class LogToAFile : public LogType +{ + std::string name; +public: + LogToAFile(std::string name) :name(name) + {} + + void log(std::stringstream& ss) const override + { + std::ofstream f(name); + f << ss.str() << "\n"; + f.close(); + }; + +}; + + +inline void llog(const LogType& l, std::stringstream& ss) +{ + l.log(ss); +} + +template +inline void llog(const LogType& l, std::stringstream& ss, const T& t, const T2 &...t2) +{ + ss << t << " "; + llog(l, ss, t2...); +} + +template +inline void llog(const LogType& l, const T& t, const T2 &...t2) +{ + std::stringstream ss; + ss << t << " "; + llog(l, ss, t2...); +}