Tracker: Remove [I]Find* functions from TrackerString.
"git blame" indicates they've been here since Tracker was imported into the tree, and a single paragraph explaining their existence just states they are more efficient/faster than the ones in BString due to running simple checks before calling str*cmp. If there is (still) such a performance problem in our BString, we should fix it there and not use hacky workarounds. I didn't notice any difference in speed when using Tracker with this patch; however, I'm on a reasonably fast machine.
This commit is contained in:
@@ -163,275 +163,6 @@ TrackerString::Contains(const char* string, bool caseSensitivity) const
|
||||
}
|
||||
|
||||
|
||||
// About the ?Find* functions:
|
||||
// The leading star here has been compliance with BString,
|
||||
// simplicity and performance. Therefore unncessary copying
|
||||
// has been avoided, as unncessary function calls.
|
||||
// The copying has been avoided by implementing the
|
||||
// ?Find*(const char*) functions rather than
|
||||
// the ?Find*(TrackerString &) functions.
|
||||
// The function calls has been avoided by
|
||||
// inserting a check on the first character
|
||||
// before calling the str*cmp functions.
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::FindFirst(const BString &string) const
|
||||
{
|
||||
return FindFirst(string.String(), 0);
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::FindFirst(const char* string) const
|
||||
{
|
||||
return FindFirst(string, 0);
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::FindFirst(const BString &string, int32 fromOffset) const
|
||||
{
|
||||
return FindFirst(string.String(), fromOffset);
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::FindFirst(const char* string, int32 fromOffset) const
|
||||
{
|
||||
if (string == NULL)
|
||||
return -1;
|
||||
|
||||
int32 length = Length();
|
||||
uint32 stringLength = strlen(string);
|
||||
|
||||
// The following two checks are required to be compatible
|
||||
// with BString:
|
||||
if (length <= 0)
|
||||
return -1;
|
||||
|
||||
if (stringLength == 0)
|
||||
return fromOffset;
|
||||
|
||||
int32 stop = length - static_cast<int32>(stringLength);
|
||||
int32 start = MAX(0, MIN(fromOffset, stop));
|
||||
int32 position = -1;
|
||||
|
||||
for (int32 i = start; i <= stop; i++) {
|
||||
if (string[0] == ByteAt(i)) {
|
||||
// This check is to avoid mute str*cmp() calls. Performance.
|
||||
if (strncmp(string, String() + i, stringLength) == 0) {
|
||||
position = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return position;
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::FindFirst(char ch) const
|
||||
{
|
||||
char string[2] = {ch, '\0'};
|
||||
return FindFirst(string, 0);
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::FindFirst(char ch, int32 fromOffset) const
|
||||
{
|
||||
char string[2] = {ch, '\0'};
|
||||
return FindFirst(string, fromOffset);
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::FindLast(const BString &string) const
|
||||
{
|
||||
return FindLast(string.String(), Length() - 1);
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::FindLast(const char* string) const
|
||||
{
|
||||
return FindLast(string, Length() - 1);
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::FindLast(const BString &string, int32 beforeOffset) const
|
||||
{
|
||||
return FindLast(string.String(), beforeOffset);
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::FindLast(const char* string, int32 beforeOffset) const
|
||||
{
|
||||
if (string == NULL)
|
||||
return -1;
|
||||
|
||||
int32 length = Length();
|
||||
uint32 stringLength = strlen(string);
|
||||
|
||||
// The following two checks are required to be compatible
|
||||
// with BString:
|
||||
if (length <= 0)
|
||||
return -1;
|
||||
|
||||
if (stringLength == 0)
|
||||
return beforeOffset;
|
||||
|
||||
int32 start = MIN(beforeOffset,
|
||||
length - static_cast<int32>(stringLength));
|
||||
int32 stop = 0;
|
||||
int32 position = -1;
|
||||
|
||||
for (int32 i = start; i >= stop; i--) {
|
||||
if (string[0] == ByteAt(i)) {
|
||||
// This check is to avoid mute str*cmp() calls. Performance.
|
||||
if (strncmp(string, String() + i, stringLength) == 0) {
|
||||
position = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return position;
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::FindLast(char ch) const
|
||||
{
|
||||
char string[2] = {ch, '\0'};
|
||||
return FindLast(string, Length() - 1);
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::FindLast(char ch, int32 beforeOffset) const
|
||||
{
|
||||
char string[2] = {ch, '\0'};
|
||||
return FindLast(string, beforeOffset);
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::IFindFirst(const BString &string) const
|
||||
{
|
||||
return IFindFirst(string.String(), 0);
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::IFindFirst(const char* string) const
|
||||
{
|
||||
return IFindFirst(string, 0);
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::IFindFirst(const BString &string, int32 fromOffset) const
|
||||
{
|
||||
return IFindFirst(string.String(), fromOffset);
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::IFindFirst(const char* string, int32 fromOffset) const
|
||||
{
|
||||
if (string == NULL)
|
||||
return -1;
|
||||
|
||||
int32 length = Length();
|
||||
uint32 stringLength = strlen(string);
|
||||
|
||||
// The following two checks are required to be compatible
|
||||
// with BString:
|
||||
if (length <= 0)
|
||||
return -1;
|
||||
|
||||
if (stringLength == 0)
|
||||
return fromOffset;
|
||||
|
||||
int32 stop = length - static_cast<int32>(stringLength);
|
||||
int32 start = MAX(0, MIN(fromOffset, stop));
|
||||
int32 position = -1;
|
||||
|
||||
for (int32 i = start; i <= stop; i++) {
|
||||
if (tolower(string[0]) == tolower(ByteAt(i))) {
|
||||
// This check is to avoid mute str*cmp() calls. Performance.
|
||||
if (strncasecmp(string, String() + i, stringLength) == 0) {
|
||||
position = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return position;
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::IFindLast(const BString &string) const
|
||||
{
|
||||
return IFindLast(string.String(), Length() - 1);
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::IFindLast(const char* string) const
|
||||
{
|
||||
return IFindLast(string, Length() - 1);
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::IFindLast(const BString &string, int32 beforeOffset) const
|
||||
{
|
||||
return IFindLast(string.String(), beforeOffset);
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
TrackerString::IFindLast(const char* string, int32 beforeOffset) const
|
||||
{
|
||||
if (string == NULL)
|
||||
return -1;
|
||||
|
||||
int32 length = Length();
|
||||
uint32 stringLength = strlen(string);
|
||||
|
||||
// The following two checks are required to be compatible
|
||||
// with BString:
|
||||
if (length <= 0)
|
||||
return -1;
|
||||
|
||||
if (stringLength == 0)
|
||||
return beforeOffset;
|
||||
|
||||
int32 start = MIN(beforeOffset, length - static_cast<int32>(stringLength));
|
||||
int32 stop = 0;
|
||||
int32 position = -1;
|
||||
|
||||
for (int32 i = start; i >= stop; i--) {
|
||||
if (tolower(string[0]) == tolower(ByteAt(i))) {
|
||||
// This check is to avoid mute str*cmp() calls. Performance.
|
||||
if (strncasecmp(string, String() + i, stringLength) == 0) {
|
||||
position = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return position;
|
||||
}
|
||||
|
||||
|
||||
// MatchesBracketExpression() assumes 'pattern' to point to the
|
||||
// character following the initial '[' in a bracket expression.
|
||||
// The reason is that an encountered '[' will be taken literally.
|
||||
|
||||
@@ -76,30 +76,6 @@ public:
|
||||
bool StartsWith(const char*, bool caseSensitivity = false) const;
|
||||
bool Contains(const char*, bool caseSensitivity = false) const;
|
||||
|
||||
int32 FindFirst(const BString&) const;
|
||||
int32 FindFirst(const char*) const;
|
||||
int32 FindFirst(const BString&, int32 fromOffset) const;
|
||||
int32 FindFirst(const char*, int32 fromOffset) const;
|
||||
int32 FindFirst(char) const;
|
||||
int32 FindFirst(char, int32 fromOffset) const;
|
||||
|
||||
int32 FindLast(const BString&) const;
|
||||
int32 FindLast(const char*) const;
|
||||
int32 FindLast(const BString&, int32 beforeOffset) const;
|
||||
int32 FindLast(const char*, int32 beforeOffset) const;
|
||||
int32 FindLast(char) const;
|
||||
int32 FindLast(char, int32 beforeOffset) const;
|
||||
|
||||
int32 IFindFirst(const BString&) const;
|
||||
int32 IFindFirst(const char*) const;
|
||||
int32 IFindFirst(const BString&, int32 fromOffset) const;
|
||||
int32 IFindFirst(const char*, int32 fromOffset) const;
|
||||
|
||||
int32 IFindLast(const BString&) const;
|
||||
int32 IFindLast(const char*) const;
|
||||
int32 IFindLast(const BString&, int32 beforeOffset) const;
|
||||
int32 IFindLast(const char*, int32 beforeOffset) const;
|
||||
|
||||
private:
|
||||
bool IsGlyph(char) const;
|
||||
bool IsInsideGlyph(char) const;
|
||||
|
||||
Reference in New Issue
Block a user