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)
bool
OSCollectionIterator::initWithCollection(const OSCollection *inColl)
{
if (!super::init() || !inColl) {
return false;
}
inColl->retain();
collection = inColl;
collIterator = 0;
initialUpdateStamp = 0;
valid = false;
return true;
}
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());
OSCONTAINER_ACCUMSIZE(-((size_t) collection->iteratorSize()));
collIterator = 0;
}
if (collection) {
collection->release();
collection = 0;
}
super::free();
}
void
OSCollectionIterator::reset()
{
valid = false;
if (!collIterator) {
collIterator = (void *)kalloc_container(collection->iteratorSize());
OSCONTAINER_ACCUMSIZE(collection->iteratorSize());
if (!collIterator) {
return;
}
}
if (!collection->initIterator(collIterator)) {
return;
}
initialUpdateStamp = collection->updateStamp;
valid = true;
}
bool
OSCollectionIterator::isValid()
{
if (!collIterator) {
collIterator = (void *)kalloc_container(collection->iteratorSize());
OSCONTAINER_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;
}