diff options
| author | heavydemon21 <nielsstunnebrink1@gmail.com> | 2024-11-18 15:08:31 +0100 | 
|---|---|---|
| committer | heavydemon21 <nielsstunnebrink1@gmail.com> | 2024-11-18 15:08:31 +0100 | 
| commit | fee42c67918a9370f7f4e074dba9a677afccf90b (patch) | |
| tree | c5ed200e3c584fafc4c6bd3df48adeed3cfbd31d /src/crepe/util | |
| parent | ed1403aea4412bd479244eae8e2940190e71cd28 (diff) | |
| parent | 121b64b1cb6cfead5814070c8b0185d3d7308095 (diff) | |
Merge remote-tracking branch 'origin/master' into niels/RenderingParticle
Diffstat (limited to 'src/crepe/util')
| -rw-r--r-- | src/crepe/util/CMakeLists.txt | 7 | ||||
| -rw-r--r-- | src/crepe/util/Log.cpp | 37 | ||||
| -rw-r--r-- | src/crepe/util/Log.h | 84 | ||||
| -rw-r--r-- | src/crepe/util/Log.hpp | 17 | ||||
| -rw-r--r-- | src/crepe/util/LogColor.cpp | 84 | ||||
| -rw-r--r-- | src/crepe/util/LogColor.h | 51 | ||||
| -rw-r--r-- | src/crepe/util/Proxy.h | 4 | ||||
| -rw-r--r-- | src/crepe/util/fmt.cpp | 35 | ||||
| -rw-r--r-- | src/crepe/util/fmt.h | 10 | ||||
| -rw-r--r-- | src/crepe/util/log.cpp | 53 | ||||
| -rw-r--r-- | src/crepe/util/log.h | 39 | 
11 files changed, 202 insertions, 219 deletions
| 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 new file mode 100644 index 0000000..84d80a8 --- /dev/null +++ b/src/crepe/util/Log.cpp @@ -0,0 +1,37 @@ +#include <iostream> +#include <string> + +#include "../api/Config.h" + +#include "Log.h" + +using namespace crepe; +using namespace std; + +string Log::prefix(const Level & level) { +	switch (level) { +		case Level::TRACE: +			return LogColor().fg_white().str("[TRACE]") + " "; +		case Level::DEBUG: +			return LogColor().fg_magenta().str("[DEBUG]") + " "; +		case Level::INFO: +			return LogColor().fg_blue().str("[INFO]") + " "; +		case Level::WARNING: +			return LogColor().fg_yellow().str("[WARN]") + " "; +		case Level::ERROR: +			return LogColor().fg_red().str("[ERROR]") + " "; +	} +	return ""; +} + +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; +	if (!out.ends_with("\n")) out += "\n"; + +	// TODO: also log to file or smth +	cout.write(out.data(), out.size()); +	cout.flush(); +} diff --git a/src/crepe/util/Log.h b/src/crepe/util/Log.h new file mode 100644 index 0000000..d55b11e --- /dev/null +++ b/src/crepe/util/Log.h @@ -0,0 +1,84 @@ +#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 +	 * +	 * \return Colored message severity prefix string +	 */ +	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..c2156cd --- /dev/null +++ b/src/crepe/util/Log.hpp @@ -0,0 +1,17 @@ +#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)...)); +} + +} // namespace crepe diff --git a/src/crepe/util/LogColor.cpp b/src/crepe/util/LogColor.cpp index b5fe3ea..5411898 100644 --- a/src/crepe/util/LogColor.cpp +++ b/src/crepe/util/LogColor.cpp @@ -1,16 +1,15 @@  #include <cstdarg>  #include "../api/Config.h" -#include "LogColor.h" -#include "fmt.h" +#include "LogColor.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 +18,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;  } @@ -42,51 +28,19 @@ LogColor & LogColor::reset() {  	return *this;  } -LogColor & LogColor::fg_black(bool bright) { -	return this->add_code(bright ? 90 : 30); -} -LogColor & LogColor::fg_red(bool bright) { -	return this->add_code(bright ? 91 : 31); -} -LogColor & LogColor::fg_green(bool bright) { -	return this->add_code(bright ? 92 : 32); -} -LogColor & LogColor::fg_yellow(bool bright) { -	return this->add_code(bright ? 93 : 33); -} -LogColor & LogColor::fg_blue(bool bright) { -	return this->add_code(bright ? 94 : 34); -} -LogColor & LogColor::fg_magenta(bool bright) { -	return this->add_code(bright ? 95 : 35); -} -LogColor & LogColor::fg_cyan(bool bright) { -	return this->add_code(bright ? 96 : 36); -} -LogColor & LogColor::fg_white(bool bright) { -	return this->add_code(bright ? 97 : 37); -} -LogColor & LogColor::bg_black(bool bright) { -	return this->add_code(bright ? 100 : 40); -} -LogColor & LogColor::bg_red(bool bright) { -	return this->add_code(bright ? 101 : 41); -} -LogColor & LogColor::bg_green(bool bright) { -	return this->add_code(bright ? 102 : 42); -} -LogColor & LogColor::bg_yellow(bool bright) { -	return this->add_code(bright ? 103 : 43); -} -LogColor & LogColor::bg_blue(bool bright) { -	return this->add_code(bright ? 104 : 44); -} -LogColor & LogColor::bg_magenta(bool bright) { -	return this->add_code(bright ? 105 : 45); -} -LogColor & LogColor::bg_cyan(bool bright) { -	return this->add_code(bright ? 106 : 46); -} -LogColor & LogColor::bg_white(bool bright) { -	return this->add_code(bright ? 107 : 47); -} +LogColor & LogColor::fg_black(bool bright) { return this->add_code(bright ? 90 : 30); } +LogColor & LogColor::fg_red(bool bright) { return this->add_code(bright ? 91 : 31); } +LogColor & LogColor::fg_green(bool bright) { return this->add_code(bright ? 92 : 32); } +LogColor & LogColor::fg_yellow(bool bright) { return this->add_code(bright ? 93 : 33); } +LogColor & LogColor::fg_blue(bool bright) { return this->add_code(bright ? 94 : 34); } +LogColor & LogColor::fg_magenta(bool bright) { return this->add_code(bright ? 95 : 35); } +LogColor & LogColor::fg_cyan(bool bright) { return this->add_code(bright ? 96 : 36); } +LogColor & LogColor::fg_white(bool bright) { return this->add_code(bright ? 97 : 37); } +LogColor & LogColor::bg_black(bool bright) { return this->add_code(bright ? 100 : 40); } +LogColor & LogColor::bg_red(bool bright) { return this->add_code(bright ? 101 : 41); } +LogColor & LogColor::bg_green(bool bright) { return this->add_code(bright ? 102 : 42); } +LogColor & LogColor::bg_yellow(bool bright) { return this->add_code(bright ? 103 : 43); } +LogColor & LogColor::bg_blue(bool bright) { return this->add_code(bright ? 104 : 44); } +LogColor & LogColor::bg_magenta(bool bright) { return this->add_code(bright ? 105 : 45); } +LogColor & LogColor::bg_cyan(bool bright) { return this->add_code(bright ? 106 : 46); } +LogColor & LogColor::bg_white(bool bright) { return this->add_code(bright ? 107 : 47); } diff --git a/src/crepe/util/LogColor.h b/src/crepe/util/LogColor.h index c1170cb..132fb94 100644 --- a/src/crepe/util/LogColor.h +++ b/src/crepe/util/LogColor.h @@ -4,23 +4,35 @@  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; +	/** +	 * \brief Get color code as STL string +	 * +	 * \param content If given, color this string and append a color reset escape sequence. +	 * +	 * \returns Color escape sequence +	 */ +	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: +	/** +	 * \name Foreground colors +	 * +	 * These functions set the foreground (text) color. The \c bright parameter +	 * makes the color brighter, or bold on some terminals. +	 * \{ +	 */  	LogColor & fg_black(bool bright = false);  	LogColor & fg_red(bool bright = false);  	LogColor & fg_green(bool bright = false); @@ -29,8 +41,16 @@ public:  	LogColor & fg_magenta(bool bright = false);  	LogColor & fg_cyan(bool bright = false);  	LogColor & fg_white(bool bright = false); +	/// \}  public: +	/** +	 * \name Background colors +	 * +	 * These functions set the background color. The \c bright parameter makes +	 * the color brighter. +	 * \{ +	 */  	LogColor & bg_black(bool bright = false);  	LogColor & bg_red(bool bright = false);  	LogColor & bg_green(bool bright = false); @@ -39,13 +59,22 @@ public:  	LogColor & bg_magenta(bool bright = false);  	LogColor & bg_cyan(bool bright = false);  	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/Proxy.h b/src/crepe/util/Proxy.h index f84e462..b34f7c6 100644 --- a/src/crepe/util/Proxy.h +++ b/src/crepe/util/Proxy.h @@ -7,8 +7,8 @@ namespace crepe {  /**   * \brief Utility wrapper for \c ValueBroker   * - * This class can be used to to wrap a ValueBroker instance so it behaves like - * a regular variable. + * This class can be used to to wrap a ValueBroker instance so it behaves like a regular + * variable.   *   * \tparam T  Type of the underlying variable   */ 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.cpp b/src/crepe/util/log.cpp deleted file mode 100644 index 4a8f8e8..0000000 --- a/src/crepe/util/log.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include <cstdarg> -#include <cstdio> -#include <cstdlib> -#include <string> - -#include "../api/Config.h" -#include "fmt.h" -#include "log.h" - -using namespace crepe; -using namespace std; - -string log_prefix(LogLevel level) { -	switch (level) { -		case LogLevel::TRACE: -			return LogColor().fg_white().str("[TRACE]") + " "; -		case LogLevel::DEBUG: -			return LogColor().fg_magenta().str("[DEBUG]") + " "; -		case LogLevel::INFO: -			return LogColor().fg_blue().str("[INFO]") + " "; -		case LogLevel::WARNING: -			return LogColor().fg_yellow().str("[WARN]") + " "; -		case LogLevel::ERROR: -			return LogColor().fg_red().str("[ERROR]") + " "; -	} -	return ""; -} - -static void log(LogLevel level, const string msg) { -	auto & cfg = Config::get_instance(); -	if (level < cfg.log.level) return; - -	string out = log_prefix(level) + msg; -	if (!out.ends_with("\n")) out += "\n"; - -	// TODO: also log to file or smth -	fwrite(out.c_str(), 1, out.size(), stdout); -	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 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 |