// license:GPL-2.0+ // copyright-holders:Couriersud /* * pstrutil.h */ #ifndef PSTRUTIL_H_ #define PSTRUTIL_H_ #include "pstring.h" #include "ptypes.h" #include #include #include #include #include #include namespace plib { template struct string_info { using mem_t = typename T::mem_t; }; template<> struct string_info { using mem_t = char; }; template pstring to_string(const T &v) { return pstring(std::to_string(v)); } template pwstring to_wstring(const T &v) { return pwstring(std::to_wstring(v)); } template typename T::size_type find_first_not_of(const T &str, const T &no) { typename T::size_type pos = 0; for (auto it = str.begin(); it != str.end(); ++it, ++pos) { bool f = true; for (typename T::value_type const jt : no) { if (*it == jt) { f = false; break; } } if (f) return pos; } return T::npos; } template typename T::size_type find_last_not_of(const T &str, const T &no) { /* FIXME: reverse iterator */ typename T::size_type last_found = T::npos; typename T::size_type pos = 0; for (auto it = str.begin(); it != str.end(); ++it, ++pos) { bool f = true; for (typename T::value_type const jt : no) { if (*it == jt) { f = false; break; } } if (f) last_found = pos; } return last_found; } template typename T::size_type find_last_of(const T &str, const T &no) { typename T::size_type last_found = T::npos; typename T::size_type pos = 0; for (auto it = str.begin(); it != str.end(); ++it, ++pos) { bool f = false; for (typename T::value_type const jt : no) { if (*it == jt) { f = true; break; } } if (f) last_found = pos; } return last_found; } template T ltrim(const T &str, const T &ws = T(" \t\n\r")) { auto f = find_first_not_of(str, ws); return (f == T::npos) ? T() : str.substr(f); } template T rtrim(const T &str, const T &ws = T(" \t\n\r")) { auto f = find_last_not_of(str, ws); return (f == T::npos) ? T() : str.substr(0, f + 1); } template T trim(const T &str, const T &ws = T(" \t\n\r")) { return rtrim(ltrim(str, ws), ws); } template T left(const T &str, typename T::size_type len) { return str.substr(0, len); } template T right(const T &str, typename T::size_type nlen) { return nlen >= str.length() ? str : str.substr(str.length() - nlen, nlen); } template bool startsWith(const T &str, const T &arg) { return (arg == left(str, arg.length())); } template bool endsWith(const T &str, const T &arg) { return (right(str, arg.length()) == arg); } template bool startsWith(const T &str, const TA &arg) { return startsWith(str, static_cast(arg)); } template bool endsWith(const T &str, const TA &arg) { return endsWith(str, static_cast(arg)); } template std::size_t strlen(const T *str) { const T *p = str; while (*p) p++; return static_cast(p - str); } template T ucase(const T &str) { T ret; for (const auto &c : str) if (c >= 'a' && c <= 'z') ret += (c - 'a' + 'A'); else ret += c; return ret; } template T rpad(const T &str, const T &ws, const typename T::size_type cnt) { // FIXME: pstringbuffer ret(*this); T ret(str); typename T::size_type wsl = ws.length(); for (auto i = ret.length(); i < cnt; i+=wsl) ret += ws; return ret; } template T replace_all(const T &str, const T &search, const T &replace) { T ret; const typename T::size_type slen = search.length(); typename T::size_type last_s = 0; typename T::size_type s = str.find(search, last_s); while (s != T::npos) { ret += str.substr(last_s, s - last_s); ret += replace; last_s = s + slen; s = str.find(search, last_s); } ret += str.substr(last_s); return ret; } template T replace_all(const T &str, const T1 &search, const T2 &replace) { return replace_all(str, static_cast(search), static_cast(replace)); } } // namespace plib #endif /* PSTRUTIL_H_ */