60- (void) setPerformCleanup:(BOOL)flag;
65@interface OOShipGroup (Private)
67- (BOOL) resizeTo:(NSUInteger)newCapacity;
82 return [
self initWithName:nil];
86- (id) initWithName:(NSString *)name
88 if ((
self = [super init]))
91 _members = malloc(
sizeof *_members * _capacity);
105+ (instancetype) groupWithName:(NSString *)name
107 return [[[
self alloc] initWithName:name] autorelease];
111+ (instancetype) groupWithName:(NSString *)name leader:(
ShipEntity *)leader
123 for (i = 0; i < _count; i++)
125 [_members[i] release];
134- (NSString *) descriptionComponents
136 NSString *desc = [NSString stringWithFormat:@"%llu ships", (unsigned long long)_count];
137 if ([
self name] !=
nil)
139 desc = [NSString stringWithFormat:@"\"%@\", %@", [
self name], desc];
141 if ([
self leader] !=
nil)
143 desc = [NSString stringWithFormat:@"%@, leader: %@", desc, [[
self leader] shortDescription]];
155- (void) setName:(NSString *)name
162 _name = [name retain];
169 ShipEntity *result = [_leader weakRefUnderlyingObject];
172 if (result ==
nil && _leader !=
nil)
186 if (leader != [
self leader])
189 [
self addShip:leader];
195- (NSEnumerator *) objectEnumerator
201- (NSEnumerator *) mutationSafeEnumerator
203 return [[
self memberArray] objectEnumerator];
209 return [NSSet setWithArray:[
self memberArray]];
213- (NSSet *) membersExcludingLeader
215 return [NSSet setWithArray:[
self memberArrayExcludingLeader]];
219- (NSArray *) memberArray
222 NSUInteger
count = 0;
223 NSArray *result =
nil;
225 if (_count == 0)
return [NSArray array];
227 objects = malloc(
sizeof *objects * _count);
228 for (
id ship in
self)
230 objects[count++] = ship;
233 result = [NSArray arrayWithObjects:objects count:count];
240- (NSArray *) memberArrayExcludingLeader
243 NSUInteger
count = 0;
244 NSArray *result =
nil;
247 if (_count == 0)
return [NSArray array];
248 leader =
self.leader;
250 objects = malloc(
sizeof *objects * _count);
251 for (
id ship in
self)
255 objects[count++] = ship;
259 result = [NSArray arrayWithObjects:objects count:count];
270 for (containedShip in
self)
272 if ([ship isEqual:containedShip])
285 if ([
self containsShip:ship]) return YES;
288 if (_count == _capacity)
292 if (![
self resizeTo:_capacity + 1])
314 if (ship == [
self leader]) [
self setLeader:nil];
318 while ((containedShip = [shipEnum nextObject]))
320 if ([ship isEqual:containedShip])
322 index = [shipEnum
index] - 1;
323 _members[index] = _members[--_count];
344 NSEnumerator *memberEnum =
nil;
345 NSUInteger result = 0;
349 memberEnum = [
self objectEnumerator];
350 while ([memberEnum nextObject] !=
nil) result++;
353 assert(result == _count);
361 if (_count == 0)
return YES;
363 return [[
self objectEnumerator] nextObject] ==
nil;
367- (BOOL) resizeTo:(NSUInteger)newCapacity
371 if (newCapacity < _count)
return NO;
373 temp = realloc(_members, newCapacity *
sizeof *_members);
374 if (temp == NULL)
return NO;
377 _capacity = newCapacity;
384 NSUInteger newCapacity = _capacity;
390 newCapacity = _count + 1;
395 if (_capacity > _count * 2)
397 newCapacity = OORoundUpToPowerOf2_NS(_count);
402 if (newCapacity != _capacity) [
self resizeTo:newCapacity];
418 BOOL cleanupNeeded = NO;
422 [NSException raise:NSGenericException format:@"Collection <OOShipGroup: %p> was mutated while being enumerated.", group];
425 while (enumerator->
_index < group->_count)
427 result = [group->_members[enumerator->
_index] weakRefUnderlyingObject];
453- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(
id *)stackbuf count:(NSUInteger)len
455 NSUInteger srcIndex, dstIndex = 0;
457 BOOL cleanupNeeded = NO;
459 srcIndex = state->state;
460 while (srcIndex < _count && dstIndex < len)
462 item = [_members[srcIndex] weakRefUnderlyingObject];
465 stackbuf[dstIndex++] = item;
470 _members[srcIndex] = _members[--_count];
475 if (cleanupNeeded) [
self cleanUp];
477 state->state = srcIndex;
478 state->itemsPtr = stackbuf;
479 state->mutationsPtr = &_updateCount;
490- (BOOL) suppressClangStuff
502 assert(group !=
nil);
504 if ((
self = [super init]))
506 _group = [group retain];
507 _considerCleanup = YES;
508 _updateCount = [_group updateCount];
535- (void) setPerformCleanup:(BOOL)flag
537 _considerCleanup = flag;
static id ShipGroupIterate(OOShipGroupEnumerator *enumerator)
void setPerformCleanup:(BOOL flag)
OOWeakReference ** _members
void setLeader:(ShipEntity *leader)
< NSFastEnumeration > unsigned long _updateCount
void setGroup:(OOShipGroup *group)
void setOwner:(Entity *who_owns_entity)