From 5490495227ddb9735bcc75127566aa1b8dbd1e98 Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Wed, 3 Jan 2024 23:38:48 +0100 Subject: [PATCH] options prettier --- clitests/decorate.psil | 12 ++++++------ src/main.cpp | 6 +++--- src/support/include/Options.h | 22 ++++++++++++++++++---- src/support/src/Logger.cpp | 2 +- src/support/src/Options.cpp | 29 +---------------------------- src/vm/include/Command.h | 3 ++- src/vm/include/MemoryContext.h | 8 ++++---- test/vm/CompilerTest.cpp | 8 ++++---- test/vm/GCTest.cpp | 2 +- test/vm/VMTest.cpp | 2 +- test/vm/VMWithParserTest.cpp | 2 +- 11 files changed, 42 insertions(+), 54 deletions(-) diff --git a/clitests/decorate.psil b/clitests/decorate.psil index 4e72ea4..615fea9 100644 --- a/clitests/decorate.psil +++ b/clitests/decorate.psil @@ -2,10 +2,10 @@ (lambda (x) (g (f x))) ) -(define (foldl op acc l) +(define (fold op acc l) (if (nil? l) acc - (op (car l) (foldl op acc (cdr l))) + (op (car l) (fold op acc (cdr l))) ) ) @@ -14,7 +14,7 @@ ) ((decorate (lambda (x) (+ x 1)) (lambda (x) (+ x 2))) 1) -((decorate (lambda (lst) (foldl plus 0 lst)) (lambda (x) (* x x))) (quote(1 2 3))) -((decorate (lambda (lst) (foldl plus 0 lst)) (lambda (x) (/ x 2))) (quote(1 2 3))) -((decorate (lambda (lst) (foldl plus 0 lst)) (lambda (x) (= x 0))) (nil)) -((decorate (lambda (lst) (foldl plus 0 lst)) (lambda (x) (= x 0))) (quote(1))) \ No newline at end of file +((decorate (lambda (lst) (fold plus 0 lst)) (lambda (x) (* x x))) (quote(1 2 3))) +((decorate (lambda (lst) (fold plus 0 lst)) (lambda (x) (/ x 2))) (quote(1 2 3))) +((decorate (lambda (lst) (fold plus 0 lst)) (lambda (x) (= x 0))) (nil)) +((decorate (lambda (lst) (fold plus 0 lst)) (lambda (x) (= x 0))) (quote(1))) \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 79790f5..f40e38e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -44,10 +44,10 @@ void parse_options(int argc, char *argv[]) { if (str.back() != '+' && str.back() != '-') { throw std::invalid_argument("Bool options must be in format --option[+/-], instead have" + arg); } - Options::set_bool(str.substr(0, str.length() - 1), str.back() == '+' ? true : false); + Options::set(str.substr(0, str.length() - 1), str.back() == '+' ? true : false); } else if (split.size() == 2) { try { - Options::set_int(split.at(0), std::stoi(split.at(1))); + Options::set(split.at(0), std::stoi(split.at(1))); } catch (...) { throw std::invalid_argument("Log options must be in format --log:TAG:LEVEL, instead have: " + arg); } } else { throw std::invalid_argument("Can't parse argument " + arg); @@ -100,7 +100,7 @@ int main(int argc, char *argv[]) { cur_expr = cur_expr.cdr(); } } - if (Options::get_bool("repl")) + if (Options::get("repl")) while (true) { std::cout << std::endl << "> "; vm.loadControl(repl); diff --git a/src/support/include/Options.h b/src/support/include/Options.h index c688f43..9720f36 100644 --- a/src/support/include/Options.h +++ b/src/support/include/Options.h @@ -13,10 +13,24 @@ #include class Options { public: - static bool get_bool(const std::string &opt); - static size_t get_int(const std::string &opt); - static void set_bool(const std::string &opt, bool val); - static void set_int(const std::string &opt, size_t val); + template + static T get(const std::string &opt) { + Options &o = get(); + std::shared_lock l(o._mutex); + if (_defaults.find(opt) == _defaults.end()) throw std::invalid_argument("Unknown option " + opt); + if (!std::holds_alternative(_defaults.at(opt))) throw std::invalid_argument("Bad option type " + opt); + return std::get(o._current.at(opt)); + } + + template + static void set(const std::string &opt, const T &val) { + Options &o = get(); + std::lock_guard l(o._mutex); + if (_defaults.find(opt) == _defaults.end()) throw std::invalid_argument("Unknown option " + opt); + if (!std::holds_alternative(_defaults.at(opt))) throw std::invalid_argument("Bad option type " + opt); + o._current[opt] = val; + } + static void reset(); static Options &get(); diff --git a/src/support/src/Logger.cpp b/src/support/src/Logger.cpp index 91ff48d..048fca9 100644 --- a/src/support/src/Logger.cpp +++ b/src/support/src/Logger.cpp @@ -55,7 +55,7 @@ void Logger::reset() { } int Logger::get_level(const std::string &tag) { std::shared_lock l(get()._mutex); - int en_level = Options::get_int("default_log_level"); + int en_level = Options::get("default_log_level"); if (get()._levels.find(tag) != get()._levels.end()) en_level = get()._levels.at(tag); return en_level; } diff --git a/src/support/src/Options.cpp b/src/support/src/Options.cpp index 56a6fc7..256b7ac 100644 --- a/src/support/src/Options.cpp +++ b/src/support/src/Options.cpp @@ -10,34 +10,7 @@ Options &Options::get() { static Options opts; return opts; } -bool Options::get_bool(const std::string &opt) { - Options &o = get(); - std::shared_lock l(o._mutex); - if (_defaults.find(opt) == _defaults.end()) throw std::invalid_argument("Unknown option " + opt); - if (!std::holds_alternative(_defaults.at(opt))) throw std::invalid_argument("Bad option type " + opt); - return std::get(o._current.at(opt)); -} -size_t Options::get_int(const std::string &opt) { - Options &o = get(); - std::shared_lock l(o._mutex); - if (_defaults.find(opt) == _defaults.end()) throw std::invalid_argument("Unknown option " + opt); - if (!std::holds_alternative(_defaults.at(opt))) throw std::invalid_argument("Bad option type " + opt); - return std::get(o._current.at(opt)); -} -void Options::set_bool(const std::string &opt, bool val) { - Options &o = get(); - std::lock_guard l(o._mutex); - if (_defaults.find(opt) == _defaults.end()) throw std::invalid_argument("Unknown option " + opt); - if (!std::holds_alternative(_defaults.at(opt))) throw std::invalid_argument("Bad option type " + opt); - o._current[opt] = val; -} -void Options::set_int(const std::string &opt, size_t val) { - Options &o = get(); - std::lock_guard l(o._mutex); - if (_defaults.find(opt) == _defaults.end()) throw std::invalid_argument("Unknown option " + opt); - if (!std::holds_alternative(_defaults.at(opt))) throw std::invalid_argument("Bad option type " + opt); - o._current[opt] = val; -} + void Options::reset() { std::lock_guard l(get()._mutex); get()._current = _defaults; diff --git a/src/vm/include/Command.h b/src/vm/include/Command.h index c9cdf4c..81ddde3 100644 --- a/src/vm/include/Command.h +++ b/src/vm/include/Command.h @@ -29,6 +29,7 @@ namespace Command { ADD = 13, SUB = 14, + // Encountered in tests READCHAR = 15, PUTCHAR = 16, PUTNUM = 17, @@ -61,7 +62,7 @@ namespace Command { {25, "EQ"}, {26, "LT"}, {27, "GT"}, {28, "NILC"}, {29, "MULT"}, {30, "DIV"}}; static inline Handle make_cmd(CellValType cmd) { - if (Options::get_bool("command_strs")) { + if (Options::get("command_strs")) { return Handle(cmd_to_str.at(cmd)); } else return Handle(cmd); diff --git a/src/vm/include/MemoryContext.h b/src/vm/include/MemoryContext.h index a6b6ecc..e2aea58 100644 --- a/src/vm/include/MemoryContext.h +++ b/src/vm/include/MemoryContext.h @@ -73,17 +73,17 @@ private: tcellnum = _temp_cells.size(); } - if ((_cells_num + tcellnum) >= (Options::get_int("cell_limit"))) { + if ((_cells_num + tcellnum) >= (Options::get("cell_limit"))) { // We might need to run GC twice as it has to process the messages; Logger::log("MemoryContext", "Running forced gc", Logger::ERROR); - for (int i = 0; i < 3 && (_cells_num + tcellnum) >= (Options::get_int("cell_limit")); i++) { + for (int i = 0; i < 3 && (_cells_num + tcellnum) >= (Options::get("cell_limit")); i++) { request_gc_and_wait(); { std::lock_guard tmplg(_new_roots_lock); tcellnum = _temp_cells.size(); } } - if ((_cells_num + tcellnum) >= (Options::get_int("cell_limit"))) { + if ((_cells_num + tcellnum) >= (Options::get("cell_limit"))) { Logger::log("MemoryContext", "Out of cells", Logger::ERROR); throw std::runtime_error("Out of cells"); @@ -96,7 +96,7 @@ private: std::lock_guard tmplg(_new_roots_lock); Handle ret(cell); _temp_cells.emplace_back(cell); - if ((_cells_num + _temp_cells.size() + 1) >= (size_t) (Options::get_int("cell_limit") / 2)) { request_gc(); } + if ((_cells_num + _temp_cells.size() + 1) >= (size_t) (Options::get("cell_limit") / 2)) { request_gc(); } return ret; } } diff --git a/test/vm/CompilerTest.cpp b/test/vm/CompilerTest.cpp index 1d7d2f0..e165cb7 100644 --- a/test/vm/CompilerTest.cpp +++ b/test/vm/CompilerTest.cpp @@ -13,7 +13,7 @@ public: ~Environment() override {} void SetUp() override { - Options::set_bool("command_strs", true); + Options::set("command_strs", true); Logger::set_level("VM", Logger::DEBUG); Logger::set_level("Compiler", Logger::DEBUG); } @@ -273,8 +273,8 @@ TEST(CompilerTest, GlobalDefineFnMultiTwo) { TEST(CompilerTest, GlobalDefineFnRec) { std::stringstream ssin; std::stringstream ssout; - Options::set_bool("command_strs", false); - Logger::set_level("VM", Options::get_int("default_log_level")); + Options::set("command_strs", false); + Logger::set_level("VM", Options::get("default_log_level")); { VM vm(ssin, ssout); Parser parser; @@ -283,7 +283,7 @@ TEST(CompilerTest, GlobalDefineFnRec) { vm.loadControl(parser.parseExpr()); vm.run(); } - Options::set_bool("command_strs", true); + Options::set("command_strs", true); Logger::set_level("VM", Logger::DEBUG); ssout.flush(); EXPECT_EQ(ssout.str(), "6765\n"); diff --git a/test/vm/GCTest.cpp b/test/vm/GCTest.cpp index 6f27e3c..4663ddb 100644 --- a/test/vm/GCTest.cpp +++ b/test/vm/GCTest.cpp @@ -10,7 +10,7 @@ public: ~Environment() override {} void SetUp() override { - Options::set_int("cell_limit", 60000); + Options::set("cell_limit", 60000); Logger::set_level("Compiler", Logger::DEBUG); } diff --git a/test/vm/VMTest.cpp b/test/vm/VMTest.cpp index 060ae49..1b09509 100644 --- a/test/vm/VMTest.cpp +++ b/test/vm/VMTest.cpp @@ -7,7 +7,7 @@ public: ~Environment() override {} void SetUp() override { - Options::set_int("cell_limit", 1000); + Options::set("cell_limit", 1000); Logger::set_level("Compiler", Logger::DEBUG); } diff --git a/test/vm/VMWithParserTest.cpp b/test/vm/VMWithParserTest.cpp index e6d1793..7146ca8 100644 --- a/test/vm/VMWithParserTest.cpp +++ b/test/vm/VMWithParserTest.cpp @@ -8,7 +8,7 @@ public: ~Environment() override {} void SetUp() override { - Options::set_int("cell_limit", 2000); + Options::set("cell_limit", 2000); Logger::set_level("Compiler", Logger::DEBUG); }