diff --git a/Source/NSCountedSet.m b/Source/NSCountedSet.m new file mode 100644 index 000000000..5281e76db --- /dev/null +++ b/Source/NSCountedSet.m @@ -0,0 +1,125 @@ +/* NSCountedSet - CountedSet object + Copyright (C) 1995 Free Software Foundation, Inc. + + Written by: R. Andrew McCallum + Created: Sep 1995 + + This file is part of the GNU Objective C Class 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 +#include +#include +#include +#include +#include + +@implementation NSCountedSet + +static Class NSCountedSet_concrete_class; + ++ (void) _CountedSetConcreteClass: (Class)c +{ + NSCountedSet_concrete_class = c; +} + ++ (Class) _concreteClass +{ + return NSCountedSet_concrete_class; +} + ++ (void) initialize +{ + NSCountedSet_concrete_class = [NSGCountedSet class]; +} + ++ allocWithZone: (NSZone*)z +{ + return NSAllocateObject([self _concreteClass], 0, z); +} + + +/* This is the designated initializer */ +/* Also, override superclass's designated initializer */ +- initWithCapacity: (unsigned)numItems +{ + return [self subclassResponsibility:_cmd]; +} + +- initWithArray: (NSArray*)array +{ + int i, c = [array count]; + [self initWithCapacity:c]; + for (i = 0; i < c; i++) + [self addObject:[array objectAtIndex:i]]; + return self; +} + +- initWithSet: (NSSet*)other +{ + id o, e = [other objectEnumerator]; + + [self initWithCapacity:[other count]]; + while ((o = [e nextObject])) + [self addObject:o]; + return self; +} + +- (NSEnumerator*) objectEnumerator +{ + return [self subclassResponsibility:_cmd]; +} + +- (void) addObject: anObject +{ + [self subclassResponsibility:_cmd]; +} + +- (void) removeObject: anObject +{ + [self subclassResponsibility:_cmd]; +} + +- (unsigned int) countForObject: anObject +{ + [self subclassResponsibility:_cmd]; +} + +- copyWithZone: (NSZone*)z +{ + id o, e = [self objectEnumerator]; + id c = [[[[self class] _concreteClass] alloc] + initWithCapacity:[self count]]; + while ((o = [e nextObject])) + [(NSCountedSet*)c addObject:o]; + /* Cast to avoid type warning. + I'll fix the type in objects/Collecting.h eventually. */ + return o; +} + +- initWithCoder: aCoder +{ + [self notImplemented:_cmd]; + return self; +} + +- (void) encodeWithCoder: aCoder +{ + [self notImplemented:_cmd]; +} + +@end diff --git a/Source/NSGCountedSet.m b/Source/NSGCountedSet.m new file mode 100644 index 000000000..ed644e423 --- /dev/null +++ b/Source/NSGCountedSet.m @@ -0,0 +1,111 @@ +/* Concrete implementation of NSCountedSet based on GNU Bag class + Copyright (C) 1995 Free Software Foundation, Inc. + + Written by: R. Andrew McCallum + Created: Sep 1995 + + This file is part of the GNU Objective C Class 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 +#include +#include +#include +#include +#include +#include + +@interface NSGCountedSetEnumerator : NSEnumerator +{ + NSCountedSet *bag; + void *enum_state; +} +@end + +@implementation NSGCountedSetEnumerator + +- initWithCountedSet: (NSCountedSet*)d +{ + [super init]; + bag = d; + [bag retain]; + enum_state = 0; + return self; +} + +- nextObject +{ + elt e; + if ([bag getNextElement:&e withEnumState:&enum_state]) + return e.id_u; + else + return nil; +} + +- (void) dealloc +{ + [bag release]; + [super dealloc]; +} + +@end + + +@implementation NSGCountedSet + ++ (void) initialize +{ + static int done = 0; + + /* xxx This class not yet ready for action. */ + [self notImplemented:_cmd]; + + if (!done) + { + done = 1; + class_add_behavior([NSGCountedSet class], [Bag class]); + } +} + +- initWithCapacity: (unsigned)numItems +{ + return [self initWithType:@encode(id) + capacity:numItems]; +} + +- (NSEnumerator*) objectEnumerator +{ + return [[[NSGCountedSetEnumerator alloc] initWithCountedSet:self] + autorelease]; +} + +- (void) addObject: anObject +{ + [self addElement:anObject]; +} + +- (void) removeObject: anObject +{ + [self removeElement:anObject]; +} + +- (unsigned int) countForObject: anObject +{ + return [self occurrencesOfElement:anObject]; +} + +@end