mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-10 16:20:42 +00:00
Another tiny string optimisation
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@38525 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
6297efeec9
commit
19ba70e988
2 changed files with 58 additions and 3 deletions
|
@ -749,6 +749,38 @@ static BOOL useTinyStrings;
|
|||
#define TINY_STRING_CHAR(s, x) ((s & (0xFE00000000000000 >> (x*7))) >> (57-(x*7)))
|
||||
#define TINY_STRING_LENGTH_MASK 0x1f
|
||||
#define TINY_STRING_LENGTH_SHIFT OBJC_SMALL_OBJECT_SHIFT
|
||||
|
||||
static BOOL
|
||||
tinyEqualToString(uintptr_t s, NSString *aString)
|
||||
{
|
||||
NSUInteger l;
|
||||
|
||||
if ((NSString*)s == aString)
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
l = (s >> TINY_STRING_LENGTH_SHIFT) & TINY_STRING_LENGTH_MASK;
|
||||
if ([aString length] != l)
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
else if (l > 0)
|
||||
{
|
||||
unichar buf[8];
|
||||
|
||||
[aString getCharacters: buf range: NSMakeRange(0, l)];
|
||||
while (l-- > 0)
|
||||
{
|
||||
if ((unichar)TINY_STRING_CHAR(s, l) != buf[l])
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
}
|
||||
return YES;
|
||||
}
|
||||
|
||||
@interface GSTinyString : NSString
|
||||
@end
|
||||
|
||||
|
@ -950,6 +982,11 @@ tsbytes(uintptr_t s, char *buf)
|
|||
#endif
|
||||
}
|
||||
|
||||
- (BOOL) isEqualToString: (NSString*)aString
|
||||
{
|
||||
return tinyEqualToString((uintptr_t)self, aString);
|
||||
}
|
||||
|
||||
- (NSUInteger) length
|
||||
{
|
||||
uintptr_t s = (uintptr_t)self;
|
||||
|
@ -5571,6 +5608,17 @@ literalIsEqual(NXConstantString *self, id anObject)
|
|||
{
|
||||
return NO;
|
||||
}
|
||||
#if defined(OBJC_SMALL_OBJECT_SHIFT) && (OBJC_SMALL_OBJECT_SHIFT == 3)
|
||||
if (useTinyStrings)
|
||||
{
|
||||
uintptr_t s = (uintptr_t)anObject;
|
||||
|
||||
if (s & TINY_STRING_MASK)
|
||||
{
|
||||
return tinyEqualToString((uintptr_t)anObject, self);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (GSObjCIsInstance(anObject) == NO)
|
||||
{
|
||||
return NO;
|
||||
|
|
|
@ -2685,12 +2685,19 @@ static BOOL (*nbImp)(id, SEL, unichar) = 0;
|
|||
*/
|
||||
- (BOOL) isEqualToString: (NSString*)aString
|
||||
{
|
||||
if (aString == self)
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
if ([self hash] != [aString hash])
|
||||
return NO;
|
||||
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
if (strCompNsNs(self, aString, 0, (NSRange){0, [self length]})
|
||||
== NSOrderedSame)
|
||||
return YES;
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue