AutoBlockIterator.h [plain text]
#pragma once
#ifndef __AUTO_BLOCKITERATOR__
#define __AUTO_BLOCKITERATOR__
#include "AutoAdmin.h"
#include "AutoDefs.h"
#include "AutoLarge.h"
#include "AutoListTypes.h"
#include "AutoRegion.h"
#include "AutoZone.h"
namespace Auto {
template <class Visitor> bool visitAllocatedBlocks(Zone *zone, Visitor& visitor) {
for (Region *region = zone->region_list(); region != NULL; region = region->next()) {
SubzoneRangeIterator iterator(region->subzone_range());
while (Subzone *subzone = iterator.next()) {
usword_t n = subzone->allocation_limit();
for (usword_t q = 0; q < n; q = subzone->next_quantum(q)) {
if (!subzone->is_free(q)) {
visitor.visit(zone, subzone, q);
}
}
}
}
for (Large *large = zone->large_list(); large != NULL; large = large->next()) {
if (large->is_freed()) continue;
if (!visitor.visit(zone, large)) return false;
}
return true;
}
template<class T>class BlockIterator {
private:
Zone *_zone; T &_visitor;
public:
BlockIterator(Zone *zone, T &visitor)
: _zone(zone)
, _visitor(visitor)
{}
inline bool visit() {
return visitAllocatedBlocks(_zone, _visitor);
}
};
template <class Visitor> bool visitAllBlocks(Zone *zone, Visitor& visitor) {
for (Region *region = zone->region_list(); region != NULL; region = region->next()) {
SubzoneRangeIterator iterator(region->subzone_range());
while (Subzone *subzone = iterator.next()) {
usword_t n = subzone->allocation_limit();
for (usword_t q = 0; q < n; q = subzone->next_quantum(q)) {
if (!visitor.visit(zone, subzone, q)) return false;
}
}
}
for (Large *large = zone->large_list(); large != NULL; large = large->next()) {
if (!visitor.visit(zone, large)) return false;
}
return true;
}
template<class T>class AllBlockIterator {
private:
Zone *_zone; T &_visitor;
public:
AllBlockIterator(Zone *zone, T &visitor)
: _zone(zone)
, _visitor(visitor)
{}
inline bool visit() {
return visitAllBlocks(_zone, _visitor);
}
};
};
#endif // __AUTO_BLOCKITERATOR__