diff --git a/core/string/ustring.cpp b/core/string/ustring.cpp index 3608d1afc16..f061c40a368 100644 --- a/core/string/ustring.cpp +++ b/core/string/ustring.cpp @@ -3329,7 +3329,7 @@ int String::find(const char *p_str, int p_from) const { } int String::find_char(char32_t p_char, int p_from) const { - return _cowdata.find(p_char, p_from); + return span().find(p_char, p_from); } int String::findmk(const Vector &p_keys, int p_from, int *r_key) const { @@ -3566,7 +3566,7 @@ int String::rfind(const char *p_str, int p_from) const { } int String::rfind_char(char32_t p_char, int p_from) const { - return _cowdata.rfind(p_char, p_from); + return span().rfind(p_char, p_from); } int String::rfindn(const String &p_str, int p_from) const { diff --git a/core/templates/cowdata.h b/core/templates/cowdata.h index 98815839517..9bfbd2f6867 100644 --- a/core/templates/cowdata.h +++ b/core/templates/cowdata.h @@ -252,10 +252,6 @@ public: _FORCE_INLINE_ operator Span() const { return Span(ptr(), size()); } _FORCE_INLINE_ Span span() const { return operator Span(); } - Size find(const T &p_val, Size p_from = 0) const; - Size rfind(const T &p_val, Size p_from = -1) const; - Size count(const T &p_val) const; - _FORCE_INLINE_ CowData() {} _FORCE_INLINE_ ~CowData() { _unref(); } _FORCE_INLINE_ CowData(std::initializer_list p_init); @@ -430,54 +426,6 @@ Error CowData::_realloc(Size p_alloc_size) { return OK; } -template -typename CowData::Size CowData::find(const T &p_val, Size p_from) const { - Size ret = -1; - - if (p_from < 0 || size() == 0) { - return ret; - } - - for (Size i = p_from; i < size(); i++) { - if (get(i) == p_val) { - ret = i; - break; - } - } - - return ret; -} - -template -typename CowData::Size CowData::rfind(const T &p_val, Size p_from) const { - const Size s = size(); - - if (p_from < 0) { - p_from = s + p_from; - } - if (p_from < 0 || p_from >= s) { - p_from = s - 1; - } - - for (Size i = p_from; i >= 0; i--) { - if (get(i) == p_val) { - return i; - } - } - return -1; -} - -template -typename CowData::Size CowData::count(const T &p_val) const { - Size amount = 0; - for (Size i = 0; i < size(); i++) { - if (get(i) == p_val) { - amount++; - } - } - return amount; -} - template void CowData::_ref(const CowData *p_from) { _ref(*p_from); diff --git a/core/templates/span.h b/core/templates/span.h index c8f85913473..4995279c073 100644 --- a/core/templates/span.h +++ b/core/templates/span.h @@ -62,4 +62,54 @@ public: _FORCE_INLINE_ constexpr const T *begin() const { return _ptr; } _FORCE_INLINE_ constexpr const T *end() const { return _ptr + _len; } + + // Algorithms. + constexpr int64_t find(const T &p_val, int64_t p_from = 0) const; + constexpr int64_t rfind(const T &p_val, int64_t p_from = 0) const; + constexpr uint64_t count(const T &p_val) const; }; + +template +constexpr int64_t Span::find(const T &p_val, int64_t p_from) const { + if (p_from < 0 || size() == 0) { + return -1; + } + + for (uint64_t i = p_from; i < size(); i++) { + if (ptr()[i] == p_val) { + return i; + } + } + + return -1; +} + +template +constexpr int64_t Span::rfind(const T &p_val, int64_t p_from) const { + const int64_t s = size(); + + if (p_from < 0) { + p_from = s + p_from; + } + if (p_from < 0 || p_from >= s) { + p_from = s - 1; + } + + for (int64_t i = p_from; i >= 0; i--) { + if (ptr()[i] == p_val) { + return i; + } + } + return -1; +} + +template +constexpr uint64_t Span::count(const T &p_val) const { + uint64_t amount = 0; + for (uint64_t i = 0; i < size(); i++) { + if (ptr()[i] == p_val) { + amount++; + } + } + return amount; +} diff --git a/core/templates/vector.h b/core/templates/vector.h index 569f0c5c2c6..01b7d002255 100644 --- a/core/templates/vector.h +++ b/core/templates/vector.h @@ -105,9 +105,9 @@ public: _FORCE_INLINE_ const T &operator[](Size p_index) const { return _cowdata.get(p_index); } // Must take a copy instead of a reference (see GH-31736). Error insert(Size p_pos, T p_val) { return _cowdata.insert(p_pos, p_val); } - Size find(const T &p_val, Size p_from = 0) const { return _cowdata.find(p_val, p_from); } - Size rfind(const T &p_val, Size p_from = -1) const { return _cowdata.rfind(p_val, p_from); } - Size count(const T &p_val) const { return _cowdata.count(p_val); } + Size find(const T &p_val, Size p_from = 0) const { return span().find(p_val, p_from); } + Size rfind(const T &p_val, Size p_from = -1) const { return span().rfind(p_val, p_from); } + Size count(const T &p_val) const { return span().count(p_val); } // Must take a copy instead of a reference (see GH-31736). void append_array(Vector p_other);