Merge pull request #104286 from Ivorforce/localvector-find
Harmonize `String`, `Vector` and `LocalVector` `find` and `rfind`.
This commit is contained in:
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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).
|
||||||
|
|||||||
Reference in New Issue
Block a user