diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/cru/base/StringUtil.h | 47 | ||||
-rw-r--r-- | include/cru/base/log/Logger.h | 8 |
2 files changed, 55 insertions, 0 deletions
diff --git a/include/cru/base/StringUtil.h b/include/cru/base/StringUtil.h index 8f085283..ef6359ff 100644 --- a/include/cru/base/StringUtil.h +++ b/include/cru/base/StringUtil.h @@ -1,10 +1,57 @@ #pragma once #include "Base.h" +#include "Bitmask.h" #include <functional> +#include <stdexcept> #include <type_traits> +#include <vector> namespace cru { +namespace details { +struct SplitOptionsTag {}; +} // namespace details +using SplitOption = Bitmask<details::SplitOptionsTag>; +struct SplitOptions { + static constexpr SplitOption RemoveEmpty = SplitOption::FromOffset(1); +}; + +template <typename TString> +std::vector<TString> Split(const TString& str, const TString& sep, + SplitOption options = {}) { + using size_type = typename TString::size_type; + + if (sep.empty()) throw std::invalid_argument("Sep can't be empty."); + if (str.empty()) return {}; + + size_type current_pos = 0; + std::vector<TString> result; + + while (current_pos != TString::npos) { + if (current_pos == str.size()) { + if (!options.Has(SplitOptions::RemoveEmpty)) { + result.push_back({}); + } + break; + } + + auto next_pos = str.find(sep, current_pos); + auto sub = str.substr(current_pos, next_pos - current_pos); + if (!(options.Has(SplitOptions::RemoveEmpty) && sub.empty())) { + result.push_back(sub); + } + current_pos = + next_pos == TString::npos ? TString::npos : next_pos + sep.size(); + } + + return result; +} + +inline std::vector<std::string> Split(const char* str, const std::string& sep, + SplitOption options = {}) { + return Split<std::string>(std::string(str), sep, options); +} + using CodePoint = std::int32_t; constexpr CodePoint k_invalid_code_point = -1; diff --git a/include/cru/base/log/Logger.h b/include/cru/base/log/Logger.h index 1ef53654..f44bad72 100644 --- a/include/cru/base/log/Logger.h +++ b/include/cru/base/log/Logger.h @@ -6,7 +6,9 @@ #include <list> #include <memory> #include <mutex> +#include <string_view> #include <thread> +#include <unordered_set> #include <utility> #include <vector> @@ -40,6 +42,11 @@ class CRU_BASE_API Logger : public Object2 { void AddLogTarget(std::unique_ptr<ILogTarget> source); void RemoveLogTarget(ILogTarget* source); + void AddDebugTag(std::string tag); + void RemoveDebugTag(const std::string& tag); + void LoadDebugTagFromEnv(const char* env_var = "CRU_LOG_DEBUG", + std::string sep = ","); + public: void Log(LogLevel level, std::string tag, std::string message) { Log(LogInfo(level, std::move(tag), std::move(message))); @@ -59,6 +66,7 @@ class CRU_BASE_API Logger : public Object2 { private: std::mutex log_queue_mutex_; + std::unordered_set<std::string> debug_tags_; std::condition_variable log_queue_condition_variable_; std::list<LogInfo> log_queue_; bool log_stop_; |