mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-29 16:01:38 +00:00
Use comparator in sorting
This commit is contained in:
parent
adbd44470f
commit
bdc589ce79
2 changed files with 68 additions and 6 deletions
|
@ -103,6 +103,14 @@ extern "C" {
|
|||
+ (id)sortDescriptorWithKey: (NSString *)key
|
||||
ascending: (BOOL)ascending
|
||||
comparator: (NSComparator)cmptr;
|
||||
|
||||
/** <init />
|
||||
* Initialises the receiver to perform comparisons in the specified order
|
||||
* using the comparator to compare the property key of each object.
|
||||
*/
|
||||
- (id) initWithKey: (NSString *)key
|
||||
ascending: (BOOL)ascending
|
||||
comparator: (NSComparator)cmptr;
|
||||
#endif
|
||||
|
||||
/** Initialises the receiver for comparisons using the 'compare:' selector
|
||||
|
@ -113,12 +121,13 @@ extern "C" {
|
|||
|
||||
/** <init />
|
||||
* Initialises the receiver to perform comparisons in the specified order
|
||||
* using selector to compar the property key of each object.
|
||||
* using selector to compare the property key of each object.
|
||||
*/
|
||||
- (id) initWithKey: (NSString *)key
|
||||
ascending: (BOOL)ascending
|
||||
selector: (SEL)selector;
|
||||
|
||||
|
||||
/** Returns the key used to obtain the property on which comparisons are based.
|
||||
*/
|
||||
- (NSString *) key;
|
||||
|
|
|
@ -113,8 +113,16 @@ static BOOL initialized = NO;
|
|||
id comparedKey1 = [object1 valueForKeyPath: _key];
|
||||
id comparedKey2 = [object2 valueForKeyPath: _key];
|
||||
|
||||
result = (NSComparisonResult) [comparedKey1 performSelector: _selector
|
||||
withObject: comparedKey2];
|
||||
if(_comparator != NULL)
|
||||
{
|
||||
result = CALL_BLOCK(((NSComparator)_comparator), comparedKey1, comparedKey2);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = (NSComparisonResult) [comparedKey1 performSelector: _selector
|
||||
withObject: comparedKey2];
|
||||
}
|
||||
|
||||
if (_ascending == NO)
|
||||
{
|
||||
if (result == NSOrderedAscending)
|
||||
|
@ -132,12 +140,23 @@ static BOOL initialized = NO;
|
|||
|
||||
- (id) copyWithZone: (NSZone*)zone
|
||||
{
|
||||
NSSortDescriptor *copy = nil;
|
||||
if (NSShouldRetainWithZone(self, zone))
|
||||
{
|
||||
return RETAIN(self);
|
||||
}
|
||||
return [[NSSortDescriptor allocWithZone: zone]
|
||||
initWithKey: _key ascending: _ascending selector: _selector];
|
||||
|
||||
if(_comparator == NULL)
|
||||
{
|
||||
copy = [[NSSortDescriptor allocWithZone: zone]
|
||||
initWithKey: _key ascending: _ascending selector: _selector];
|
||||
}
|
||||
else
|
||||
{
|
||||
copy = [[NSSortDescriptor allocWithZone: zone]
|
||||
initWithKey: _key ascending: _ascending comparator: _comparator];
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
|
@ -171,7 +190,10 @@ static BOOL initialized = NO;
|
|||
ascending: (BOOL)ascending
|
||||
comparator: (NSComparator)cmptr
|
||||
{
|
||||
return nil;
|
||||
return AUTORELEASE([[self alloc] initWithKey: key
|
||||
ascending: ascending
|
||||
comparator: cmptr]);
|
||||
|
||||
}
|
||||
|
||||
- (id) initWithKey: (NSString *) key ascending: (BOOL) ascending
|
||||
|
@ -179,6 +201,37 @@ static BOOL initialized = NO;
|
|||
return [self initWithKey: key ascending: ascending selector: NULL];
|
||||
}
|
||||
|
||||
- (id) initWithKey: (NSString *) key
|
||||
ascending: (BOOL) ascending
|
||||
comparator: (NSComparator) cmptr
|
||||
{
|
||||
if ([self init])
|
||||
{
|
||||
if (key == nil)
|
||||
{
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"%@", _(@"Passed nil key when initializing "
|
||||
@"an NSSortDescriptor.")];
|
||||
}
|
||||
if (cmptr == NULL)
|
||||
{
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"%@", _(@"Passed NULL comparator when initializing "
|
||||
@"an NSSortDescriptor.")];
|
||||
}
|
||||
|
||||
ASSIGN(_key, key);
|
||||
_ascending = ascending;
|
||||
_comparator = cmptr;
|
||||
|
||||
return self;
|
||||
}
|
||||
else
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
|
||||
- (id) initWithKey: (NSString *) key
|
||||
ascending: (BOOL) ascending
|
||||
selector: (SEL) selector
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue