Cleaning up logger.
This commit is contained in:
parent
cc0bca634f
commit
48464504c8
@ -3,6 +3,10 @@ project(NBEngine VERSION 0.1.0 LANGUAGES C CXX)
|
|||||||
|
|
||||||
cmake_policy(SET CMP0135 NEW)
|
cmake_policy(SET CMP0135 NEW)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
|
||||||
if(CMAKE_BUILD_TYPE STREQUAL "Release")
|
if(CMAKE_BUILD_TYPE STREQUAL "Release")
|
||||||
message(STATUS "Targeting Release build")
|
message(STATUS "Targeting Release build")
|
||||||
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
|
|||||||
@ -12,6 +12,14 @@
|
|||||||
|
|
||||||
#include "TypeTraits.hpp"
|
#include "TypeTraits.hpp"
|
||||||
|
|
||||||
|
/*
|
||||||
|
----------- TECH DEBT ------------
|
||||||
|
Idk wtf to do here. This was originally to allow me to print
|
||||||
|
to terminal easily, but it's becoming too much of an investment.
|
||||||
|
For the time being, drop it.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
namespace nb {
|
namespace nb {
|
||||||
|
|
||||||
template <typename ST, typename U>
|
template <typename ST, typename U>
|
||||||
@ -19,15 +27,19 @@ struct SmartText {
|
|||||||
using Type = ST;
|
using Type = ST;
|
||||||
using ValType = U;
|
using ValType = U;
|
||||||
static constexpr bool HasChild = Type::HasChild;
|
static constexpr bool HasChild = Type::HasChild;
|
||||||
|
|
||||||
|
SmartText() = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename Type, typename U>
|
template <typename Type, typename U>
|
||||||
struct StyleFormatter : SmartText<StyleFormatter<Type, U>, U> {
|
struct StyleFormatter : SmartText<StyleFormatter<Type, U>, U> {
|
||||||
using Base = SmartText<StyleFormatter<Type, U>>;
|
using Base = SmartText<StyleFormatter<Type, U>, U>;
|
||||||
using Base::Type;
|
using typename Base::ValType;
|
||||||
using Base::ValType;
|
|
||||||
static constexpr bool HasChild = true;
|
static constexpr bool HasChild = true;
|
||||||
|
|
||||||
|
StyleFormatter(const std::string& _fmt, const ValType& _val, const std::string& _closing) :
|
||||||
|
fmt{_fmt}, val{_val}, closing{_closing} {}
|
||||||
|
|
||||||
std::string fmt;
|
std::string fmt;
|
||||||
ValType val;
|
ValType val;
|
||||||
std::string closing;
|
std::string closing;
|
||||||
@ -35,11 +47,12 @@ struct StyleFormatter : SmartText<StyleFormatter<Type, U>, U> {
|
|||||||
|
|
||||||
template <typename Child>
|
template <typename Child>
|
||||||
struct StyleFormatter<Child, void> : SmartText<StyleFormatter<Child, void>, void>{
|
struct StyleFormatter<Child, void> : SmartText<StyleFormatter<Child, void>, void>{
|
||||||
using Base = SmartText<StyleFormatter>;
|
using Base = SmartText<StyleFormatter<Child, void>, void>;
|
||||||
using Base::Type;
|
|
||||||
using Base::ValType;
|
using Base::ValType;
|
||||||
static constexpr bool HasChild = false;
|
static constexpr bool HasChild = false;
|
||||||
|
|
||||||
|
StyleFormatter(const std::string& _fmt) : fmt{_fmt} {}
|
||||||
|
|
||||||
std::string fmt;
|
std::string fmt;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -49,7 +62,7 @@ struct ANSITextColor;
|
|||||||
template <typename U>
|
template <typename U>
|
||||||
struct ANSITextColor : StyleFormatter<ANSITextColor<U>, U> {
|
struct ANSITextColor : StyleFormatter<ANSITextColor<U>, U> {
|
||||||
using Base = StyleFormatter<ANSITextColor, U>;
|
using Base = StyleFormatter<ANSITextColor, U>;
|
||||||
using Base::ValType
|
using typename Base::ValType;
|
||||||
using Base::HasChild;
|
using Base::HasChild;
|
||||||
|
|
||||||
template <typename = typename std::enable_if<HasChild, U>::type>
|
template <typename = typename std::enable_if<HasChild, U>::type>
|
||||||
@ -69,7 +82,23 @@ struct ANSITextColor<std::string> : StyleFormatter<ANSITextColor<std::string>, s
|
|||||||
ANSITextColor(const std::string& _val) : Base{"\x1b[92m", _val, "\x1b[39m"} {}
|
ANSITextColor(const std::string& _val) : Base{"\x1b[92m", _val, "\x1b[39m"} {}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CellBase {
|
} // namespace nb
|
||||||
|
|
||||||
|
template<typename Type, typename U>
|
||||||
|
std::ostream& operator<<(std::ostream& stream, const nb::StyleFormatter<Type, U>& msg) {
|
||||||
|
if (&stream == &std::cout) {
|
||||||
|
stream << msg.fmt;
|
||||||
|
if (msg.HasChild) {
|
||||||
|
stream << msg.val << msg.closing;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (msg.HasChild) { stream << msg.val; }
|
||||||
|
}
|
||||||
|
stream << std::flush;
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* struct CellBase {
|
||||||
uint8_t width;
|
uint8_t width;
|
||||||
uint8_t height;
|
uint8_t height;
|
||||||
};
|
};
|
||||||
@ -77,13 +106,13 @@ struct CellBase {
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
struct Cell : SmartText<Cell<T>, T> {
|
struct Cell : SmartText<Cell<T>, T> {
|
||||||
using Base = SmartText<Cell<T>, T>;
|
using Base = SmartText<Cell<T>, T>;
|
||||||
using Base::ValType
|
using typename Base::ValType;
|
||||||
using Base::HasChild;
|
using Base::HasChild;
|
||||||
|
|
||||||
Cell(const Type& _val, const uint8_t& w, const uint8_t& h=1)
|
Cell(const ValType& _val, const uint8_t& w, const uint8_t& h=1)
|
||||||
: val(_val), width(w), height(h) {}
|
: val(_val), width(w), height(h) {}
|
||||||
|
|
||||||
Type val;
|
ValType val;
|
||||||
uint8_t width;
|
uint8_t width;
|
||||||
|
|
||||||
uint8_t height;
|
uint8_t height;
|
||||||
@ -92,7 +121,7 @@ struct Cell : SmartText<Cell<T>, T> {
|
|||||||
template <>
|
template <>
|
||||||
struct Cell<std::string> : SmartText<Cell<std::string>, std::string> {
|
struct Cell<std::string> : SmartText<Cell<std::string>, std::string> {
|
||||||
using Base = SmartText<Cell<std::string>, std::string>;
|
using Base = SmartText<Cell<std::string>, std::string>;
|
||||||
using Base::ValType
|
using typename Base::ValType;
|
||||||
using Base::HasChild;
|
using Base::HasChild;
|
||||||
|
|
||||||
template <std::size_t N>
|
template <std::size_t N>
|
||||||
@ -113,7 +142,10 @@ struct Cell<std::string> : SmartText<Cell<std::string>, std::string> {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
std::ostream& operator<<(std::ostream& stream, const Cell<T>& cll) {
|
std::ostream& operator<<(std::ostream& stream, const Cell<T>& cll) {
|
||||||
|
if (&stream == &std::cout) {
|
||||||
|
stream << "\x1b[s" << cll.val << "\x1b[u\x1b[" << 1+cll.width << "C\x1b[" << 1+cll.height;
|
||||||
|
}
|
||||||
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -133,7 +165,7 @@ struct TableRow {
|
|||||||
using DelimiterArray = std::array<std::string, sizeof...(Pack)+1>;
|
using DelimiterArray = std::array<std::string, sizeof...(Pack)+1>;
|
||||||
|
|
||||||
TableRow(CellWidths&& widths_, DelimiterArray&& delims_, const Pack&... vals_)
|
TableRow(CellWidths&& widths_, DelimiterArray&& delims_, const Pack&... vals_)
|
||||||
: _widths(widths_), _delimiters(delims_) {
|
: widths(widths_), delimiters(delims_), topBorder("") {
|
||||||
nb::ForEach(_cells, GetTallestCell, _height);
|
nb::ForEach(_cells, GetTallestCell, _height);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,14 +177,22 @@ struct TableRow {
|
|||||||
return (_height=newh);
|
return (_height=newh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const CellWidths widths;
|
||||||
|
const DelimiterArray delimiters;
|
||||||
|
const std::string topBorder;
|
||||||
|
const std::string bottomBorder;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const CellWidths _widths;
|
|
||||||
const DelimiterArray _delimiters;
|
|
||||||
RowCells _cells;
|
RowCells _cells;
|
||||||
int _height;
|
int _height;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename... Pack>
|
||||||
|
std::ostream& operator<<(std::ostream& stream, const TableRow<Pack...>& row) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
template<typename... Pack>
|
template<typename... Pack>
|
||||||
class Table {
|
class Table {
|
||||||
public:
|
public:
|
||||||
@ -164,20 +204,6 @@ private:
|
|||||||
|
|
||||||
} // namespace nb
|
} // namespace nb
|
||||||
|
|
||||||
template<typename Type, typename U>
|
|
||||||
std::ostream& operator<<(std::ostream& stream, const nb::StyleFormatter<Type, U>& msg) {
|
|
||||||
if (&stream == &std::cout) {
|
|
||||||
stream << msg.fmt;
|
|
||||||
if (msg.HasChild) {
|
|
||||||
stream << msg.val << msg.closing;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (msg.HasChild) { stream << msg.val; }
|
|
||||||
}
|
|
||||||
stream << std::flush;
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _NB_TARGET_WINDOWS
|
#ifdef _NB_TARGET_WINDOWS
|
||||||
template<typename... Types>
|
template<typename... Types>
|
||||||
std::ostream& operator<<(std::ostream& stream, const nb::TableRow<Types...>& row) {
|
std::ostream& operator<<(std::ostream& stream, const nb::TableRow<Types...>& row) {
|
||||||
@ -189,6 +215,6 @@ std::ostream& operator<<(std::ostream& stream, const nb::TableRow<Types...>& row
|
|||||||
|
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
#endif // _NB_TARGET_WINDOWS
|
#endif // _NB_TARGET_WINDOWS */
|
||||||
|
|
||||||
#endif // _NB_ANSI_TERM
|
#endif // _NB_ANSI_TERM
|
||||||
@ -3,6 +3,7 @@ include_directories(./.)
|
|||||||
add_library(NBCore
|
add_library(NBCore
|
||||||
./src/Errors.cpp
|
./src/Errors.cpp
|
||||||
./src/Processes.cpp
|
./src/Processes.cpp
|
||||||
|
./src/Logger.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
if (NB_BUILD_TESTS)
|
if (NB_BUILD_TESTS)
|
||||||
|
|||||||
@ -8,13 +8,13 @@
|
|||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
#include <unordered_map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "ANSITerm.hpp"
|
|
||||||
#include "DataSink.hpp"
|
#include "DataSink.hpp"
|
||||||
#include "Processes.hpp"
|
#include "Processes.hpp"
|
||||||
#include "ThreadSafeQueue.hpp"
|
#include "ThreadSafeQueue.hpp"
|
||||||
|
#include "TypeTraits.hpp"
|
||||||
|
|
||||||
namespace nb {
|
namespace nb {
|
||||||
|
|
||||||
@ -62,48 +62,6 @@ private:
|
|||||||
LoggerType* type_ptr = static_cast<LoggerType*>(this);
|
LoggerType* type_ptr = static_cast<LoggerType*>(this);
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T, typename... Pack>
|
|
||||||
struct PackIsType;
|
|
||||||
|
|
||||||
template <typename T, typename PackType>
|
|
||||||
struct PackIsType<T, PackType> {
|
|
||||||
const bool value = std::is_base_of<T, PackType>::value;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename FirstPack, typename... Pack>
|
|
||||||
struct PackIsType<T, FirstPack, Pack...> {
|
|
||||||
const bool value = std::is_base_of<T, FirstPack>::value && PackIsType<T, Pack...>::value;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename Pack1, typename... Pack>
|
|
||||||
struct StreamRefToPtrVec {
|
|
||||||
StreamRefToPtrVec(std::vector<T*> _vec, Pack1& p1, Pack&... packs)
|
|
||||||
: vec(_vec) {
|
|
||||||
static_assert(std::is_base_of<T, Pack1>::value);
|
|
||||||
vec.push_back(&p1);
|
|
||||||
vec = StreamRefToPtrVec<T, Pack...>(vec, packs...).vec;
|
|
||||||
}
|
|
||||||
|
|
||||||
StreamRefToPtrVec(Pack1& p1, Pack&... packs)
|
|
||||||
: StreamRefToPtrVec({}, p1, packs...) {}
|
|
||||||
|
|
||||||
std::vector<T*> vec;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename Pack>
|
|
||||||
struct StreamRefToPtrVec<T, Pack> {
|
|
||||||
StreamRefToPtrVec(std::vector<T*> _vec, Pack& p1)
|
|
||||||
: vec(_vec) {
|
|
||||||
static_assert(std::is_base_of<T, Pack>::value);
|
|
||||||
vec.push_back(&p1);
|
|
||||||
}
|
|
||||||
|
|
||||||
StreamRefToPtrVec(Pack& p1)
|
|
||||||
: StreamRefToPtrVec({}, p1) {}
|
|
||||||
|
|
||||||
std::vector<T*> vec;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename LT>
|
template <typename LT>
|
||||||
class DebugLogger : public LoggerBase<LogEvent, LT, std::vector<std::ostream*>>{
|
class DebugLogger : public LoggerBase<LogEvent, LT, std::vector<std::ostream*>>{
|
||||||
using StreamType = std::vector<std::ostream*>;
|
using StreamType = std::vector<std::ostream*>;
|
||||||
@ -112,7 +70,7 @@ class DebugLogger : public LoggerBase<LogEvent, LT, std::vector<std::ostream*>>{
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
template<typename... ST>
|
template<typename... ST>
|
||||||
DebugLogger(ST&... streams) : _ostream(StreamRefToPtrVec<std::ostream, ST...>(streams...).vec) {}
|
DebugLogger(ST&... streams) : _ostream(nb::RefPackToPtrVec<std::ostream, ST...>(streams...).vec) {}
|
||||||
|
|
||||||
~DebugLogger() { type_ptr->stop(); }
|
~DebugLogger() { type_ptr->stop(); }
|
||||||
|
|
||||||
@ -152,12 +110,9 @@ private:
|
|||||||
class DefaultDebugLogger : public DebugLogger<DefaultDebugLogger> {
|
class DefaultDebugLogger : public DebugLogger<DefaultDebugLogger> {
|
||||||
using LoggerType = DefaultDebugLogger;
|
using LoggerType = DefaultDebugLogger;
|
||||||
using Base = DebugLogger<DefaultDebugLogger>;
|
using Base = DebugLogger<DefaultDebugLogger>;
|
||||||
template <typename U>
|
|
||||||
struct Field {
|
template <typename... Ts>
|
||||||
Field(int w, U v) : width{w}, val(v) {}
|
struct LogRow;
|
||||||
int width;
|
|
||||||
U val;
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
using Base::Base;
|
using Base::Base;
|
||||||
@ -166,36 +121,23 @@ public:
|
|||||||
|
|
||||||
friend class BufferedDataProcessor<LogEvent, ThreadsafeQueue<LogEvent>, DefaultDebugLogger>;
|
friend class BufferedDataProcessor<LogEvent, ThreadsafeQueue<LogEvent>, DefaultDebugLogger>;
|
||||||
|
|
||||||
template <typename STR, typename U>
|
template <typename STR, typename... Ts>
|
||||||
friend STR& operator<<(STR&, const DefaultDebugLogger::Field<U>&);
|
friend STR& operator<<(STR&, const DefaultDebugLogger::LogRow<Ts...>&);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
using Base::_ostream;
|
using Base::_ostream;
|
||||||
|
|
||||||
bool process(const LogEvent& msg) {
|
bool process(const LogEvent& msg) {
|
||||||
for (const auto os : this->_ostream) {
|
for (const auto os : this->_ostream) {
|
||||||
(*os) << "[ " << ANSITextColor<std::string>("hey") << " | "
|
*os << msg.lvl << "\t|\t" << msg.msg << "\n";
|
||||||
<< Field(2, msg.tid) << " | " << Field(10, msg.msg) << " ]\n";
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename STR, typename U>
|
extern DefaultDebugLogger logger;
|
||||||
STR& operator<<(STR& stream, const DefaultDebugLogger::Field<U>& field) {
|
|
||||||
stream << std::setw(field.width) << field.val;
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* class BasicLogger : public LoggerBase<BasicLogger> {
|
// Taking Charge of Adult ADHD by Russell Barkley
|
||||||
public:
|
|
||||||
using Base = LoggerBase<BasicLogger>;
|
|
||||||
BasicLogger(std::ostream& stream) : Base(stream) {}
|
|
||||||
|
|
||||||
virtual void process(const LogEvent& event) {
|
|
||||||
*_ostreams[0] << event.msg << "\n";
|
|
||||||
}
|
|
||||||
}; */
|
|
||||||
|
|
||||||
} // namespace nb
|
} // namespace nb
|
||||||
#endif // _NB_LOGGER
|
#endif // _NB_LOGGER
|
||||||
@ -28,6 +28,48 @@ ForEach(std::tuple<Pack...>& tup, Func f, const Args& arg) {
|
|||||||
ForEach<N+1, Func, Args, Pack...>(tup, f, arg);
|
ForEach<N+1, Func, Args, Pack...>(tup, f, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T, typename Pack1, typename... Pack>
|
||||||
|
struct RefPackToPtrVec {
|
||||||
|
RefPackToPtrVec(std::vector<T*> _vec, Pack1& p1, Pack&... packs)
|
||||||
|
: vec(_vec) {
|
||||||
|
static_assert(std::is_base_of<T, Pack1>::value);
|
||||||
|
vec.push_back(&p1);
|
||||||
|
vec = RefPackToPtrVec<T, Pack...>(vec, packs...).vec;
|
||||||
|
}
|
||||||
|
|
||||||
|
RefPackToPtrVec(Pack1& p1, Pack&... packs)
|
||||||
|
: RefPackToPtrVec({}, p1, packs...) {}
|
||||||
|
|
||||||
|
std::vector<T*> vec;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T, typename Pack>
|
||||||
|
struct RefPackToPtrVec<T, Pack> {
|
||||||
|
RefPackToPtrVec(std::vector<T*> _vec, Pack& p1)
|
||||||
|
: vec(_vec) {
|
||||||
|
static_assert(std::is_base_of<T, Pack>::value);
|
||||||
|
vec.push_back(&p1);
|
||||||
|
}
|
||||||
|
|
||||||
|
RefPackToPtrVec(Pack& p1)
|
||||||
|
: RefPackToPtrVec({}, p1) {}
|
||||||
|
|
||||||
|
std::vector<T*> vec;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T, typename... Pack>
|
||||||
|
struct PackIsSameType;
|
||||||
|
|
||||||
|
template <typename T, typename PackType>
|
||||||
|
struct PackIsSameType<T, PackType> {
|
||||||
|
const bool value = std::is_base_of<T, PackType>::value;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T, typename FirstPack, typename... Pack>
|
||||||
|
struct PackIsSameType<T, FirstPack, Pack...> {
|
||||||
|
const bool value = std::is_base_of<T, FirstPack>::value && PackIsSameType<T, Pack...>::value;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace nb
|
} // namespace nb
|
||||||
|
|
||||||
#endif // _NB_TYPE_TRAITS
|
#endif // _NB_TYPE_TRAITS
|
||||||
8
engine/NBCore/src/Logger.cpp
Normal file
8
engine/NBCore/src/Logger.cpp
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#include "Logger.hpp"
|
||||||
|
|
||||||
|
namespace nb {
|
||||||
|
|
||||||
|
nb::DefaultDebugLogger logger;
|
||||||
|
//logger.run();
|
||||||
|
|
||||||
|
} // namespace nb
|
||||||
@ -32,13 +32,8 @@ TEST(ErrorTest, Test) {
|
|||||||
EXPECT_EQ(1, 1);
|
EXPECT_EQ(1, 1);
|
||||||
|
|
||||||
std::stringstream sstream;
|
std::stringstream sstream;
|
||||||
nb::DefaultDebugLogger logr(std::cout, sstream);
|
|
||||||
ASSERT_TRUE(logr.run());
|
ASSERT_TRUE(nb::logger.isRunning());
|
||||||
ASSERT_TRUE(logr.isRunning());
|
nb::logger.log("Hey!");
|
||||||
while (!logr.isRunning()){
|
|
||||||
1+1;
|
|
||||||
}
|
|
||||||
logr.log("Hey!");
|
|
||||||
logr.stop();
|
|
||||||
std::cout << "STRINGSTREAM:\n" << sstream.str();
|
std::cout << "STRINGSTREAM:\n" << sstream.str();
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user