Add 'is_subsequence_of' function to String
This commit is contained in:
parent
e8209b9c5c
commit
a6c37d2b5d
3 changed files with 51 additions and 0 deletions
|
@ -2752,6 +2752,50 @@ bool String::begins_with(const char* p_string) const {
|
|||
|
||||
}
|
||||
|
||||
bool String::is_subsequence_of(const String& p_string) const {
|
||||
|
||||
return _base_is_subsequence_of(p_string, false);
|
||||
}
|
||||
|
||||
bool String::is_subsequence_ofi(const String& p_string) const {
|
||||
|
||||
return _base_is_subsequence_of(p_string, true);
|
||||
}
|
||||
|
||||
bool String::_base_is_subsequence_of(const String& p_string, bool case_insensitive) const {
|
||||
|
||||
int len=length();
|
||||
if (len == 0) {
|
||||
// Technically an empty string is subsequence of any string
|
||||
return true;
|
||||
}
|
||||
|
||||
if (len > p_string.length()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const CharType *src = &operator[](0);
|
||||
const CharType *tgt = &p_string[0];
|
||||
|
||||
for (;*src && *tgt;tgt++) {
|
||||
bool match = false;
|
||||
if (case_insensitive) {
|
||||
CharType srcc = _find_lower(*src);
|
||||
CharType tgtc = _find_lower(*tgt);
|
||||
match = srcc == tgtc;
|
||||
} else {
|
||||
match = *src == *tgt;
|
||||
}
|
||||
if (match) {
|
||||
src++;
|
||||
if(!*src) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool _wildcard_match(const CharType* p_pattern, const CharType* p_string,bool p_case_sensitive) {
|
||||
switch (*p_pattern) {
|
||||
|
|
|
@ -66,6 +66,7 @@ class String : public Vector<CharType> {
|
|||
void copy_from(const char *p_cstr);
|
||||
void copy_from(const CharType* p_cstr, int p_clip_to=-1);
|
||||
void copy_from(const CharType& p_char);
|
||||
bool _base_is_subsequence_of(const String& p_string, bool case_insensitive) const;
|
||||
|
||||
|
||||
public:
|
||||
|
@ -122,6 +123,8 @@ public:
|
|||
bool begins_with(const String& p_string) const;
|
||||
bool begins_with(const char* p_string) const;
|
||||
bool ends_with(const String& p_string) const;
|
||||
bool is_subsequence_of(const String& p_string) const;
|
||||
bool is_subsequence_ofi(const String& p_string) const;
|
||||
String replace_first(String p_key,String p_with) const;
|
||||
String replace(String p_key,String p_with) const;
|
||||
String replacen(String p_key,String p_with) const;
|
||||
|
|
|
@ -247,6 +247,8 @@ static void _call_##m_type##_##m_method(Variant& r_ret,Variant& p_self,const Var
|
|||
VCALL_LOCALMEM1R(String,matchn);
|
||||
VCALL_LOCALMEM1R(String,begins_with);
|
||||
VCALL_LOCALMEM1R(String,ends_with);
|
||||
VCALL_LOCALMEM1R(String,is_subsequence_of);
|
||||
VCALL_LOCALMEM1R(String,is_subsequence_ofi);
|
||||
VCALL_LOCALMEM2R(String,replace);
|
||||
VCALL_LOCALMEM2R(String,replacen);
|
||||
VCALL_LOCALMEM2R(String,insert);
|
||||
|
@ -1269,6 +1271,8 @@ _VariantCall::addfunc(Variant::m_vtype,Variant::m_ret,_SCS(#m_method),VCALL(m_cl
|
|||
ADDFUNC1(STRING,BOOL,String,matchn,STRING,"expr",varray());
|
||||
ADDFUNC1(STRING,BOOL,String,begins_with,STRING,"text",varray());
|
||||
ADDFUNC1(STRING,BOOL,String,ends_with,STRING,"text",varray());
|
||||
ADDFUNC1(STRING,BOOL,String,is_subsequence_of,STRING,"text",varray());
|
||||
ADDFUNC1(STRING,BOOL,String,is_subsequence_ofi,STRING,"text",varray());
|
||||
|
||||
ADDFUNC2(STRING,STRING,String,replace,STRING,"what",STRING,"forwhat",varray());
|
||||
ADDFUNC2(STRING,STRING,String,replacen,STRING,"what",STRING,"forwhat",varray());
|
||||
|
|
Loading…
Reference in a new issue