diff options
author | Chaosus <chaosus89@gmail.com> | 2019-01-18 11:29:28 +0300 |
---|---|---|
committer | Chaosus <chaosus89@gmail.com> | 2019-07-23 18:55:54 +0300 |
commit | 080c0bb7fea824f231e8972fe1e7f82290a2f453 (patch) | |
tree | 70c99fe65ad4e7a4d294206e1c65345e6f30116b /core/ustring.cpp | |
parent | c7a427241e7f4dd6ab9ac89f51d3bb9f6632008b (diff) |
Added count method to String
Diffstat (limited to 'core/ustring.cpp')
-rw-r--r-- | core/ustring.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/core/ustring.cpp b/core/ustring.cpp index 75e3b6f22e..ed401c3763 100644 --- a/core/ustring.cpp +++ b/core/ustring.cpp @@ -2729,6 +2729,51 @@ bool String::is_quoted() const { return is_enclosed_in("\"") || is_enclosed_in("'"); } +int String::_count(const String &p_string, int p_from, int p_to, bool p_case_insensitive) const { + if (p_string.empty()) { + return 0; + } + int len = length(); + int slen = p_string.length(); + if (len < slen) { + return 0; + } + String str; + if (p_from >= 0 && p_to >= 0) { + if (p_to == 0) { + p_to = len; + } else if (p_from >= p_to) { + return 0; + } + if (p_from == 0 && p_to == len) { + str = String(); + str.copy_from_unchecked(&c_str()[0], len); + } else { + str = substr(p_from, p_to - p_from); + } + } else { + return 0; + } + int c = 0; + int idx = -1; + do { + idx = p_case_insensitive ? str.findn(p_string) : str.find(p_string); + if (idx != -1) { + str = str.substr(idx + slen, str.length() - slen); + ++c; + } + } while (idx != -1); + return c; +} + +int String::count(const String &p_string, int p_from, int p_to) const { + return _count(p_string, p_from, p_to, false); +} + +int String::countn(const String &p_string, int p_from, int p_to) const { + return _count(p_string, p_from, p_to, true); +} + bool String::_base_is_subsequence_of(const String &p_string, bool case_insensitive) const { int len = length(); |