/* * Copyright (c) 2008 - 2009 * Jonathan Schleifer <js@webkeks.org> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE included in * the packaging of this file. */ #include "config.h" #import "OFIterator.h" #import "OFDictionary.h" #import "OFExceptions.h" /* Reference for static linking */ int _OFIterator_reference; @implementation OFIterator - init { @throw [OFNotImplementedException newWithClass: isa selector: _cmd]; } - initWithData: (struct of_dictionary_bucket*)data_ size: (size_t)size_ { size_t i; self = [super init]; size = size_; data = [self allocMemoryForNItems: size withSize: sizeof(struct of_dictionary_bucket)]; for (i = 0; i < size; i++) { if (data_[i].key != nil) { data[i].key = [data_[i].key copy]; data[i].object = [data_[i].object retain]; } else data[i].key = nil; } return self; } - (void)dealloc { size_t i; for (i = 0; i < size; i++) { if (data[i].key != nil) { [data[i].key release]; [data[i].object release]; } } [super dealloc]; } - (of_iterator_pair_t)nextKeyObjectPair { of_iterator_pair_t next; for (; pos < size && data[pos].key == nil; pos++); if (pos < size) { next.key = data[pos].key; next.object = data[pos].object; pos++; } else { next.key = nil; next.object = nil; } return next; } - reset { pos = 0; return self; } @end @implementation OFDictionary (OFIterator) - (OFIterator*)iterator { return [[[OFIterator alloc] initWithData: data size: size] autorelease]; } @end