/*! @header FTIdToNodeIterator @abstract Module of FT @availability OS X, GNUstep @copyright 2004, 2005, 2006 Free Software Foundation, Inc. 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

  17.07.05 ola     initial version
  23.08.06 ola     license changed
  -------------------------------------------------------------------------
  
*/ #include @implementation FTIdToNodeIterator - initWithIdEnumerator: (NSEnumerator *) idEnumerator forGraph: (FTGraphImpl *) aGraph { self = [super init]; self->nodeIds = [idEnumerator retain]; self->graph = [aGraph retain]; self->nextNode = nil; self->state = __IDTONODEITERATOR_STATE_BEGIN; self->lock = [[NSLock alloc] init]; return self; } - (void) dealloc { if( nil != self->nodeIds ) { [self->nodeIds release]; } if( nil != self->graph ) { self->graph = nil; } [self->lock release]; [super dealloc]; } - (FTNodeImpl *) fetchNextNode { FTNodeImpl *toReturn = nil; id nextId; nextId = [self->nodeIds nextObject]; if( nil != nextId ) { toReturn = (FTNodeImpl *) [self->graph nodeWithId: (id ) nextId]; } else { toReturn = nil; } return toReturn; } - (BOOL) hasNext { [self->lock lock]; if( __IDTONODEITERATOR_STATE_HAS_NEXT_REQUESTED != self->state ) { self->nextNode = [self fetchNextNode]; self->state = __IDTONODEITERATOR_STATE_HAS_NEXT_REQUESTED; } [self->lock unlock]; return nil != self->nextNode; } - next { id toReturn; [self->lock lock]; if( __IDTONODEITERATOR_STATE_HAS_NEXT_REQUESTED != self->state ) { self->nextNode = [self fetchNextNode]; } self->state = __IDTONODEITERATOR_STATE_NEXT_REQUESTED; toReturn = self->nextNode; [self->lock unlock]; return toReturn; } @end