aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/cru/base/StringUtil.h47
-rw-r--r--include/cru/base/log/Logger.h8
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_;