diff --git a/include/sled/strings/utils.h b/include/sled/strings/utils.h index d2724ed..e6ea79c 100644 --- a/include/sled/strings/utils.h +++ b/include/sled/strings/utils.h @@ -1,6 +1,8 @@ +#pragma once #ifndef SLED_STRINGS_UTILS_H #define SLED_STRINGS_UTILS_H #include +#include namespace sled { @@ -10,6 +12,14 @@ std::string ToHex(const std::string &str); std::string StrJoin(const std::vector &strings, const std::string &delim, bool skip_empty = false); +std::vector StrSplit(const std::string &str, + const std::string &delim, + bool skip_empty = false); +std::string Trim(const std::string &str, const std::string &chars = " \t\n\r"); +std::string TrimLeft(const std::string &str, + const std::string &chars = " \t\n\r"); +std::string TrimRight(const std::string &str, + const std::string &chars = " \t\n\r"); }// namespace sled #endif// SLED_STRINGS_UTILS_H diff --git a/src/strings/utils.cc b/src/strings/utils.cc index 3061c03..54ee93f 100644 --- a/src/strings/utils.cc +++ b/src/strings/utils.cc @@ -20,4 +20,49 @@ StrJoin(const std::vector &strings, } return ss.str(); } + +std::vector +StrSplit(const std::string &str, const std::string &delim, bool skip_empty) +{ + std::vector result; + if (str.empty()) { return result; } + + size_t start = 0; + size_t next_pos = str.find_first_of(delim, start); + while (next_pos != std::string::npos) { + if (!skip_empty || next_pos > start) { + result.emplace_back(str.substr(start, next_pos - start)); + } + start = next_pos + 1; + next_pos = str.find_first_of(delim, start); + } + + if (start < str.size()) { result.emplace_back(str.substr(start)); } + return result; +} + +std::string +Trim(const std::string &str, const std::string &chars) +{ + return TrimLeft(TrimRight(str)); +} + +std::string +TrimLeft(const std::string &str, const std::string &chars) +{ + size_t start = 0; + while (start < str.size() && chars.find(str[start]) != std::string::npos) { + ++start; + } + return str.substr(start); +} + +std::string +TrimRight(const std::string &str, const std::string &chars) +{ + size_t end = str.size(); + while (end > 0 && chars.find(str[end - 1]) != std::string::npos) { --end; } + return str.substr(0, end); +} + }// namespace sled