Merge pull request #104286 from Ivorforce/localvector-find

Harmonize `String`, `Vector` and `LocalVector` `find` and `rfind`.
This commit is contained in:
Rémi Verschelde
2025-03-19 12:27:27 +01:00
4 changed files with 42 additions and 26 deletions

View File

@ -3347,6 +3347,12 @@ int String::find(const char *p_str, int p_from) const {
} }
int String::find_char(char32_t p_char, int p_from) const { int String::find_char(char32_t p_char, int p_from) const {
if (p_from < 0) {
p_from = length() + p_from;
}
if (p_from < 0 || p_from >= length()) {
return -1;
}
return span().find(p_char, p_from); return span().find(p_char, p_from);
} }
@ -3584,6 +3590,12 @@ int String::rfind(const char *p_str, int p_from) const {
} }
int String::rfind_char(char32_t p_char, int p_from) const { int String::rfind_char(char32_t p_char, int p_from) const {
if (p_from < 0) {
p_from = length() + p_from;
}
if (p_from < 0 || p_from >= length()) {
return -1;
}
return span().rfind(p_char, p_from); return span().rfind(p_char, p_from);
} }

View File

@ -251,14 +251,15 @@ public:
} }
} }
int64_t find(const T &p_val, U p_from = 0) const { int64_t find(const T &p_val, int64_t p_from = 0) const {
for (U i = p_from; i < count; i++) { if (p_from < 0) {
if (data[i] == p_val) { p_from = size() + p_from;
return int64_t(i);
}
} }
if (p_from < 0 || p_from >= size()) {
return -1; return -1;
} }
return span().find(p_val, p_from);
}
bool has(const T &p_val) const { bool has(const T &p_val) const {
return find(p_val) != -1; return find(p_val) != -1;

View File

@ -64,37 +64,24 @@ public:
_FORCE_INLINE_ constexpr const T *end() const { return _ptr + _len; } _FORCE_INLINE_ constexpr const T *end() const { return _ptr + _len; }
// Algorithms. // Algorithms.
constexpr int64_t find(const T &p_val, int64_t p_from = 0) const; constexpr int64_t find(const T &p_val, uint64_t p_from = 0) const;
constexpr int64_t rfind(const T &p_val, int64_t p_from = 0) const; constexpr int64_t rfind(const T &p_val, uint64_t p_from) const;
_FORCE_INLINE_ constexpr int64_t rfind(const T &p_val) const { return rfind(p_val, size() - 1); }
constexpr uint64_t count(const T &p_val) const; constexpr uint64_t count(const T &p_val) const;
}; };
template <typename T> template <typename T>
constexpr int64_t Span<T>::find(const T &p_val, int64_t p_from) const { constexpr int64_t Span<T>::find(const T &p_val, uint64_t p_from) const {
if (p_from < 0 || size() == 0) {
return -1;
}
for (uint64_t i = p_from; i < size(); i++) { for (uint64_t i = p_from; i < size(); i++) {
if (ptr()[i] == p_val) { if (ptr()[i] == p_val) {
return i; return i;
} }
} }
return -1; return -1;
} }
template <typename T> template <typename T>
constexpr int64_t Span<T>::rfind(const T &p_val, int64_t p_from) const { constexpr int64_t Span<T>::rfind(const T &p_val, uint64_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--) { for (int64_t i = p_from; i >= 0; i--) {
if (ptr()[i] == p_val) { if (ptr()[i] == p_val) {
return i; return i;

View File

@ -105,8 +105,24 @@ public:
_FORCE_INLINE_ const T &operator[](Size p_index) const { return _cowdata.get(p_index); } _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). // 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); } 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 span().find(p_val, p_from); } Size find(const T &p_val, Size p_from = 0) const {
Size rfind(const T &p_val, Size p_from = -1) const { return span().rfind(p_val, p_from); } if (p_from < 0) {
p_from = size() + p_from;
}
if (p_from < 0 || p_from >= size()) {
return -1;
}
return span().find(p_val, p_from);
}
Size rfind(const T &p_val, Size p_from = -1) const {
if (p_from < 0) {
p_from = size() + p_from;
}
if (p_from < 0 || p_from >= size()) {
return -1;
}
return span().rfind(p_val, p_from);
}
Size count(const T &p_val) const { return span().count(p_val); } Size count(const T &p_val) const { return span().count(p_val); }
// Must take a copy instead of a reference (see GH-31736). // Must take a copy instead of a reference (see GH-31736).