This is SortedArray.m in view mode; [Download] [Up]
/* Implementation for Objective-C SortedArray object
Copyright (C) 1993 R. Andrew McCallum <mccallum@cs.rochester.edu>
Dept. of Computer Science, U. of Rochester, Rochester, NY 14627
This file is part of the GNU Objective-C Collection library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <coll/SortedArray.h>
#include <coll/ArrayPrivate.h>
#include <objc/objc-api.h>
@implementation SortedArray
// INITIALIZING;
/* This is the designated initializer of this class */
- initDescription: (const char *)type
comparisonFunc: (int(*)(elt,elt))aFunc
capacity: (unsigned)aCapacity
{
[super initDescription:type capacity:aCapacity];
_comparator = aFunc;
return self;
}
- initDescription: (const char *)type
comparisonFunc: (int(*)(elt,elt))aFunc
{
return [self initDescription:type comparisonFunc:aFunc
capacity:[[self class] defaultCapacity]];
}
- initComparisonFunc: (int(*)(elt,elt))aFunc
{
return [self initDescription:"@" comparisonFunc:aFunc];
}
/* Catch all Array init's without a comparator */
- initDescription: (const char *)type capacity: (unsigned)aCapacity
{
/* Perhaps I should put in default comparitors */
return [self error:
"instead of %s, use initializer that specifies comparator",
sel_get_name(_cmd)];
}
/* I should use Array's sortAddElement: */
- addElement: (elt)newElement
{
int i = 0;
int (*comparisonFunc)(elt e1, elt e2);
int comparatorForSel(id o1, id o2)
{
return (int)[o1 perform:_comparator with:o2];
}
if (sel_is_mapped(_comparator))
comparisonFunc = (int(*)(elt,elt))comparatorForSel;
else
comparisonFunc = _comparator;
for (i = 0;
i < _count && comparisonFunc(newElement,_contents_array[i]) > 0;
i++)
;
[self insertElement:newElement atIndex:i];
return self;
}
// TESTING;
- (BOOL) comparatorIsFunc
{
return ! sel_is_mapped(_comparator);
}
- (int(*)(elt,elt)) comparisonFunc
{
if ([self comparatorIsFunc])
return _comparator;
else
return 0;
}
// SMALLTALK BLOCKS AS SELECTORS;
- initComparisonSel: (SEL)aCompareSel
{
return [self initComparisonFunc:aCompareSel];
}
- (SEL) comparisonSel
{
if ([self comparatorIsSel])
return (SEL)_comparator;
else
return 0;
}
- setComparisonFunc: (int(*)(elt,elt))aFunc
{
_comparator = aFunc;
return self;
}
- setComparisonSel: (SEL)aCompareSel
{
if (sel_is_mapped(aCompareSel))
_comparator = (int(*)(elt,elt))aCompareSel;
else
[self warning:"in %s, argument is not a selector", sel_get_name(_cmd)];
return self;
}
- (BOOL) comparatorIsSel
{
if (sel_is_mapped(_comparator))
return YES;
else
return NO;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.