template inline void Cell::Visit(const CellLock &l, TypeContainerVisitor &visitor, Map &m) const { const CellPair &standing_cell = l.i_cellPair; if (standing_cell.x_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP || standing_cell.y_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP) return; uint16 district = (District)this->data.Part.reserved; if(district == CENTER_DISTRICT) { m.Visit(l, visitor); return; } // set up the cell range based on the district // the overloaded operators handle range checking CellPair begin_cell = standing_cell; CellPair end_cell = standing_cell; switch( (District)this->data.Part.reserved ) { case ALL_DISTRICT: { begin_cell << 1; begin_cell -= 1; // upper left end_cell >> 1; end_cell += 1; // lower right break; } case UPPER_LEFT_DISTRICT: { begin_cell << 1; begin_cell -= 1; // upper left break; } case UPPER_RIGHT_DISTRICT: { begin_cell -= 1; // up end_cell >> 1; // right break; } case LOWER_LEFT_DISTRICT: { begin_cell << 1; // left end_cell += 1; // down break; } case LOWER_RIGHT_DISTRICT: { end_cell >> 1; end_cell += 1; // lower right break; } case LEFT_DISTRICT: { begin_cell -= 1; // up end_cell >> 1; end_cell += 1; // lower right break; } case RIGHT_DISTRICT: { begin_cell << 1; begin_cell -= 1; // upper left end_cell += 1; // down break; } case UPPER_DISTRICT: { begin_cell << 1; begin_cell -= 1; // upper left end_cell >> 1; // right break; } case LOWER_DISTRICT: { begin_cell << 1; // left end_cell >> 1; end_cell += 1; // lower right break; } default: { assert( false ); break; } } // loop the cell range for(uint32 x = begin_cell.x_coord; x <= end_cell.x_coord; x++) { for(uint32 y = begin_cell.y_coord; y <= end_cell.y_coord; y++) { Cell r_zone(CellPair(x,y)); r_zone.data.Part.nocreate = l->data.Part.nocreate; CellLock lock(r_zone, CellPair(x,y)); m.Visit(lock, visitor); } } }