mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-30 08:21:25 +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
|
+ (id)sortDescriptorWithKey: (NSString *)key
|
||||||
ascending: (BOOL)ascending
|
ascending: (BOOL)ascending
|
||||||
comparator: (NSComparator)cmptr;
|
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
|
#endif
|
||||||
|
|
||||||
/** Initialises the receiver for comparisons using the 'compare:' selector
|
/** Initialises the receiver for comparisons using the 'compare:' selector
|
||||||
|
@ -113,12 +121,13 @@ extern "C" {
|
||||||
|
|
||||||
/** <init />
|
/** <init />
|
||||||
* Initialises the receiver to perform comparisons in the specified order
|
* 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
|
- (id) initWithKey: (NSString *)key
|
||||||
ascending: (BOOL)ascending
|
ascending: (BOOL)ascending
|
||||||
selector: (SEL)selector;
|
selector: (SEL)selector;
|
||||||
|
|
||||||
|
|
||||||
/** Returns the key used to obtain the property on which comparisons are based.
|
/** Returns the key used to obtain the property on which comparisons are based.
|
||||||
*/
|
*/
|
||||||
- (NSString *) key;
|
- (NSString *) key;
|
||||||
|
|
|
@ -113,8 +113,16 @@ static BOOL initialized = NO;
|
||||||
id comparedKey1 = [object1 valueForKeyPath: _key];
|
id comparedKey1 = [object1 valueForKeyPath: _key];
|
||||||
id comparedKey2 = [object2 valueForKeyPath: _key];
|
id comparedKey2 = [object2 valueForKeyPath: _key];
|
||||||
|
|
||||||
result = (NSComparisonResult) [comparedKey1 performSelector: _selector
|
if(_comparator != NULL)
|
||||||
withObject: comparedKey2];
|
{
|
||||||
|
result = CALL_BLOCK(((NSComparator)_comparator), comparedKey1, comparedKey2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = (NSComparisonResult) [comparedKey1 performSelector: _selector
|
||||||
|
withObject: comparedKey2];
|
||||||
|
}
|
||||||
|
|
||||||
if (_ascending == NO)
|
if (_ascending == NO)
|
||||||
{
|
{
|
||||||
if (result == NSOrderedAscending)
|
if (result == NSOrderedAscending)
|
||||||
|
@ -132,12 +140,23 @@ static BOOL initialized = NO;
|
||||||
|
|
||||||
- (id) copyWithZone: (NSZone*)zone
|
- (id) copyWithZone: (NSZone*)zone
|
||||||
{
|
{
|
||||||
|
NSSortDescriptor *copy = nil;
|
||||||
if (NSShouldRetainWithZone(self, zone))
|
if (NSShouldRetainWithZone(self, zone))
|
||||||
{
|
{
|
||||||
return RETAIN(self);
|
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
|
- (void) dealloc
|
||||||
|
@ -171,7 +190,10 @@ static BOOL initialized = NO;
|
||||||
ascending: (BOOL)ascending
|
ascending: (BOOL)ascending
|
||||||
comparator: (NSComparator)cmptr
|
comparator: (NSComparator)cmptr
|
||||||
{
|
{
|
||||||
return nil;
|
return AUTORELEASE([[self alloc] initWithKey: key
|
||||||
|
ascending: ascending
|
||||||
|
comparator: cmptr]);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (id) initWithKey: (NSString *) key ascending: (BOOL) ascending
|
- (id) initWithKey: (NSString *) key ascending: (BOOL) ascending
|
||||||
|
@ -179,6 +201,37 @@ static BOOL initialized = NO;
|
||||||
return [self initWithKey: key ascending: ascending selector: NULL];
|
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
|
- (id) initWithKey: (NSString *) key
|
||||||
ascending: (BOOL) ascending
|
ascending: (BOOL) ascending
|
||||||
selector: (SEL) selector
|
selector: (SEL) selector
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue