OSCollectionIterator.cpp [plain text]
#include <libkern/c++/OSCollectionIterator.h>
#include <libkern/c++/OSCollection.h>
#include <libkern/c++/OSArray.h>
#include <libkern/c++/OSLib.h>
#define super OSIterator
OSDefineMetaClassAndStructors(OSCollectionIterator, OSIterator)
#if OSALLOCDEBUG
extern "C" {
extern int debug_container_malloc_size;
};
#define ACCUMSIZE(s) do { debug_container_malloc_size += (s); } while(0)
#else
#define ACCUMSIZE(s)
#endif
bool OSCollectionIterator::initWithCollection(const OSCollection *inColl)
{
if ( !super::init() || !inColl)
return false;
inColl->retain();
collection = inColl;
collIterator = 0;
initialUpdateStamp = 0;
valid = false;
return this;
}
OSCollectionIterator *
OSCollectionIterator::withCollection(const OSCollection *inColl)
{
OSCollectionIterator *me = new OSCollectionIterator;
if (me && !me->initWithCollection(inColl)) {
me->release();
return 0;
}
return me;
}
void OSCollectionIterator::free()
{
if (collIterator) {
kfree(collIterator, collection->iteratorSize());
ACCUMSIZE(-(collection->iteratorSize()));
collIterator = 0;
}
if (collection) {
collection->release();
collection = 0;
}
super::free();
}
void OSCollectionIterator::reset()
{
valid = false;
if (!collIterator) {
collIterator = (void *)kalloc(collection->iteratorSize());
ACCUMSIZE(collection->iteratorSize());
if (!collIterator)
return;
}
if (!collection->initIterator(collIterator))
return;
initialUpdateStamp = collection->updateStamp;
valid = true;
}
bool OSCollectionIterator::isValid()
{
if (!collIterator) {
collIterator = (void *)kalloc(collection->iteratorSize());
ACCUMSIZE(collection->iteratorSize());
if (!collection->initIterator(collIterator))
return false;
initialUpdateStamp = collection->updateStamp;
valid = true;
}
else if (!valid || collection->updateStamp != initialUpdateStamp)
return false;
return true;
}
OSObject *OSCollectionIterator::getNextObject()
{
OSObject *retObj;
bool retVal;
if (!isValid())
return 0;
retVal = collection->getNextObjectForIterator(collIterator, &retObj);
return (retVal)? retObj : 0;
}