fix logger clang error
This commit is contained in:
@@ -2,13 +2,14 @@
|
|||||||
#include <set>
|
#include <set>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include "hack/logger/logger.hpp"
|
#include "hack/logger/logger.new.hpp"
|
||||||
#include "hack/patterns/ring_buffer.hpp"
|
#include "hack/patterns/ring_buffer.hpp"
|
||||||
#include "hack/utils/timestamp.hpp"
|
|
||||||
|
|
||||||
auto main(int argc, char *argv[]) -> int
|
auto main(int argc, char *argv[]) -> int
|
||||||
{
|
{
|
||||||
std::string str = "hi";
|
std::string str = "hi";
|
||||||
|
hack::log()(str);
|
||||||
|
|
||||||
int i = 1;
|
int i = 1;
|
||||||
double d = 2.0;
|
double d = 2.0;
|
||||||
float f = 3.f;
|
float f = 3.f;
|
||||||
@@ -32,6 +33,7 @@ auto main(int argc, char *argv[]) -> int
|
|||||||
|
|
||||||
hack::log().set_devider(", ");
|
hack::log().set_devider(", ");
|
||||||
hack::log()(1, i, 3.1f, f, 4.3, d, "asdf");
|
hack::log()(1, i, 3.1f, f, 4.3, d, "asdf");
|
||||||
|
hk::log()(i);
|
||||||
|
|
||||||
hack::log().set_devider(" = ");
|
hack::log().set_devider(" = ");
|
||||||
hack::log().on_full_path();
|
hack::log().on_full_path();
|
||||||
@@ -69,7 +71,6 @@ auto main(int argc, char *argv[]) -> int
|
|||||||
hack::log()(rb);
|
hack::log()(rb);
|
||||||
|
|
||||||
hack::log()(str.c_str());
|
hack::log()(str.c_str());
|
||||||
hack::log()(str);
|
|
||||||
|
|
||||||
std::filesystem::path p { "/test/file/path.txt" };
|
std::filesystem::path p { "/test/file/path.txt" };
|
||||||
hack::log()(p);
|
hack::log()(p);
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ executable(
|
|||||||
# 'examples/math/main.cpp',
|
# 'examples/math/main.cpp',
|
||||||
# 'examples/range/main.cpp',
|
# 'examples/range/main.cpp',
|
||||||
# 'examples/patterns/main.cpp',
|
# 'examples/patterns/main.cpp',
|
||||||
# 'examples/logger/main.cpp',
|
'examples/logger/main.cpp',
|
||||||
# 'examples/exception/main.cpp',
|
# 'examples/exception/main.cpp',
|
||||||
'examples/comparators/main.cpp',
|
# 'examples/comparators/main.cpp',
|
||||||
dependencies : deps,
|
dependencies : deps,
|
||||||
cpp_args: args,
|
cpp_args: args,
|
||||||
include_directories : inc
|
include_directories : inc
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
Вся работа с аудио на данный момент крутиться во круг wav.
|
Вся работа с аудио на данный момент крутиться во круг wav.
|
||||||
Т.е. что-то типа - воспроизвести/записать в mp3 или что-то подобное требует своей реализации, которой
|
Т.е. что-то типа - воспроизвести/записать в mp3 или что-то подобное требует своей реализации, которой
|
||||||
буду заниматься по мерее её необходимости !!!
|
буду заниматься по мере её необходимости !!!
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <iostream>
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <forward_list>
|
#include <forward_list>
|
||||||
@@ -265,10 +264,11 @@ namespace hack::concepts
|
|||||||
template<typename Container, typename Key>
|
template<typename Container, typename Key>
|
||||||
concept can_find = requires(Container c, Key&& key) { c.find(std::forward<Key>(key)); };
|
concept can_find = requires(Container c, Key&& key) { c.find(std::forward<Key>(key)); };
|
||||||
|
|
||||||
// для логирования собственных структур
|
// для логирования собственных структур
|
||||||
// мало где используется, только в логере для проверки и выдачи сообщения
|
// мало где используется, только в логере для проверки и выдачи сообщения
|
||||||
template<typename T>
|
template<typename T>
|
||||||
concept has_get_logger_data = requires(T t) {
|
concept has_get_logger_data = requires(T t)
|
||||||
|
{
|
||||||
{ t.get_logger_data() };
|
{ t.get_logger_data() };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,13 +12,42 @@
|
|||||||
#include "hack/exception/exception.hpp"
|
#include "hack/exception/exception.hpp"
|
||||||
|
|
||||||
// HERE
|
// HERE
|
||||||
// и нужно сделать реализацию где выводлится все в одной линии но при помощи цикла
|
// и нужно сделать реализацию где выводится все в одной линии но при помощи цикла
|
||||||
// типа такого:
|
// типа такого:
|
||||||
// for (auto i : range) hack::log(hack::log::line)(i);
|
// for (auto i : range) hack::log(hack::log::line)(i);
|
||||||
namespace hack
|
namespace hack
|
||||||
{
|
{
|
||||||
class logger : public hack::patterns::singleton<logger>
|
class logger : public hack::patterns::singleton<logger>
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
// настройки по умолчанию
|
||||||
|
struct config
|
||||||
|
{
|
||||||
|
bool m_on_file = true; // показывать/не показывать название файла/пути в выоде логов
|
||||||
|
bool m_on_full_path = false; // показывать/не показывать название файла/пути в выоде логов
|
||||||
|
bool m_on_func = false; // показывать/не показывать название функции в выоде логов
|
||||||
|
bool m_on_row = true; // показывать/не показывать номер строки в выоде логов
|
||||||
|
bool m_bool_as_number = false; // показывет bool как число или как текст (0, false);
|
||||||
|
std::string m_devider = " "; // разделитель по умолчанию
|
||||||
|
} m_base_config;
|
||||||
|
|
||||||
|
enum class type
|
||||||
|
{
|
||||||
|
LOG,
|
||||||
|
WARN,
|
||||||
|
ERROR
|
||||||
|
} m_type;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::source_location m_location;
|
||||||
|
std::size_t m_count = 0;
|
||||||
|
std::string m_devider = m_base_config.m_devider;
|
||||||
|
bool m_on_func = m_base_config.m_on_func;
|
||||||
|
bool m_on_full_path = m_base_config.m_on_full_path;
|
||||||
|
bool m_on_file = m_base_config.m_on_file;
|
||||||
|
bool m_on_row = m_base_config.m_on_row;
|
||||||
|
bool m_bool_as_number = m_base_config.m_bool_as_number;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void set_location(std::source_location location) { m_location = location; }
|
void set_location(std::source_location location) { m_location = location; }
|
||||||
void set_devider(std::string devider) { m_devider = devider; }
|
void set_devider(std::string devider) { m_devider = devider; }
|
||||||
@@ -43,34 +72,6 @@ namespace hack
|
|||||||
void on_warn() { m_type = type::WARN; }
|
void on_warn() { m_type = type::WARN; }
|
||||||
void on_error() { m_type = type::ERROR; }
|
void on_error() { m_type = type::ERROR; }
|
||||||
|
|
||||||
public:
|
|
||||||
template<typename... Args>
|
|
||||||
void operator() (const Args&... args)
|
|
||||||
{
|
|
||||||
m_count = sizeof...(Args);
|
|
||||||
prepare();
|
|
||||||
print_impl(args...);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
// настройки по умолчанию
|
|
||||||
struct config
|
|
||||||
{
|
|
||||||
bool m_on_file = true; // показывать/не показывать название файла/пути в выоде логов
|
|
||||||
bool m_on_full_path = false; // показывать/не показывать название файла/пути в выоде логов
|
|
||||||
bool m_on_func = false; // показывать/не показывать название функции в выоде логов
|
|
||||||
bool m_on_row = true; // показывать/не показывать номер строки в выоде логов
|
|
||||||
bool m_bool_as_number = false; // показывет bool как число или как текст (0, false);
|
|
||||||
std::string m_devider = " "; // разделитель по умолчанию
|
|
||||||
} m_base_config;
|
|
||||||
|
|
||||||
enum class type
|
|
||||||
{
|
|
||||||
LOG,
|
|
||||||
WARN,
|
|
||||||
ERROR
|
|
||||||
} m_type;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void prepare()
|
void prepare()
|
||||||
{
|
{
|
||||||
@@ -115,15 +116,15 @@ namespace hack
|
|||||||
|
|
||||||
void print_impl() { std::cout << std::endl; }
|
void print_impl() { std::cout << std::endl; }
|
||||||
|
|
||||||
// для строк
|
// для всех чисел
|
||||||
template<concepts::is_string T>
|
template<concepts::is_number T>
|
||||||
void print_t(const T& data)
|
void print_t(const T& data)
|
||||||
{
|
{
|
||||||
std::cout << data << (m_count != 0 ? m_devider : "");
|
std::cout << data << (m_count != 0 ? m_devider : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
// для всех чисел
|
// для строк
|
||||||
template<concepts::is_number T>
|
template<concepts::is_string T>
|
||||||
void print_t(const T& data)
|
void print_t(const T& data)
|
||||||
{
|
{
|
||||||
std::cout << data << (m_count != 0 ? m_devider : "");
|
std::cout << data << (m_count != 0 ? m_devider : "");
|
||||||
@@ -133,7 +134,7 @@ namespace hack
|
|||||||
{
|
{
|
||||||
std::cout << path.string() << (m_count != 0 ? m_devider : "");
|
std::cout << path.string() << (m_count != 0 ? m_devider : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
// для bool
|
// для bool
|
||||||
template<concepts::is_bool T>
|
template<concepts::is_bool T>
|
||||||
void print_t(const T& data)
|
void print_t(const T& data)
|
||||||
@@ -228,7 +229,7 @@ namespace hack
|
|||||||
// для пользовательских типов
|
// для пользовательских типов
|
||||||
// у них должен быть отпределен метод get_logger_data()
|
// у них должен быть отпределен метод get_logger_data()
|
||||||
// возвращающий один из обработанных типов
|
// возвращающий один из обработанных типов
|
||||||
template<concepts::not_supported T>
|
template<concepts::has_get_logger_data T>
|
||||||
void print_t(const T& rb)
|
void print_t(const T& rb)
|
||||||
{
|
{
|
||||||
static_assert(concepts::has_get_logger_data<T>, "Type must have get_logger_data() method that returns value_type");
|
static_assert(concepts::has_get_logger_data<T>, "Type must have get_logger_data() method that returns value_type");
|
||||||
@@ -258,18 +259,9 @@ namespace hack
|
|||||||
std::cout << key << ": ";
|
std::cout << key << ": ";
|
||||||
|
|
||||||
if (value.type() == typeid(std::string))
|
if (value.type() == typeid(std::string))
|
||||||
{
|
print_t(std::any_cast<std::string>(value));
|
||||||
// HERE
|
|
||||||
// хотельсь бы написать так:
|
|
||||||
// print_t(std::any_cast<std::string>(value));
|
|
||||||
// но по какой-то причине на эту запись ругается clangd
|
|
||||||
// Client clangd quit with exit code 0 and signal 11. Check log for errors: /home/chatlanin/.local/state/nvim/lsp.log
|
|
||||||
// когда они это порявят напишем а пока... пише так:
|
|
||||||
print_t(std::any_cast<std::string>(value).c_str());
|
|
||||||
}
|
|
||||||
else if (value.type() == typeid(std::filesystem::path))
|
else if (value.type() == typeid(std::filesystem::path))
|
||||||
print_t(std::any_cast<std::filesystem::path>(value).c_str());
|
print_t(std::any_cast<std::filesystem::path>(value).c_str());
|
||||||
// конец HERE выше
|
|
||||||
|
|
||||||
else if (value.type() == typeid(int))
|
else if (value.type() == typeid(int))
|
||||||
print_t(std::any_cast<int>(value));
|
print_t(std::any_cast<int>(value));
|
||||||
@@ -279,6 +271,7 @@ namespace hack
|
|||||||
print_t(std::any_cast<float>(value));
|
print_t(std::any_cast<float>(value));
|
||||||
else if (value.type() == typeid(bool))
|
else if (value.type() == typeid(bool))
|
||||||
print_t(std::any_cast<bool>(value));
|
print_t(std::any_cast<bool>(value));
|
||||||
|
|
||||||
// vector
|
// vector
|
||||||
else if (value.type() == typeid(std::vector<std::string>))
|
else if (value.type() == typeid(std::vector<std::string>))
|
||||||
print_t(std::any_cast<std::vector<std::string>>(value));
|
print_t(std::any_cast<std::vector<std::string>>(value));
|
||||||
@@ -288,6 +281,7 @@ namespace hack
|
|||||||
print_t(std::any_cast<std::vector<double>>(value));
|
print_t(std::any_cast<std::vector<double>>(value));
|
||||||
else if (value.type() == typeid(std::vector<float>))
|
else if (value.type() == typeid(std::vector<float>))
|
||||||
print_t(std::any_cast<std::vector<float>>(value));
|
print_t(std::any_cast<std::vector<float>>(value));
|
||||||
|
|
||||||
// map
|
// map
|
||||||
else if (value.type() == typeid(std::map<std::string, std::string>))
|
else if (value.type() == typeid(std::map<std::string, std::string>))
|
||||||
print_t(std::any_cast<std::map<std::string, std::string>>(value));
|
print_t(std::any_cast<std::map<std::string, std::string>>(value));
|
||||||
@@ -306,15 +300,14 @@ namespace hack
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
public:
|
||||||
std::source_location m_location;
|
template<typename... Args>
|
||||||
std::size_t m_count = 0;
|
void operator() (const Args&... args)
|
||||||
std::string m_devider = m_base_config.m_devider;
|
{
|
||||||
bool m_on_func = m_base_config.m_on_func;
|
m_count = sizeof...(Args);
|
||||||
bool m_on_full_path = m_base_config.m_on_full_path;
|
prepare();
|
||||||
bool m_on_file = m_base_config.m_on_file;
|
print_impl(args...);
|
||||||
bool m_on_row = m_base_config.m_on_row;
|
}
|
||||||
bool m_bool_as_number = m_base_config.m_bool_as_number;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// основная функция вызова логера
|
// основная функция вызова логера
|
||||||
|
|||||||
@@ -6,15 +6,15 @@ namespace hack::patterns
|
|||||||
struct no_copy
|
struct no_copy
|
||||||
{
|
{
|
||||||
no_copy() = default;
|
no_copy() = default;
|
||||||
no_copy(const no_copy&&) = delete;
|
no_copy(const no_copy&) = delete; // Было: const no_copy&&
|
||||||
no_copy operator=(const no_copy&&) = delete;
|
no_copy& operator=(const no_copy&) = delete; // Было: const no_copy&&
|
||||||
};
|
};
|
||||||
|
|
||||||
struct no_move
|
struct no_move
|
||||||
{
|
{
|
||||||
no_move() = default;
|
no_move() = default;
|
||||||
no_move(no_move&&) = delete;
|
no_move(no_move&&) = delete; // Было: no_move&&
|
||||||
no_move operator=(no_move&&) = delete;
|
no_move& operator=(no_move&&) = delete; // Было: no_move&&
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
|||||||
Reference in New Issue
Block a user