sawine@3: class Grid(object): sawine@3: sawine@3: def __init__(self): sawine@3: self.cells = {} sawine@5: self.valuemap = {} sawine@3: self.minx = 0 sawine@3: self.maxx = 0 sawine@3: self.miny = 0 sawine@3: self.maxy = 0 sawine@3: sawine@3: def set(self, pos, value=1): sawine@5: if pos in self.cells and value != self.cells[pos]: sawine@5: self.clear(pos) sawine@5: if not pos in self.cells: sawine@3: self.cells[pos] = value sawine@5: if value in self.valuemap: sawine@5: self.valuemap[value].append(pos) sawine@5: else: sawine@5: self.valuemap[value] = [pos] sawine@3: self.update(pos) sawine@3: return self sawine@3: sawine@3: def clear(self, pos): sawine@5: if pos in self.cells: sawine@5: self.valuemap[self.cells[pos]].remove(pos) sawine@3: del self.cells[pos] sawine@3: self.update(pos) sawine@3: return self sawine@3: sawine@3: def update(self, (x, y)): sawine@3: self.minx = min(x, self.minx) sawine@3: self.maxx = max(x, self.maxx) sawine@3: self.miny = min(y, self.miny) sawine@3: self.maxy = max(y, self.maxy) sawine@3: return self sawine@3: sawine@3: def width(self): sawine@3: return self.maxx - self.minx + 1 sawine@3: sawine@3: def height(self): sawine@3: return self.maxy - self.miny + 1 sawine@3: sawine@3: def __len__(self): sawine@3: return len(self.cells) sawine@3: sawine@3: def __str__(self): sawine@3: pass