pretty up logger/options

This commit is contained in:
2024-01-03 17:24:42 +01:00
parent ddf7eeed4e
commit 6d241b2daf
12 changed files with 33 additions and 22 deletions

View File

@@ -2,7 +2,7 @@ set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_subdirectory(vm)
add_subdirectory(logger)
add_subdirectory(support)
add_executable(psil main.cpp)

View File

@@ -1,6 +0,0 @@
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_library(logger src/Logger.cpp)
target_include_directories(logger PUBLIC include)

View File

@@ -0,0 +1,6 @@
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_library(support src/Logger.cpp src/Options.cpp)
target_include_directories(support PUBLIC include)

View File

@@ -24,21 +24,19 @@ public:
// 3 - debug
// 4 - trace
static void set_level(const std::string &tag, int level);
static void set_default_level(int level);
static void set_out(std::ostream &out);
static void set_out_err(std::ostream &out_err);
static void reset();
private:
static Logger &get();
private:
std::unordered_map<std::string, int> _levels;
static inline std::unordered_map<int, std::string> _level_names{
{ALWAYS, "ALWAYS"}, {ERROR, "ERROR"}, {INFO, "INFO"}, {DEBUG, "DEBUG"}, {TRACE, "TRACE"},
};
int _default_level = 1;
std::chrono::time_point<std::chrono::high_resolution_clock> _start_time = std::chrono::high_resolution_clock::now();
std::reference_wrapper<std::ostream> _out = std::cout;
std::reference_wrapper<std::ostream> _out_err = std::cerr;

View File

@@ -17,13 +17,14 @@ public:
static void set_bool(const std::string &opt, bool val);
static void set_int(const std::string &opt, size_t val);
static void reset();
static Options &get();
private:
const static inline std::unordered_map<std::string, std::variant<size_t, bool>> _defaults{{"cell_limit", 50000U},
{"command_strs", false}};
{"command_strs", false},
{"default_log_level", 1U}};
std::unordered_map<std::string, std::variant<size_t, bool>> _current = _defaults;
static Options &get();
};

View File

@@ -7,13 +7,16 @@
#include <iomanip>
#include <sstream>
#include "Options.h"
Logger &Logger::get() {
// Ensure proper destruction order for tests
Options::get();
static Logger logger;
return logger;
}
void Logger::log(const std::string &tag, const std::string &what, int level) {
int en_level = get()._default_level;
int en_level = Options::get_int("default_log_level");
if (get()._levels.find(tag) != get()._levels.end()) en_level = get()._levels.at(tag);
if (en_level < level) return;
@@ -30,7 +33,7 @@ void Logger::log(const std::string &tag, const std::string &what, int level) {
}
void Logger::log(const std::string &tag, const std::function<void(std::ostream &)> &fn, int level) {
int en_level = get()._default_level;
int en_level = Options::get_int("default_log_level");
if (get()._levels.find(tag) != get()._levels.end()) en_level = get()._levels.at(tag);
if (en_level < level) return;
@@ -43,5 +46,4 @@ void Logger::log(const std::string &tag, const std::function<void(std::ostream &
void Logger::set_level(const std::string &tag, int level) { get()._levels[tag] = level; }
void Logger::set_out(std::ostream &out) { get()._out = out; }
void Logger::set_out_err(std::ostream &out_err) { get()._out_err = out_err; }
void Logger::set_default_level(int level) { get()._default_level = level; }
void Logger::reset() { get()._levels = {}; }

View File

@@ -2,8 +2,8 @@ set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_library(vm src/VM.cpp src/Cell.cpp
src/Parser.cpp src/MemoryContext.cpp src/Handle.cpp src/Compiler.cpp src/Options.cpp)
src/Parser.cpp src/MemoryContext.cpp src/Handle.cpp src/Compiler.cpp)
target_link_libraries(vm PUBLIC logger)
target_link_libraries(vm PUBLIC support)
target_include_directories(vm PUBLIC include)

View File

@@ -12,7 +12,7 @@
#include "Options.h"
namespace Command {
enum Command : CellValType {
enum CommandE : CellValType {
NIL = 1,
LDC = 2,
LD = 3,

View File

@@ -11,6 +11,9 @@
using namespace Command;
static std::unordered_map<std::string_view, CommandE> builtins{{"+", ADD}};
Handle Compiler::compile(const Handle &src, Handle fake_env, const Handle &suffix) {
Handle out;
@@ -56,9 +59,9 @@ Handle Compiler::compile(const Handle &src, Handle fake_env, const Handle &suffi
Handle car = expr.car();
Handle cdr = expr.cdr();
if (car.atom()) {
if (car.strval() == "+") {
if (builtins.find(car.strval()) != builtins.end()) {
out.splice(compileArgsRaw(cdr));
out.append(make_cmd(ADD));
out.append(make_cmd(builtins.at(car.strval())));
} else if (car.strval() == "read") {
out.append(make_cmd(READ));
} else if (car.strval() == "lambda") {

View File

@@ -197,6 +197,9 @@ void MemoryContext::gc_thread_entry() {
}
}
MemoryContext &MemoryContext::get() {
// Ensure proper destruction order for tests
Options::get();
Logger::get();
static MemoryContext mc;
return mc;
}

View File

@@ -163,14 +163,18 @@ TEST(CompilerTest, GlobalDefineFnMulti) {
TEST(CompilerTest, GlobalDefineFnRec) {
std::stringstream ssin;
std::stringstream ssout;
Options::set_bool("command_strs", false);
Logger::set_level("MemoryContext", Logger::INFO);
{
VM vm(ssin, ssout);
Parser parser;
parser.loadStr(
"(LDC (define (fib n) (if n (if (+ n -1) (+ (fib (+ n -1)) (fib(+ n -2))) 1) 0) ) EVAL LDC (fib 10) EVAL PRINT STOP)");
"(LDC (define (fib n) (if n (if (+ n -1) (+ (fib (+ n -1)) (fib(+ n -2))) 1) 0) ) EVAL LDC (fib 20) EVAL PRINT STOP)");
vm.loadControl(parser.parseExpr());
vm.run();
}
Options::set_bool("command_strs", true);
Logger::set_level("MemoryContext", Options::get_int("default_log_level"));
ssout.flush();
EXPECT_EQ(ssout.str(), "55");
EXPECT_EQ(ssout.str(), "6765");
}