diff options
| author | Loek Le Blansch <loek@pipeframe.xyz> | 2024-11-13 14:35:27 +0100 | 
|---|---|---|
| committer | Loek Le Blansch <loek@pipeframe.xyz> | 2024-11-13 14:35:27 +0100 | 
| commit | 1df510f4a2dbe0fcb8c9f8a34695abf8d33f9ddc (patch) | |
| tree | 2a901a09957abe1363f5b21ee259036f23f66087 | |
| parent | daf2a06ac778f203e1473431afe09476e8182f65 (diff) | |
update logging to use C++20 format and classes
33 files changed, 188 insertions, 180 deletions
| diff --git a/src/crepe/CMakeLists.txt b/src/crepe/CMakeLists.txt index fc95bd3..52a781e 100644 --- a/src/crepe/CMakeLists.txt +++ b/src/crepe/CMakeLists.txt @@ -16,6 +16,7 @@ target_sources(crepe PUBLIC FILE_SET HEADERS FILES  	ValueBroker.h  	ValueBroker.hpp  	Exception.h +	Exception.hpp  )  add_subdirectory(api) diff --git a/src/crepe/ComponentManager.cpp b/src/crepe/ComponentManager.cpp index 85149c8..7123905 100644 --- a/src/crepe/ComponentManager.cpp +++ b/src/crepe/ComponentManager.cpp @@ -1,4 +1,4 @@ -#include "util/log.h" +#include "util/Log.h"  #include "ComponentManager.h" diff --git a/src/crepe/Exception.cpp b/src/crepe/Exception.cpp index bfdbcdd..3217169 100644 --- a/src/crepe/Exception.cpp +++ b/src/crepe/Exception.cpp @@ -1,16 +1,11 @@ -#include <cstdarg> -  #include "Exception.h" -#include "util/fmt.h" -using namespace std;  using namespace crepe; +using namespace std;  const char * Exception::what() const noexcept { return error.c_str(); } -Exception::Exception(const char * fmt, ...) { -	va_list args; -	va_start(args, fmt); -	this->error = va_stringf(args, fmt); -	va_end(args); +Exception::Exception(const string & msg) { +	this->error = msg;  } + diff --git a/src/crepe/Exception.h b/src/crepe/Exception.h index 80af068..ed3ab15 100644 --- a/src/crepe/Exception.h +++ b/src/crepe/Exception.h @@ -2,21 +2,31 @@  #include <exception>  #include <string> +#include <format>  namespace crepe { -//! Exception class with printf-style constructor +//! Exception class  class Exception : public std::exception {  public: -	//! printf -	Exception(const char * fmt, ...); +	//! Exception with plain message +	Exception(const std::string & msg); + +	//! Exception with \c std::format message +	template<class... Args> +	Exception(std::format_string<Args...> fmt, Args&&... args); +  	//! Get formatted error message  	const char * what() const noexcept;  protected:  	Exception() = default; +  	//! Formatted error message  	std::string error;  };  } // namespace crepe + +#include "Exception.hpp" + diff --git a/src/crepe/Exception.hpp b/src/crepe/Exception.hpp new file mode 100644 index 0000000..d813879 --- /dev/null +++ b/src/crepe/Exception.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "Exception.h" + +namespace crepe { + +template<class... Args> +Exception::Exception(std::format_string<Args...> fmt, Args&&... args) { +	this->error = std::format(fmt, std::forward<Args>(args)...); +} + +} + diff --git a/src/crepe/api/Animator.cpp b/src/crepe/api/Animator.cpp index 58fee2a..863dce6 100644 --- a/src/crepe/api/Animator.cpp +++ b/src/crepe/api/Animator.cpp @@ -1,7 +1,7 @@  #include <cstdint> -#include "util/log.h" +#include "util/Log.h"  #include "Animator.h"  #include "Component.h" diff --git a/src/crepe/api/AssetManager.cpp b/src/crepe/api/AssetManager.cpp index b891760..3925758 100644 --- a/src/crepe/api/AssetManager.cpp +++ b/src/crepe/api/AssetManager.cpp @@ -1,4 +1,4 @@ -#include "util/log.h" +#include "util/Log.h"  #include "AssetManager.h" diff --git a/src/crepe/api/BehaviorScript.hpp b/src/crepe/api/BehaviorScript.hpp index 4751607..bc157fd 100644 --- a/src/crepe/api/BehaviorScript.hpp +++ b/src/crepe/api/BehaviorScript.hpp @@ -2,7 +2,7 @@  #include <type_traits> -#include "../util/log.h" +#include "../util/Log.h"  #include "BehaviorScript.h"  #include "Script.h" diff --git a/src/crepe/api/Camera.cpp b/src/crepe/api/Camera.cpp index 6355a03..6f0deb1 100644 --- a/src/crepe/api/Camera.cpp +++ b/src/crepe/api/Camera.cpp @@ -1,7 +1,7 @@  #include <cstdint> -#include "util/log.h" +#include "util/Log.h"  #include "Camera.h"  #include "Color.h" diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index 8c9e643..8fd381e 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -1,6 +1,6 @@  #pragma once -#include "../util/log.h" +#include "../util/Log.h"  namespace crepe { @@ -29,7 +29,7 @@ public:  		 * Only messages with equal or higher priority than this value will be  		 * logged.  		 */ -		LogLevel level = LogLevel::INFO; +		Log::Level level = Log::Level::INFO;  		/**  		 * \brief Colored log output  		 * diff --git a/src/crepe/api/LoopTimer.cpp b/src/crepe/api/LoopTimer.cpp index 8f09e41..b3aec22 100644 --- a/src/crepe/api/LoopTimer.cpp +++ b/src/crepe/api/LoopTimer.cpp @@ -1,7 +1,7 @@  #include <chrono>  #include "../facade/SDLContext.h" -#include "../util/log.h" +#include "../util/Log.h"  #include "LoopTimer.h" diff --git a/src/crepe/api/SaveManager.cpp b/src/crepe/api/SaveManager.cpp index 43276c5..2974b91 100644 --- a/src/crepe/api/SaveManager.cpp +++ b/src/crepe/api/SaveManager.cpp @@ -1,5 +1,5 @@  #include "../facade/DB.h" -#include "../util/log.h" +#include "../util/Log.h"  #include "Config.h"  #include "SaveManager.h" diff --git a/src/crepe/api/Script.h b/src/crepe/api/Script.h index 49e625f..ed247ad 100644 --- a/src/crepe/api/Script.h +++ b/src/crepe/api/Script.h @@ -3,11 +3,8 @@  #include <vector>  namespace crepe { -class ScriptSystem; -} - -namespace crepe { +class ScriptSystem;  class BehaviorScript;  class Script { diff --git a/src/crepe/api/Sprite.cpp b/src/crepe/api/Sprite.cpp index 6f0433f..ac0079e 100644 --- a/src/crepe/api/Sprite.cpp +++ b/src/crepe/api/Sprite.cpp @@ -1,6 +1,6 @@  #include <memory> -#include "../util/log.h" +#include "../util/Log.h"  #include "facade/SDLContext.h"  #include "Component.h" diff --git a/src/crepe/api/Texture.cpp b/src/crepe/api/Texture.cpp index 5ebd23d..8ddeac5 100644 --- a/src/crepe/api/Texture.cpp +++ b/src/crepe/api/Texture.cpp @@ -1,7 +1,7 @@  #include <SDL2/SDL_render.h>  #include "../facade/SDLContext.h" -#include "../util/log.h" +#include "../util/Log.h"  #include "Asset.h"  #include "Texture.h" diff --git a/src/crepe/api/Transform.cpp b/src/crepe/api/Transform.cpp index e401120..e9108c4 100644 --- a/src/crepe/api/Transform.cpp +++ b/src/crepe/api/Transform.cpp @@ -1,4 +1,4 @@ -#include "util/log.h" +#include "../util/Log.h"  #include "Transform.h" diff --git a/src/crepe/facade/DB.cpp b/src/crepe/facade/DB.cpp index 405f7c4..ec6191b 100644 --- a/src/crepe/facade/DB.cpp +++ b/src/crepe/facade/DB.cpp @@ -1,7 +1,7 @@  #include <cstring>  #include "Exception.h" -#include "util/log.h" +#include "util/Log.h"  #include "DB.h" diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 39d0d4d..a28f7bd 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -15,7 +15,7 @@  #include "../api/Sprite.h"  #include "../api/Texture.h"  #include "../api/Transform.h" -#include "../util/log.h" +#include "../util/Log.h"  #include "Exception.h"  #include "SDLContext.h" diff --git a/src/crepe/facade/Sound.cpp b/src/crepe/facade/Sound.cpp index 648ec81..49fb8dc 100644 --- a/src/crepe/facade/Sound.cpp +++ b/src/crepe/facade/Sound.cpp @@ -1,4 +1,4 @@ -#include "../util/log.h" +#include "../util/Log.h"  #include "Sound.h"  #include "SoundContext.h" diff --git a/src/crepe/facade/SoundContext.cpp b/src/crepe/facade/SoundContext.cpp index 5e5a3a9..deb2b62 100644 --- a/src/crepe/facade/SoundContext.cpp +++ b/src/crepe/facade/SoundContext.cpp @@ -1,4 +1,4 @@ -#include "../util/log.h" +#include "../util/Log.h"  #include "SoundContext.h" diff --git a/src/crepe/system/AnimatorSystem.cpp b/src/crepe/system/AnimatorSystem.cpp index bf45362..1c101fa 100644 --- a/src/crepe/system/AnimatorSystem.cpp +++ b/src/crepe/system/AnimatorSystem.cpp @@ -5,7 +5,7 @@  #include "api/Animator.h"  #include "facade/SDLContext.h" -#include "util/log.h" +#include "util/Log.h"  #include "AnimatorSystem.h"  #include "ComponentManager.h" diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 10211a3..3ff5b4f 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -5,7 +5,7 @@  #include "../api/Sprite.h"  #include "../api/Transform.h"  #include "../facade/SDLContext.h" -#include "../util/log.h" +#include "../util/Log.h"  #include "RenderSystem.h" diff --git a/src/crepe/system/ScriptSystem.cpp b/src/crepe/system/ScriptSystem.cpp index f2673e7..aceb218 100644 --- a/src/crepe/system/ScriptSystem.cpp +++ b/src/crepe/system/ScriptSystem.cpp @@ -5,7 +5,7 @@  #include "../ComponentManager.h"  #include "../api/BehaviorScript.h"  #include "../api/Script.h" -#include "../util/log.h" +#include "../util/Log.h"  #include "ScriptSystem.h" diff --git a/src/crepe/util/CMakeLists.txt b/src/crepe/util/CMakeLists.txt index 0fa4343..4be738a 100644 --- a/src/crepe/util/CMakeLists.txt +++ b/src/crepe/util/CMakeLists.txt @@ -1,13 +1,12 @@  target_sources(crepe PUBLIC  	LogColor.cpp -	log.cpp -	fmt.cpp +	Log.cpp  )  target_sources(crepe PUBLIC FILE_SET HEADERS FILES  	LogColor.h -	log.h -	fmt.h +	Log.h +	Log.hpp  	Proxy.h  	Proxy.hpp  ) diff --git a/src/crepe/util/log.cpp b/src/crepe/util/Log.cpp index 4a8f8e8..346e08e 100644 --- a/src/crepe/util/log.cpp +++ b/src/crepe/util/Log.cpp @@ -4,33 +4,32 @@  #include <string>  #include "../api/Config.h" -#include "fmt.h" -#include "log.h" +#include "Log.h"  using namespace crepe;  using namespace std; -string log_prefix(LogLevel level) { +string Log::prefix(const Level & level) {  	switch (level) { -		case LogLevel::TRACE: +		case Level::TRACE:  			return LogColor().fg_white().str("[TRACE]") + " "; -		case LogLevel::DEBUG: +		case Level::DEBUG:  			return LogColor().fg_magenta().str("[DEBUG]") + " "; -		case LogLevel::INFO: +		case Level::INFO:  			return LogColor().fg_blue().str("[INFO]") + " "; -		case LogLevel::WARNING: +		case Level::WARNING:  			return LogColor().fg_yellow().str("[WARN]") + " "; -		case LogLevel::ERROR: +		case Level::ERROR:  			return LogColor().fg_red().str("[ERROR]") + " ";  	}  	return "";  } -static void log(LogLevel level, const string msg) { +void Log::log(const Level & level, const string & msg) {  	auto & cfg = Config::get_instance();  	if (level < cfg.log.level) return; -	string out = log_prefix(level) + msg; +	string out = Log::prefix(level) + msg;  	if (!out.ends_with("\n")) out += "\n";  	// TODO: also log to file or smth @@ -38,16 +37,3 @@ static void log(LogLevel level, const string msg) {  	fflush(stdout);  } -void crepe::logf(const char * fmt, ...) { -	va_list args; -	va_start(args, fmt); -	log(LogLevel::DEBUG, va_stringf(args, fmt)); -	va_end(args); -} - -void crepe::logf(LogLevel level, const char * fmt, ...) { -	va_list args; -	va_start(args, fmt); -	log(level, va_stringf(args, fmt)); -	va_end(args); -} diff --git a/src/crepe/util/Log.h b/src/crepe/util/Log.h new file mode 100644 index 0000000..4e32e9d --- /dev/null +++ b/src/crepe/util/Log.h @@ -0,0 +1,80 @@ +#pragma once + +#include <format> + +// allow user to disable debug macros +#ifndef CREPE_DISABLE_MACROS + +#include "LogColor.h" + +// utility macros +#define _crepe_logf_here(level, fmt, ...) crepe::Log::logf(level, "{}" fmt, crepe::LogColor().fg_white(false).str(std::format("{} ({}:{})", __PRETTY_FUNCTION__, __FILE_NAME__, __LINE__)), __VA_ARGS__) + +// very illegal global function-style macros +// NOLINTBEGIN +#define dbg_logf(fmt, ...) \ +	_crepe_logf_here(crepe::Log::Level::DEBUG, ": " fmt, __VA_ARGS__) +#define dbg_log(str) _crepe_logf_here(crepe::Log::Level::DEBUG, ": {}", str) +#define dbg_trace() _crepe_logf_here(crepe::Log::Level::TRACE, "", "") +// NOLINTEND + +#endif + +namespace crepe { + +/** + * \brief Logging utility + * + * This class is used to output log messages to the console and/or log files. + */ +class Log { +public: +	//! Log message severity +	enum Level { +		TRACE, //< Include (internal) function calls +		DEBUG, //< Include dbg_logf output +		INFO, //< General-purpose messages +		WARNING, //< Non-fatal errors +		ERROR, //< Fatal errors +	}; + +	/** +	 * \brief Log a formatted message +	 * +	 * \param level Message severity +	 * \param msg Formatted message +	 */ +	static void log(const Level & level, const std::string & msg); + +	/** +	 * \brief Format a message and log it +	 * +	 * \param level Message severity +	 * \param fmt Message format +	 * \param args Format arguments +	 */ +	template<class... Args> +	static void logf(const Level & level, std::format_string<Args...> fmt, Args&&... args); + +	/** +	 * \brief Format a message and log it (with default severity \c INFO) +	 * +	 * \param fmt Message format +	 * \param args Format arguments +	 */ +	template<class... Args> +	static void logf(std::format_string<Args...> fmt, Args&&... args); + +private: +	/** +	 * \brief Output a message prefix depending on the log level +	 * +	 * \param level Message severity +	 */ +	static std::string prefix(const Level & level); +}; + +} // namespace crepe + +#include "Log.hpp" + diff --git a/src/crepe/util/Log.hpp b/src/crepe/util/Log.hpp new file mode 100644 index 0000000..58ba475 --- /dev/null +++ b/src/crepe/util/Log.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "Log.h" + +namespace crepe { + +template<class... Args> +void Log::logf(std::format_string<Args...> fmt, Args&&... args) { +	Log::logf(Level::INFO, fmt, std::forward<Args>(args)...); +} + +template<class... Args> +void Log::logf(const Level & level, std::format_string<Args...> fmt, Args&&... args) { +	Log::log(level, std::format(fmt, std::forward<Args>(args)...)); +} + +} + diff --git a/src/crepe/util/LogColor.cpp b/src/crepe/util/LogColor.cpp index b5fe3ea..ae44d72 100644 --- a/src/crepe/util/LogColor.cpp +++ b/src/crepe/util/LogColor.cpp @@ -3,14 +3,12 @@  #include "../api/Config.h"  #include "LogColor.h" -#include "fmt.h" -  using namespace crepe;  using namespace std;  static constexpr const char * RESET_CODE = "\e[0m"; -const string LogColor::str(const string & content) { +const string LogColor::str(const string & content) const {  	auto & cfg = Config::get_instance();  	string out = content;  	if (cfg.log.color) out = this->code + out; @@ -19,21 +17,8 @@ const string LogColor::str(const string & content) {  	return out;  } -const char * LogColor::c_str(const char * content) { -	this->final = this->str(content == NULL ? "" : content); -	return this->final.c_str(); -} - -const char * LogColor::fmt(const char * fmt, ...) { -	va_list args; -	va_start(args, fmt); -	string content = va_stringf(args, fmt); -	va_end(args); -	return this->c_str(content.c_str()); -} -  LogColor & LogColor::add_code(unsigned int code) { -	this->code += stringf("\e[%dm", code); +	this->code += format("\e[{}m", code);  	return *this;  } diff --git a/src/crepe/util/LogColor.h b/src/crepe/util/LogColor.h index c1170cb..4b65127 100644 --- a/src/crepe/util/LogColor.h +++ b/src/crepe/util/LogColor.h @@ -4,20 +4,19 @@  namespace crepe { +/** + * \brief Utility class for coloring text using ANSI escape codes + * + * \note Most methods in this class return a reference to \c this, which may be + * used to chain multiple display attributes. + */  class LogColor {  public: -	LogColor() = default; +	//! Get color code as stl string (or color content string) +	const std::string str(const std::string & content = "") const;  public: -	//! get color code as c-style string (or color content string) -	const char * c_str(const char * content = NULL); -	//! color printf-style format string -	const char * fmt(const char * fmt, ...); -	//! get color code as stl string (or color content string) -	const std::string str(const std::string & content = ""); - -public: -	//! reset color to default foreground and background color +	//! Reset color to default foreground and background color  	LogColor & reset();  public: @@ -41,11 +40,19 @@ public:  	LogColor & bg_white(bool bright = false);  private: +	/** +	 * \brief Append SGR escape sequence to \c this->code +	 * +	 * \param code SGR attribute number +	 * +	 * See <https://en.wikipedia.org/wiki/ANSI_escape_code> for magic number +	 * reference. +	 */  	LogColor & add_code(unsigned int code);  private: +	//! Color escape sequence  	std::string code = ""; -	std::string final = "";  };  } // namespace crepe diff --git a/src/crepe/util/fmt.cpp b/src/crepe/util/fmt.cpp deleted file mode 100644 index 4b50da8..0000000 --- a/src/crepe/util/fmt.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include <cstdarg> -#include <cstdio> -#include <string> - -#include "fmt.h" - -using namespace std; - -string crepe::va_stringf(va_list args, const char * fmt) { -	string out; - -	va_list args_copy; -	va_copy(args_copy, args); -	size_t length = vsnprintf(NULL, 0, fmt, args_copy); -	// resize to include terminating null byte -	out.resize(length + 1); -	va_end(args_copy); - -	// vsnprintf adds terminating null byte -	vsnprintf(out.data(), out.size(), fmt, args); -	// resize to actual length -	out.resize(length); - -	va_end(args); - -	return out; -} - -string crepe::stringf(const char * fmt, ...) { -	va_list args; -	va_start(args, fmt); -	string out = va_stringf(args, fmt); -	va_end(args); -	return out; -} diff --git a/src/crepe/util/fmt.h b/src/crepe/util/fmt.h deleted file mode 100644 index e319e6e..0000000 --- a/src/crepe/util/fmt.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include <string> - -namespace crepe { - -std::string va_stringf(va_list args, const char * fmt); -std::string stringf(const char * fmt, ...); - -} // namespace crepe diff --git a/src/crepe/util/log.h b/src/crepe/util/log.h deleted file mode 100644 index 5a1cf00..0000000 --- a/src/crepe/util/log.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -// allow user to disable debug macros -#ifndef CREPE_DISABLE_MACROS - -#include "LogColor.h" - -// utility macros -#define _crepe_logf_here(level, format, ...) \ -	crepe::logf( \ -		level, "%s" format, \ -		crepe::LogColor().fg_white(false).fmt( \ -			"%s (%s:%d)", __PRETTY_FUNCTION__, __FILE_NAME__, __LINE__), \ -		__VA_ARGS__) - -// very illegal global function-style macros -// NOLINTBEGIN -#define dbg_logf(fmt, ...) \ -	_crepe_logf_here(crepe::LogLevel::DEBUG, ": " fmt, __VA_ARGS__) -#define dbg_log(str) _crepe_logf_here(crepe::LogLevel::DEBUG, "%s: " str, "") -#define dbg_trace() _crepe_logf_here(crepe::LogLevel::TRACE, "%s", "") -// NOLINTEND - -#endif - -namespace crepe { - -enum LogLevel { -	TRACE, -	DEBUG, -	INFO, -	WARNING, -	ERROR, -}; - -void logf(const char * fmt, ...); -void logf(enum LogLevel level, const char * fmt, ...); - -} // namespace crepe diff --git a/src/example/log.cpp b/src/example/log.cpp index db8aa48..13d592b 100644 --- a/src/example/log.cpp +++ b/src/example/log.cpp @@ -4,7 +4,7 @@   */  #include <crepe/api/Config.h> -#include <crepe/util/log.h> +#include <crepe/util/Log.h>  using namespace crepe; @@ -12,17 +12,18 @@ using namespace crepe;  int _ = []() {  	// make sure all log messages get printed  	auto & cfg = Config::get_instance(); -	cfg.log.level = LogLevel::TRACE; +	cfg.log.level = Log::Level::TRACE;  	return 0; // satisfy compiler  }();  int main() {  	dbg_trace(); -	dbg_logf("test printf parameters: %d", 3); -	logf(LogLevel::INFO, "info message"); -	logf(LogLevel::WARNING, "warning"); -	logf(LogLevel::ERROR, "error"); +	dbg_log("debug message"); +	Log::logf("info message with variable: {}", 3); +	Log::logf(Log::Level::WARNING, "warning"); +	Log::logf(Log::Level::ERROR, "error"); +	  	return 0;  } |