diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7095893..c5e4dbb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -17,6 +17,7 @@ option(BUILD_PROFILING "Build the BLT profiler extension" ON)
option(BUILD_FS "Build the BLT FS utilities including the NBT + eNBT extension" ON)
option(BUILD_PARSE "Build the BLT parsers" ON)
option(BUILD_FORMAT "Build the BLT formatters" ON)
+option(BUILD_LOGGING "Build the BLT logging utilities" ON)
option(BUILD_TESTS "Build the BLT test set" OFF)
@@ -70,8 +71,14 @@ if (${BUILD_FORMAT})
message(STATUS "Building ${Yellow}format${ColourReset} cxx files")
file(GLOB_RECURSE FORMAT_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/blt/format/*.cpp")
else ()
- set(FORMAT_FILES ""
- include/blt/std/iterator.h)
+ set(FORMAT_FILES "")
+endif ()
+
+if (${BUILD_LOGGING})
+ message(STATUS "Building ${Yellow}logging${ColourReset} cxx files")
+ file(GLOB_RECURSE LOGGING_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/blt/logging/*.cpp")
+else ()
+ set(PARSE_FILES "")
endif ()
if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/libraries/parallel-hashmap)
@@ -93,7 +100,7 @@ endif ()
include_directories(include/)
include_directories(${CMAKE_CURRENT_BINARY_DIR}/config/)
-add_library(${BLT_TARGET} ${STD_FILES} ${PROFILING_FILES} ${FS_FILES} ${PARSE_FILES} ${FORMAT_FILES})
+add_library(${BLT_TARGET} ${STD_FILES} ${PROFILING_FILES} ${FS_FILES} ${PARSE_FILES} ${FORMAT_FILES} ${LOGGING_FILES})
string(REPLACE "+" "\\+" escaped_source ${CMAKE_CURRENT_SOURCE_DIR})
string(APPEND escaped_source "/src/blt/.*/")
diff --git a/cloc.sh b/cloc.sh
old mode 100644
new mode 100755
diff --git a/include/blt/logging/logging.h b/include/blt/logging/logging.h
new file mode 100644
index 0000000..da4b5f2
--- /dev/null
+++ b/include/blt/logging/logging.h
@@ -0,0 +1,34 @@
+#pragma once
+/*
+ * Copyright (C) 2024 Brett Terpstra
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#ifndef BLT_LOGGING_LOGGING_H
+#define BLT_LOGGING_LOGGING_H
+
+#include
+
+namespace blt::logging
+{
+
+ template
+ void log(const std::string& str, Args&&... args){
+
+ }
+
+}
+
+#endif // BLT_LOGGING_LOGGING_H
diff --git a/include/blt/logging/status.h b/include/blt/logging/status.h
new file mode 100644
index 0000000..3f0b999
--- /dev/null
+++ b/include/blt/logging/status.h
@@ -0,0 +1,27 @@
+#pragma once
+/*
+ * Copyright (C) 2024 Brett Terpstra
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#ifndef BLT_LOGGING_STATUS_H
+#define BLT_LOGGING_STATUS_H
+
+namespace blt::logging
+{
+
+}
+
+#endif //BLT_LOGGING_STATUS_H
diff --git a/include/blt/parse/argparse_v2 (conflicted copy 2025-02-13 174730).h b/include/blt/parse/argparse_v2 (conflicted copy 2025-02-13 174730).h
deleted file mode 100644
index e72fc0f..0000000
--- a/include/blt/parse/argparse_v2 (conflicted copy 2025-02-13 174730).h
+++ /dev/null
@@ -1,484 +0,0 @@
-#pragma once
-/*
- * Copyright (C) 2024 Brett Terpstra
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-#ifndef BLT_PARSE_ARGPARSE_V2_H
-#define BLT_PARSE_ARGPARSE_V2_H
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-namespace blt::argparse
-{
- class argument_string_t;
- class argument_consumer_t;
- class argument_parser_t;
- class argument_subparser_t;
- class argument_builder_t;
- class argument_storage_t;
-
- enum class action_t
- {
- STORE,
- STORE_CONST,
- STORE_TRUE,
- STORE_FALSE,
- APPEND,
- APPEND_CONST,
- COUNT,
- HELP,
- VERSION,
- EXTEND,
- SUBCOMMAND
- };
-
- enum class nargs_t
- {
- IF_POSSIBLE,
- ALL,
- ALL_AT_LEAST_ONE
- };
-
- using nargs_v = std::variant;
-
- namespace detail
- {
- class bad_flag final : public std::runtime_error
- {
- public:
- explicit bad_flag(const std::string& message): std::runtime_error(message)
- {
- }
-
- explicit bad_flag(const char* message): std::runtime_error(message)
- {
- }
- };
-
- class missing_argument_error final : public std::runtime_error
- {
- public:
- explicit missing_argument_error(const std::string& message): std::runtime_error(message)
- {
- }
- }
-
- class subparse_error final : public std::exception
- {
- public:
- explicit subparse_error(const std::string_view found_string, std::vector> allowed_strings):
- m_found_string(found_string),
- m_allowed_strings(std::move(allowed_strings))
- {
- }
-
- [[nodiscard]] const std::vector>& get_allowed_strings() const
- {
- return m_allowed_strings;
- }
-
- [[nodiscard]] std::string_view get_found_string() const
- {
- return m_found_string;
- }
-
- [[nodiscard]] std::string error_string() const
- {
- std::string message = "Subparser Error: ";
- message += m_found_string;
- message += " is not a valid command. Allowed commands are: {";
- for (const auto [i, allowed_string] : enumerate(m_allowed_strings))
- {
- if (allowed_string.size() > 1)
- message += '[';
- for (const auto [j, alias] : enumerate(allowed_string))
- {
- message += alias;
- if (j < alias.size() - 2)
- message += ", ";
- else if (j < alias.size())
- message += ", or ";
- }
- if (allowed_string.size() > 1)
- message += ']';
- if (i != m_allowed_strings.size() - 1)
- message += ' ';
- }
- message += "}";
- return message;
- }
-
- [[nodiscard]] const char* what() const override
- {
- return "Please use error_string() method instead of what(). This exception should *always* be caught!";
- }
-
- private:
- std::string_view m_found_string;
- std::vector> m_allowed_strings;
- };
-
- template
- struct arg_data_helper_t
- {
- using arg_primitive_data_t = std::variant;
- using arg_list_data_t = std::variant...>;
- };
-
- using data_helper_t = arg_data_helper_t;
-
- using arg_primitive_data_t = data_helper_t::arg_primitive_data_t;
- using arg_list_data_t = data_helper_t::arg_list_data_t;
- using arg_data_t = std::variant;
-
- template
- struct arg_type_t
- {
- static T convert(const std::string_view value)
- {
- static_assert(std::is_arithmetic_v || std::is_same_v || std::is_same_v,
- "Type must be arithmetic, string_view or string!");
- const std::string temp{value};
-
- if constexpr (std::is_same_v)
- {
- return std::stof(temp);
- }
- else if constexpr (std::is_same_v)
- {
- return std::stod(temp);
- }
- else if constexpr (std::is_unsigned_v)
- {
- return static_cast(std::stoull(temp));
- }
- else if constexpr (std::is_signed_v)
- {
- return static_cast(std::stoll(temp));
- }
- else if constexpr (std::is_same_v)
- {
- return value;
- }
- else if constexpr (std::is_same_v)
- {
- return std::string(value);
- }
- BLT_UNREACHABLE;
- }
- };
-
- void test();
- }
-
- class argument_string_t
- {
- public:
- explicit argument_string_t(const char* input, const hashset_t& allowed_flag_prefix): m_argument(input),
- allowed_flag_prefix(&allowed_flag_prefix)
- {
- if (input == nullptr)
- throw detail::bad_flag("Argument cannot be null!");
- process_argument();
- }
-
- [[nodiscard]] std::string_view get_flag() const
- {
- return m_flag_section;
- }
-
- [[nodiscard]] std::string_view get_name() const
- {
- return m_name_section;
- }
-
- [[nodiscard]] std::string_view value() const
- {
- return get_name();
- }
-
- [[nodiscard]] bool is_flag() const
- {
- return !m_flag_section.empty();
- }
-
- [[nodiscard]] std::string_view get_argument() const
- {
- return m_argument;
- }
-
- private:
- void process_argument()
- {
- size_t start = 0;
- for (; start < m_argument.size() && allowed_flag_prefix->contains(m_argument[start]); start++)
- {
- }
-
- m_flag_section = {m_argument.data(), start};
- m_name_section = {m_argument.data() + start, m_argument.size() - start};
- }
-
- std::string_view m_argument;
- std::string_view m_flag_section;
- std::string_view m_name_section;
- const hashset_t* allowed_flag_prefix;
- };
-
- class argument_consumer_t
- {
- public:
- explicit argument_consumer_t(const span& args): m_args(args)
- {
- }
-
- [[nodiscard]] argument_string_t peek(const i32 offset = 0) const
- {
- return m_args[m_forward_index + offset];
- }
-
- argument_string_t consume()
- {
- return m_args[m_forward_index++];
- }
-
- [[nodiscard]] i32 position() const
- {
- return m_forward_index;
- }
-
- [[nodiscard]] i32 remaining() const
- {
- return static_cast(m_args.size()) - m_forward_index;
- }
-
- [[nodiscard]] bool has_next(const i32 offset = 0) const
- {
- return (offset + m_forward_index) < m_args.size();
- }
-
- private:
- span m_args;
- i32 m_forward_index = 0;
- };
-
- class argument_storage_t
- {
- friend argument_parser_t;
- friend argument_subparser_t;
- friend argument_builder_t;
-
- public:
- template
- const T& get(const std::string_view key)
- {
- return std::get(m_data[key]);
- }
-
- std::string_view get(const std::string_view key)
- {
- return std::get(m_data[key]);
- }
-
- bool contains(const std::string_view key)
- {
- return m_data.find(key) != m_data.end();
- }
-
- private:
- hashmap_t m_data;
- };
-
- class argument_builder_t
- {
- friend argument_parser_t;
-
- public:
- argument_builder_t()
- {
- dest_func = [](const std::string_view dest, argument_storage_t& storage, std::string_view value)
- {
- storage.m_data[dest] = value;
- };
- }
-
- template
- argument_builder_t& as_type()
- {
- dest_func = [](const std::string_view dest, argument_storage_t& storage, std::string_view value)
- {
- storage.m_data[dest] = detail::arg_type_t::convert(value);
- };
- return *this;
- }
-
- private:
- action_t action = action_t::STORE;
- bool required = false; // do we require this argument to be provided as an argument?
- nargs_v nargs = 1; // number of arguments to consume
- std::optional metavar; // variable name to be used in the help string
- std::optional help; // help string to be used in the help string
- std::optional> choices; // optional allowed choices for this argument
- std::optional default_value;
- std::optional const_value;
- // dest, storage, value input
- std::function dest_func;
- };
-
- class argument_parser_t
- {
- friend argument_subparser_t;
-
- public:
- explicit argument_parser_t(const std::optional name = {}, const std::optional usage = {},
- const std::optional description = {}, const std::optional epilogue = {}):
- m_name(name), m_usage(usage), m_description(description), m_epilogue(epilogue)
- {
- }
-
- template
- argument_builder_t& add_flag(const std::string_view arg, Aliases... aliases)
- {
- static_assert(
- std::conjunction_v, std::is_constructible<
- std::string_view, Aliases>>...>,
- "Arguments must be of type string_view, convertible to string_view or be string_view constructable");
- m_argument_builders.emplace_back();
- m_flag_arguments[arg] = &m_argument_builders.back();
- ((m_flag_arguments[std::string_view{aliases}] = &m_argument_builders.back()), ...);
- return m_argument_builders.back();
- }
-
- argument_builder_t& add_positional(const std::string_view arg)
- {
- m_argument_builders.emplace_back();
- m_positional_arguments[arg] = &m_argument_builders.back();
- return m_argument_builders.back();
- }
-
- argument_subparser_t& add_subparser(std::string_view dest);
-
- void parse(argument_consumer_t& consumer); // NOLINT
-
- void print_help();
-
- argument_parser_t& set_name(const std::string_view name)
- {
- m_name = name;
- return *this;
- }
-
- argument_parser_t& set_usage(const std::string_view usage)
- {
- m_usage = usage;
- return *this;
- }
-
- [[nodiscard]] const std::optional& get_usage() const
- {
- return m_usage;
- }
-
- argument_parser_t& set_description(const std::string_view description)
- {
- m_description = description;
- return *this;
- }
-
- [[nodiscard]] const std::optional& get_description() const
- {
- return m_description;
- }
-
- argument_parser_t& set_epilogue(const std::string_view epilogue)
- {
- m_epilogue = epilogue;
- return *this;
- }
-
- [[nodiscard]] const std::optional& get_epilogue() const
- {
- return m_epilogue;
- }
-
- private:
- std::optional m_name;
- std::optional m_usage;
- std::optional m_description;
- std::optional m_epilogue;
- std::vector> m_subparsers;
- std::vector m_argument_builders;
- hashmap_t m_flag_arguments;
- hashmap_t m_positional_arguments;
- };
-
- class argument_subparser_t
- {
- public:
- explicit argument_subparser_t(const argument_parser_t& parent): m_parent(&parent)
- {
- }
-
- template
- argument_parser_t& add_parser(const std::string_view name, Aliases... aliases)
- {
- static_assert(
- std::conjunction_v, std::is_constructible<
- std::string_view, Aliases>>...>,
- "Arguments must be of type string_view, convertible to string_view or be string_view constructable");
- m_parsers.emplace(name);
- ((m_aliases[std::string_view{aliases}] = &m_parsers[name]), ...);
- return m_parsers[name];
- }
-
-
- /**
- * Parses the next argument using the provided argument consumer.
- *
- * This function uses an argument consumer to extract and process the next argument.
- * If the argument is a flag or if it cannot be matched against the available parsers,
- * an exception is thrown.
- *
- * @param consumer Reference to an argument_consumer_t object, which handles argument parsing.
- * The consumer provides the next argument to be parsed.
- *
- * @throws detail::subparse_error If the argument is a flag or does not match any known parser.
- */
- argument_string_t parse(argument_consumer_t& consumer); // NOLINT
-
- private:
- [[nodiscard]] std::vector> get_allowed_strings() const;
-
- const argument_parser_t* m_parent;
- hashmap_t m_parsers;
- hashmap_t m_aliases;
- };
-}
-
-#endif //BLT_PARSE_ARGPARSE_V2_H
diff --git a/libraries/parallel-hashmap b/libraries/parallel-hashmap
index 2ec7990..7ef2e73 160000
--- a/libraries/parallel-hashmap
+++ b/libraries/parallel-hashmap
@@ -1 +1 @@
-Subproject commit 2ec799017610ef831f4dc29c21fb3cce7e4a19b9
+Subproject commit 7ef2e733416953b222851f9a360d7fc72d068ee5
diff --git a/src/blt/logging/logging.cpp b/src/blt/logging/logging.cpp
new file mode 100644
index 0000000..5f723e8
--- /dev/null
+++ b/src/blt/logging/logging.cpp
@@ -0,0 +1,23 @@
+/*
+ *
+ * Copyright (C) 2025 Brett Terpstra
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include
+
+namespace blt
+{
+
+}
diff --git a/src/blt/logging/status.cpp b/src/blt/logging/status.cpp
new file mode 100644
index 0000000..9ff1411
--- /dev/null
+++ b/src/blt/logging/status.cpp
@@ -0,0 +1,23 @@
+/*
+ *
+ * Copyright (C) 2025 Brett Terpstra
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include
+
+namespace blt
+{
+
+}
\ No newline at end of file