Browse Source

use the bloody std::string_view where possible

master
heck 2 years ago
parent
commit
875481c578
  1. 46
      src/log.cc

46
src/log.cc

@ -4,6 +4,7 @@
#include <cstdarg> #include <cstdarg>
#include <unistd.h> #include <unistd.h>
#include <thread> #include <thread>
#include <string_view>
#include <cmath> #include <cmath>
//------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------
@ -20,16 +21,16 @@ extern "C" {
namespace Orca { namespace Orca {
namespace Utils { namespace Utils {
std::string _to_termcol(const ORCA_LOG_COLOR& col); std::string _to_termcol(const ORCA_LOG_COLOR& col);
std::string _decorate_three_lines(const std::string& msg, char decoration = '-'); std::string _decorate_three_lines(std::string_view msg, char decoration = '-');
std::string _decorate_centered(const std::string& msg, char decoration = '-'); std::string _decorate_centered(std::string_view msg, char decoration = '-');
} // namespace Utils } // namespace Utils
namespace Log { namespace Log {
std::mutex _mtx_raw_log{};
std::mutex _mtx_log{}; std::mutex _mtx_log{};
std::atomic<ORCA_LOG_LEVEL> _log_level{ ORCA_LOG_LEVEL_NONE }; std::atomic<ORCA_LOG_LEVEL> _log_level{ ORCA_LOG_LEVEL_NONE };
std::atomic<ORCA_LOG_COLOR> _log_color{ ORCA_LOG_COLOR_WHITE }; std::atomic<ORCA_LOG_COLOR> _log_color{ ORCA_LOG_COLOR_WHITE };
namespace Backend { namespace Backend {
void _log_stderr(const std::string& msg, ORCA_LOG_COLOR col = ORCA_LOG_COLOR_DEFAULT); void _log_stderr(std::string_view msg, ORCA_LOG_COLOR col = ORCA_LOG_COLOR_DEFAULT);
void _log_file(std::string_view msg);
} }
} // namespace Log } // namespace Log
} // namespace Orca } // namespace Orca
@ -116,8 +117,10 @@ extern "C" {
header << line << " "; header << line << " ";
header << funcname << " "; header << funcname << " ";
msg = header.str(); msg = header.str();
if (!std::string(msg_fmtd).empty()) { std::string_view msg_fmtd_cxx{ msg_fmtd };
msg += "- " + std::string(msg_fmtd); if (!msg_fmtd_cxx.empty()) {
msg += "- ";
msg += msg_fmtd_cxx;
} }
} }
free(msg_fmtd); free(msg_fmtd);
@ -186,38 +189,47 @@ namespace Orca {
::_orca_log_for_macro(level, file.c_str(), line, funcname.c_str(), "%s", msg.c_str()); ::_orca_log_for_macro(level, file.c_str(), line, funcname.c_str(), "%s", msg.c_str());
} }
void log(const std::string& msg, ORCA_LOG_COLOR col) void log(std::string_view msg, ORCA_LOG_COLOR col)
{ {
Backend::_log_stderr(msg, col); Backend::_log_stderr(msg, col);
} }
void logH1(const std::string& msg, ORCA_LOG_COLOR col) void logH1(std::string_view msg, ORCA_LOG_COLOR col)
{ {
Backend::_log_stderr(Utils::_decorate_three_lines(msg, '='), col); Backend::_log_stderr(Utils::_decorate_three_lines(msg, '='), col);
} }
void logH2(const std::string& msg, ORCA_LOG_COLOR col) void logH2(std::string_view msg, ORCA_LOG_COLOR col)
{ {
Backend::_log_stderr("\n" + Utils::_decorate_centered(msg, '='), col); Backend::_log_stderr("\n" + Utils::_decorate_centered(msg, '='), col);
} }
void logH3(const std::string& msg, ORCA_LOG_COLOR col) void logH3(std::string_view msg, ORCA_LOG_COLOR col)
{ {
Backend::_log_stderr(Utils::_decorate_centered(msg, '-'), col); Backend::_log_stderr(Utils::_decorate_centered(msg, '-'), col);
} }
namespace Backend { namespace Backend {
// TODO: add file backend // TODO: add file backend
void _log_stderr(const std::string& msg, ORCA_LOG_COLOR col) void _log_stderr(std::string_view msg, ORCA_LOG_COLOR col)
{ {
std::lock_guard<std::mutex> l{ _mtx_raw_log }; std::lock_guard<std::mutex> l{ _mtx_raw_log };
std::cerr << Utils::_to_termcol(col) << msg std::cerr << Utils::_to_termcol(col) << msg
<< Utils::_to_termcol(ORCA_LOG_COLOR_RESET) << Utils::_to_termcol(ORCA_LOG_COLOR_RESET)
<< std::endl; //endl also flushes, but cerr is unbuffered anyways << std::endl; //endl also flushes, but cerr is unbuffered anyways
_log_file(msg);
} }
}
} // namespace Log
void _log_file(std::string_view msg) {
std::lock_guard<std::mutex> l{ _mtx_backend_file };
std::filesystem::path path{ "logfile.log" };
std::ofstream ofs(path);
ofs << msg << std::endl;
ofs.close();
}
} // namespace Backend
} // namespace Log
namespace Utils { namespace Utils {
@ -251,7 +263,7 @@ namespace Orca {
} }
} }
std::string _decorate_three_lines(const std::string& msg, char decoration) std::string _decorate_three_lines(std::string_view msg, char decoration)
{ {
std::stringstream tmp; std::stringstream tmp;
tmp << std::string(termsize_x, decoration) << std::endl tmp << std::string(termsize_x, decoration) << std::endl
@ -260,12 +272,12 @@ namespace Orca {
return tmp.str(); return tmp.str();
} }
std::string _decorate_centered(const std::string& msg, char decoration) std::string _decorate_centered(std::string_view msg, char decoration)
{ {
std::stringstream tmp; std::stringstream tmp;
size_t max_len = termsize_x - 10; size_t max_len = termsize_x - 10;
// truncate msg // truncate msg
std::string msg_truncated = msg; std::string msg_truncated{ msg };
if (msg.length() >= max_len) { if (msg.length() >= max_len) {
msg_truncated = msg.substr(0, max_len); msg_truncated = msg.substr(0, max_len);
msg_truncated += "..."; msg_truncated += "...";
@ -286,7 +298,7 @@ namespace Orca {
//------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------
std::ostream& operator<<(std::ostream& o, const ORCA_LOG_LEVEL* level) std::ostream& operator<<(std::ostream& o, const ORCA_LOG_LEVEL* level)
{ {
return o << std::string(_orca_log_level_to_string(level)); return o << std::string_view (_orca_log_level_to_string(level));
} }
// Stuff like that would be fucking handy // Stuff like that would be fucking handy

Loading…
Cancel
Save