AutoBlockIterator.h [plain text]
#pragma once
#ifndef __AUTO_BLOCKITERATOR__
#define __AUTO_BLOCKITERATOR__
#include "AutoAdmin.h"
#include "AutoDefs.h"
#include "AutoLarge.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 (!visitor.visit(zone, large)) return false;
}
return true;
}
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;
}
};
#endif // __AUTO_BLOCKITERATOR__