/*!
@header ECStack
@abstract Module of Encore
@availability OS X, GNUstep
@copyright 2004, 2005, 2006 Oliver Langer
Author: Oliver Langer
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-------------------------------------------------------------------------
Modification history
25.06.05 ola initial version
22.08.06 ola license changed
-------------------------------------------------------------------------
*/
#include
#include
@implementation ECStack
- init {
self = [super init];
self->lock = [[NSLock alloc] init];
self->stackData = [[NSMutableArray alloc] init];
return self;
}
- (void) dealloc {
[self->lock release];
[self->stackData release];
[super dealloc];
}
- (unsigned) count {
return [self->stackData count];
}
- (BOOL) isEmpty {
return [self count] == 0;
}
- (BOOL) isEqual: (id) anObject {
BOOL equals = NO;
if( nil != anObject ) {
if( [anObject isKindOfClass: [self class]] ) {
equals = [self->stackData isEqual: ((ECStack *) anObject)->stackData];
}
}
return equals;
}
- popObject {
id toReturn = nil;
[self->lock lock];
toReturn = [[self->stackData lastObject] retain];
if( nil != toReturn ) {
NS_DURING
[self->stackData removeLastObject];
NS_HANDLER
[self->lock release];
[localException raise];
NS_ENDHANDLER
}
[self->lock unlock];
return [toReturn autorelease];
}
- pushObject: (id) toPush {
if( nil == toPush ) {
[[[ECIllegalArgumentException alloc]
initWithArgumentInfo: @"Cannot push nil"] raise];
}
[self->lock lock];
[self->stackData addObject: toPush];
[self->lock unlock];
return self;
}
- topObject {
return [self->stackData lastObject];
}
@end