Merged changes from other author

This commit is contained in:
Gregory John Casamento 2019-06-28 01:55:33 -04:00
commit 80843a9e4b
3 changed files with 424 additions and 501 deletions

View file

@ -40,14 +40,8 @@
#import "GSDispatch.h" #import "GSDispatch.h"
#import "GSSorting.h" #import "GSSorting.h"
#define GSI_ARRAY_TYPE NSRange
#define GSI_ARRAY_NO_RELEASE 0
#define GSI_ARRAY_NO_RETAIN 0
#define GSI_ARRAY_TYPES GSUNION_OBJ #define GSI_ARRAY_TYPES GSUNION_OBJ
#define GSI_ARRAY_RELEASE(A, X) [(X).obj release]
#define GSI_ARRAY_RETAIN(A, X) [(X).obj retain]
#import "GNUstepBase/GSIArray.h" #import "GNUstepBase/GSIArray.h"
@interface GSOrderedSet : NSOrderedSet @interface GSOrderedSet : NSOrderedSet
@ -92,7 +86,7 @@
- (id) nextObject - (id) nextObject
{ {
if(current < count) if (current < count)
{ {
GSIArrayItem item = GSIArrayItemAtIndex(&set->array, current); GSIArrayItem item = GSIArrayItemAtIndex(&set->array, current);
current++; current++;
@ -113,7 +107,7 @@
- (id) initWithOrderedSet: (GSOrderedSet*)d - (id) initWithOrderedSet: (GSOrderedSet*)d
{ {
self = [super initWithOrderedSet: d]; self = [super initWithOrderedSet: d];
if(self != nil) if (self != nil)
{ {
current = GSIArrayCount(&set->array); current = GSIArrayCount(&set->array);
} }
@ -125,7 +119,9 @@
GSIArrayItem item; GSIArrayItem item;
if (current == 0) if (current == 0)
return nil; {
return nil;
}
item = GSIArrayItemAtIndex(&set->array, --current); item = GSIArrayItemAtIndex(&set->array, --current);
return (id)(item.obj); return (id)(item.obj);
@ -186,7 +182,7 @@ static Class mutableSetClass;
NSUInteger count = [self count]; NSUInteger count = [self count];
NSUInteger i = 0; NSUInteger i = 0;
for(i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
GSIArrayItem item = GSIArrayItemAtIndex(&array, i); GSIArrayItem item = GSIArrayItemAtIndex(&array, i);
size += [item.obj sizeInBytesExcluding: exclude]; size += [item.obj sizeInBytesExcluding: exclude];
@ -227,10 +223,9 @@ static Class mutableSetClass;
} }
item.obj = obj; item.obj = obj;
if(![self containsObject: obj]) if (![self containsObject: obj])
{ {
GSIArrayAddItem(&array, item); GSIArrayAddItem(&array, item);
RETAIN(obj);
} }
} }
return self; return self;
@ -248,26 +243,20 @@ static Class mutableSetClass;
} }
} }
- (void) addObject: (id)anObject
{
[self insertObject: anObject atIndex: [self count]];
}
- (void) insertObject: (id)object atIndex: (NSUInteger)index - (void) insertObject: (id)object atIndex: (NSUInteger)index
{ {
GSIArrayItem item; GSIArrayItem item;
if(object == nil) if (object == nil)
{ {
[NSException raise: NSInvalidArgumentException [NSException raise: NSInvalidArgumentException
format: @"Tried to add nil to set"]; format: @"Tried to add nil to set"];
} }
else else
{ {
if([self containsObject: object] == NO) if ([self containsObject: object] == NO)
{ {
item.obj = object; item.obj = object;
GSIArrayInsertItem(&array, item, index); GSIArrayInsertItem(&array, item, index);
RETAIN(object);
_version++; _version++;
} }
} }
@ -279,13 +268,6 @@ static Class mutableSetClass;
GSIArrayRemoveItemAtIndex(&array, index); GSIArrayRemoveItemAtIndex(&array, index);
} }
- (void) replaceObjectAtIndex: (NSUInteger)index
withObject: (id)obj
{
[self removeObjectAtIndex: index];
[self insertObject: obj atIndex: index];
}
- (id) init - (id) init
{ {
return [self initWithCapacity: 0]; return [self initWithCapacity: 0];
@ -305,9 +287,9 @@ static Class mutableSetClass;
// Init and fill set // Init and fill set
self = [self initWithCapacity: count]; self = [self initWithCapacity: count];
if(self != nil) if (self != nil)
{ {
for(i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
id anObject = objects[i]; id anObject = objects[i];
[self addObject: anObject]; [self addObject: anObject];
@ -329,4 +311,3 @@ static Class mutableSetClass;
} }
@end @end

File diff suppressed because it is too large Load diff

View file

@ -122,6 +122,7 @@ int main()
NSMutableOrderedSet *mutableTest1, *mutableTest2; NSMutableOrderedSet *mutableTest1, *mutableTest2;
NSMutableArray *testObjs = [NSMutableArray new]; NSMutableArray *testObjs = [NSMutableArray new];
NSData *data = [stringData dataUsingEncoding: NSUTF8StringEncoding]; NSData *data = [stringData dataUsingEncoding: NSUTF8StringEncoding];
NSMutableSet *testSet;
testObj = [NSOrderedSet new]; testObj = [NSOrderedSet new];
[testObjs addObject: testObj]; [testObjs addObject: testObj];
@ -145,12 +146,6 @@ int main()
PASS(testObj != nil && [testObj count] == 1, PASS(testObj != nil && [testObj count] == 1,
"cannot create an ordered set with multiple like elements"); "cannot create an ordered set with multiple like elements");
id objs2[] = {@"Hello"};
testObj = [NSOrderedSet orderedSetWithObjects: objs2 count: 2];
[testObjs addObject: testObj];
PASS(testObj != nil && [testObj count] == 1,
"Does not throw exception when count != to number of elements");
NSMutableArray *arr = [NSMutableArray array]; NSMutableArray *arr = [NSMutableArray array];
[arr addObject: @"Hello"]; [arr addObject: @"Hello"];
[arr addObject: @"World"]; [arr addObject: @"World"];
@ -182,95 +177,117 @@ int main()
id o1 = @"Hello"; id o1 = @"Hello";
id o2 = @"World"; id o2 = @"World";
mutableTest1 = [NSMutableOrderedSet orderedSet]; mutableTest1 = [NSMutableOrderedSet orderedSet];
[mutableTest1 addObject:o1]; [mutableTest1 addObject: o1];
[testObjs addObject: mutableTest1]; [testObjs addObject: mutableTest1];
mutableTest2 = [NSMutableOrderedSet orderedSet]; mutableTest2 = [NSMutableOrderedSet orderedSet];
[mutableTest2 addObject:o2]; [mutableTest2 addObject: o2];
[testObjs addObject: mutableTest2]; [testObjs addObject: mutableTest2];
[mutableTest1 unionOrderedSet:mutableTest2]; [mutableTest1 unionOrderedSet: mutableTest2];
PASS(mutableTest1 != nil && mutableTest2 != nil && [mutableTest1 count] == 2, PASS(mutableTest1 != nil && mutableTest2 != nil && [mutableTest1 count] == 2,
"mutableSets union properly"); "mutableSets union properly");
id o3 = @"Hello"; id o3 = @"Hello";
id o4 = @"World"; id o4 = @"World";
mutableTest1 = [NSMutableOrderedSet orderedSet]; mutableTest1 = [NSMutableOrderedSet orderedSet];
[mutableTest1 addObject:o3]; [mutableTest1 addObject: o3];
[testObjs addObject: mutableTest1]; [testObjs addObject: mutableTest1];
mutableTest2 = [NSMutableOrderedSet orderedSet]; mutableTest2 = [NSMutableOrderedSet orderedSet];
[mutableTest2 addObject:o4]; [mutableTest2 addObject: o4];
[testObjs addObject: mutableTest2]; [testObjs addObject: mutableTest2];
[mutableTest1 intersectOrderedSet:mutableTest2]; [mutableTest1 intersectOrderedSet: mutableTest2];
PASS(mutableTest1 != nil && mutableTest2 != nil && [mutableTest1 count] == 0, PASS(mutableTest1 != nil && mutableTest2 != nil && [mutableTest1 count] == 0,
"mutableSets do not intersect"); "mutableSets do not intersect");
id o5 = @"Hello"; id o5 = @"Hello";
id o6 = @"Hello"; id o6 = @"Hello";
mutableTest1 = [NSMutableOrderedSet orderedSet]; mutableTest1 = [NSMutableOrderedSet orderedSet];
[mutableTest1 addObject:o5]; [mutableTest1 addObject: o5];
[testObjs addObject: mutableTest1]; [testObjs addObject: mutableTest1];
mutableTest2 = [NSMutableOrderedSet orderedSet]; mutableTest2 = [NSMutableOrderedSet orderedSet];
[mutableTest2 addObject:o6]; [mutableTest2 addObject: o6];
[testObjs addObject: mutableTest2]; [testObjs addObject: mutableTest2];
[mutableTest1 intersectOrderedSet:mutableTest2]; [mutableTest1 intersectOrderedSet: mutableTest2];
PASS(mutableTest1 != nil && mutableTest2 != nil && [mutableTest1 count] == 1, PASS(mutableTest1 != nil && mutableTest2 != nil && [mutableTest1 count] == 1,
"mutableSets do intersect"); "mutableSets do intersect");
id o7 = @"Hello"; id o7 = @"Hello";
id o8 = @"World"; id o8 = @"World";
mutableTest1 = [NSMutableOrderedSet orderedSet]; mutableTest1 = [NSMutableOrderedSet orderedSet];
[mutableTest1 addObject:o7]; [mutableTest1 addObject: o7];
[mutableTest1 addObject:o8]; [mutableTest1 addObject: o8];
[testObjs addObject: mutableTest1]; [testObjs addObject: mutableTest1];
mutableTest2 = [NSMutableOrderedSet orderedSet]; mutableTest2 = [NSMutableOrderedSet orderedSet];
[mutableTest2 addObject:o7]; [mutableTest2 addObject: o7];
[testObjs addObject: mutableTest2]; [testObjs addObject: mutableTest2];
BOOL isSubset = [mutableTest2 isSubsetOfOrderedSet:mutableTest1]; BOOL isSubset = [mutableTest2 isSubsetOfOrderedSet: mutableTest1];
PASS(isSubset, PASS(isSubset,
"mutableTest2 is subset of mutableTest1"); "mutableTest2 is subset of mutableTest1");
testSet = [NSMutableSet set];
[testSet addObject: o7];
[testSet addObject: o8];
isSubset = [mutableTest2 isSubsetOfSet: testSet];
PASS(isSubset,
"mutableTest2 is subset of testSet");
id o9 = @"Hello"; id o9 = @"Hello";
id o10 = @"World"; id o10 = @"World";
id o11 = @"Ready"; id o11 = @"Ready";
mutableTest1 = [NSMutableOrderedSet orderedSet]; mutableTest1 = [NSMutableOrderedSet orderedSet];
[mutableTest1 addObject:o9]; [mutableTest1 addObject: o9];
[testObjs addObject: mutableTest1]; [testObjs addObject: mutableTest1];
mutableTest2 = [NSMutableOrderedSet orderedSet]; mutableTest2 = [NSMutableOrderedSet orderedSet];
[mutableTest2 addObject:o10]; [mutableTest2 addObject: o10];
[mutableTest2 addObject:o9]; [mutableTest2 addObject: o9];
[testObjs addObject: mutableTest2]; [testObjs addObject: mutableTest2];
isSubset = [mutableTest2 isSubsetOfOrderedSet:mutableTest1]; isSubset = [mutableTest2 isSubsetOfOrderedSet: mutableTest1];
PASS(isSubset == NO, PASS(isSubset == NO,
"mutableTest2 is not subset of mutableTest1"); "mutableTest2 is not subset of mutableTest1");
testSet = [NSMutableSet set];
[testSet addObject: o9];
isSubset = [mutableTest2 isSubsetOfSet: testSet];
PASS(isSubset == NO,
"mutableTest2 is not subset of testSet");
o9 = @"Hello"; o9 = @"Hello";
o10 = @"World"; o10 = @"World";
o11 = @"Ready"; o11 = @"Ready";
id o12 = @"ToGo"; id o12 = @"ToGo";
mutableTest1 = [NSMutableOrderedSet orderedSet]; mutableTest1 = [NSMutableOrderedSet orderedSet];
[mutableTest1 addObject:o9]; [mutableTest1 addObject: o9];
[mutableTest1 addObject:o10]; [mutableTest1 addObject: o10];
[mutableTest1 addObject:o12]; [mutableTest1 addObject: o12];
[mutableTest1 addObject:o11]; [mutableTest1 addObject: o11];
[testObjs addObject: mutableTest1]; [testObjs addObject: mutableTest1];
mutableTest2 = [NSMutableOrderedSet orderedSet]; mutableTest2 = [NSMutableOrderedSet orderedSet];
[mutableTest2 addObject:o9]; [mutableTest2 addObject: o9];
[mutableTest2 addObject:o10]; [mutableTest2 addObject: o10];
[testObjs addObject: mutableTest2]; [testObjs addObject: mutableTest2];
isSubset = [mutableTest2 isSubsetOfOrderedSet:mutableTest1]; isSubset = [mutableTest2 isSubsetOfOrderedSet: mutableTest1];
PASS(isSubset, PASS(isSubset,
"mutableTest2 is subset of mutableTest1"); "mutableTest2 is subset of mutableTest1");
testSet = [NSMutableSet set];
[testSet addObject: o9];
[testSet addObject: o10];
[testSet addObject: o12];
[testSet addObject: o11];
isSubset = [mutableTest2 isSubsetOfSet: testSet];
PASS(isSubset,
"mutableTest2 is subset of testSet");
o9 = @"Hello"; o9 = @"Hello";
o10 = @"World"; o10 = @"World";
o11 = @"Ready"; o11 = @"Ready";
o12 = @"ToGo"; o12 = @"ToGo";
mutableTest1 = [NSMutableOrderedSet orderedSet]; mutableTest1 = [NSMutableOrderedSet orderedSet];
[mutableTest1 addObject:o9]; [mutableTest1 addObject: o9];
[mutableTest1 addObject:o10]; [mutableTest1 addObject: o10];
[mutableTest1 addObject:o12]; [mutableTest1 addObject: o12];
[mutableTest1 addObject:o11]; [mutableTest1 addObject: o11];
[testObjs addObject: mutableTest1]; [testObjs addObject: mutableTest1];
PASS([mutableTest1 isEqual:mutableTest1], PASS([mutableTest1 isEqual: mutableTest1],
"mutableTest1 is equal to itself"); "mutableTest1 is equal to itself");
o9 = @"Hello"; o9 = @"Hello";
@ -278,64 +295,64 @@ int main()
o11 = @"Ready"; o11 = @"Ready";
o12 = @"ToGo"; o12 = @"ToGo";
NSMutableOrderedSet *mutableTest3 = [NSMutableOrderedSet orderedSet]; NSMutableOrderedSet *mutableTest3 = [NSMutableOrderedSet orderedSet];
[mutableTest3 addObject:o9]; [mutableTest3 addObject: o9];
[mutableTest3 addObject:o10]; [mutableTest3 addObject: o10];
[mutableTest3 addObject:o12]; [mutableTest3 addObject: o12];
[mutableTest3 addObject:o11]; [mutableTest3 addObject: o11];
[mutableTest3 insertObject:@"Hello" atIndex:2]; [mutableTest3 insertObject: @"Hello" atIndex: 2];
[testObjs addObject: mutableTest3]; [testObjs addObject: mutableTest3];
PASS([mutableTest3 isEqual:mutableTest1] == YES, PASS([mutableTest3 isEqual: mutableTest1] == YES,
"Insert at index does not replace existing object"); "Insert at index does not replace existing object");
NSMutableOrderedSet *mutableTest4 = [NSMutableOrderedSet orderedSet]; NSMutableOrderedSet *mutableTest4 = [NSMutableOrderedSet orderedSet];
[mutableTest4 addObject:@"Now"]; [mutableTest4 addObject: @"Now"];
[mutableTest4 addObject:@"is"]; [mutableTest4 addObject: @"is"];
[mutableTest4 addObject:@"the"]; [mutableTest4 addObject: @"the"];
[mutableTest4 addObject:@"time"]; [mutableTest4 addObject: @"time"];
[mutableTest4 addObject:@"for"]; [mutableTest4 addObject: @"for"];
[mutableTest4 addObject:@"all"]; [mutableTest4 addObject: @"all"];
[mutableTest4 addObject:@"Good"]; [mutableTest4 addObject: @"Good"];
[mutableTest4 addObject:@"men"]; [mutableTest4 addObject: @"men"];
[mutableTest4 addObject:@"to"]; [mutableTest4 addObject: @"to"];
[mutableTest4 addObject:@"come"]; [mutableTest4 addObject: @"come"];
[mutableTest4 addObject:@"to the aid"]; [mutableTest4 addObject: @"to the aid"];
[mutableTest4 addObject:@"of their country"]; [mutableTest4 addObject: @"of their country"];
[mutableTest4 moveObjectsAtIndexes:[NSIndexSet indexSetWithIndex:3] toIndex:10]; [mutableTest4 moveObjectsAtIndexes: [NSIndexSet indexSetWithIndex: 3] toIndex: 10];
[testObjs addObject: mutableTest4]; [testObjs addObject: mutableTest4];
PASS([[mutableTest4 objectAtIndex: 10] isEqual:@"time"] == YES, PASS([[mutableTest4 objectAtIndex: 10] isEqual: @"time"] == YES,
"Move to index moves to correct index"); "Move to index moves to correct index");
NSMutableOrderedSet *mutableTest5 = [NSMutableOrderedSet orderedSet]; NSMutableOrderedSet *mutableTest5 = [NSMutableOrderedSet orderedSet];
[mutableTest5 addObject:@"Now"]; [mutableTest5 addObject: @"Now"];
[mutableTest5 addObject:@"is"]; [mutableTest5 addObject: @"is"];
[mutableTest5 addObject:@"the"]; [mutableTest5 addObject: @"the"];
[mutableTest5 exchangeObjectAtIndex:0 withObjectAtIndex:2]; [mutableTest5 exchangeObjectAtIndex: 0 withObjectAtIndex: 2];
[testObjs addObject: mutableTest5]; [testObjs addObject: mutableTest5];
PASS([[mutableTest5 objectAtIndex: 0] isEqual:@"the"] == YES && PASS([[mutableTest5 objectAtIndex: 0] isEqual: @"the"] == YES &&
[[mutableTest5 objectAtIndex: 2] isEqual:@"Now"] == YES, [[mutableTest5 objectAtIndex: 2] isEqual: @"Now"] == YES,
"Exchanges indexes properly"); "Exchanges indexes properly");
//NSLog(@"RESULT: %@",mutableTest4); //NSLog(@"RESULT: %@",mutableTest4);
mutableTest4 = [NSMutableOrderedSet orderedSet]; mutableTest4 = [NSMutableOrderedSet orderedSet];
[mutableTest4 addObject:@"Now"]; [mutableTest4 addObject: @"Now"];
[mutableTest4 addObject:@"is"]; [mutableTest4 addObject: @"is"];
[mutableTest4 addObject:@"the"]; [mutableTest4 addObject: @"the"];
[mutableTest4 addObject:@"time"]; [mutableTest4 addObject: @"time"];
[mutableTest4 addObject:@"for"]; [mutableTest4 addObject: @"for"];
[mutableTest4 addObject:@"all"]; [mutableTest4 addObject: @"all"];
[mutableTest4 addObject:@"Good"]; [mutableTest4 addObject: @"Good"];
[mutableTest4 addObject:@"men"]; [mutableTest4 addObject: @"men"];
[mutableTest4 addObject:@"to"]; [mutableTest4 addObject: @"to"];
[mutableTest4 addObject:@"come to"]; [mutableTest4 addObject: @"come to"];
[mutableTest4 addObject:@"the aid"]; [mutableTest4 addObject: @"the aid"];
[mutableTest4 addObject:@"of their country"]; [mutableTest4 addObject: @"of their country"];
NSMutableIndexSet *is = [NSMutableIndexSet indexSetWithIndex:6]; NSMutableIndexSet *is = [NSMutableIndexSet indexSetWithIndex: 6];
[is addIndex: 9]; [is addIndex: 9];
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Horrible", @"Flee From", nil]; NSMutableArray *array = [NSMutableArray arrayWithObjects: @"Horrible", @"Flee From", nil];
[mutableTest4 replaceObjectsAtIndexes: is [mutableTest4 replaceObjectsAtIndexes: is
withObjects: array]; withObjects: array];
[testObjs addObject: mutableTest4]; [testObjs addObject: mutableTest4];
PASS([[mutableTest4 objectAtIndex: 9] isEqual:@"Flee From"] == YES, PASS([[mutableTest4 objectAtIndex: 9] isEqual: @"Flee From"] == YES,
"replaceObjectsAtIndexes: adds to correct indexes"); "replaceObjectsAtIndexes: adds to correct indexes");
id uobj = [NSKeyedUnarchiver unarchiveObjectWithData: data]; id uobj = [NSKeyedUnarchiver unarchiveObjectWithData: data];