renamed "level" to "depth" in DirtyTilesTree. Also...
iterate_dirty() yields tuples, not reverseiterators added another level to test_iterate_level()
This commit is contained in:
@@ -599,12 +599,16 @@ class DirtyTiles(object):
|
|||||||
dirty are collapsed
|
dirty are collapsed
|
||||||
|
|
||||||
"""
|
"""
|
||||||
__slots__ = ("level", "children")
|
__slots__ = ("depth", "children")
|
||||||
def __init__(self, level):
|
def __init__(self, depth):
|
||||||
"""Initialize a new node of the tree at the specified level
|
"""Initialize a new tree with the specified depth. This actually
|
||||||
|
initializes a node, which is the root of a subtree, with `depth` levels
|
||||||
|
beneath it.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
self.level = level
|
# Stores the depth of the tree according to this node. This is not the
|
||||||
|
# depth of this node, but rather the number of levels below this node.
|
||||||
|
self.depth = depth
|
||||||
|
|
||||||
# the self.children array holds the 4 children of this node. This
|
# the self.children array holds the 4 children of this node. This
|
||||||
# follows the same quadtree convention as elsewhere: children 0, 1, 2,
|
# follows the same quadtree convention as elsewhere: children 0, 1, 2,
|
||||||
@@ -618,7 +622,7 @@ class DirtyTiles(object):
|
|||||||
# A DirtyTiles instance
|
# A DirtyTiles instance
|
||||||
# the instance defines which children down that subtree are
|
# the instance defines which children down that subtree are
|
||||||
# clean/dirty.
|
# clean/dirty.
|
||||||
# A node with level=1 cannot have a DirtyTiles instance in its
|
# A node with depth=1 cannot have a DirtyTiles instance in its
|
||||||
# children since its leaves are images, not more tree
|
# children since its leaves are images, not more tree
|
||||||
self.children = [False] * 4
|
self.children = [False] * 4
|
||||||
|
|
||||||
@@ -630,7 +634,7 @@ class DirtyTiles(object):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
path = list(path)
|
path = list(path)
|
||||||
assert len(path) == self.level
|
assert len(path) == self.depth
|
||||||
path.reverse()
|
path.reverse()
|
||||||
self._set_dirty_helper(path)
|
self._set_dirty_helper(path)
|
||||||
|
|
||||||
@@ -644,7 +648,7 @@ class DirtyTiles(object):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if self.level == 1:
|
if self.depth == 1:
|
||||||
# Base case
|
# Base case
|
||||||
self.children[path[0]] = True
|
self.children[path[0]] = True
|
||||||
|
|
||||||
@@ -659,7 +663,7 @@ class DirtyTiles(object):
|
|||||||
|
|
||||||
if child == False:
|
if child == False:
|
||||||
# Create a new node
|
# Create a new node
|
||||||
child = self.__class__(self.level-1)
|
child = self.__class__(self.depth-1)
|
||||||
child._set_dirty_helper(path)
|
child._set_dirty_helper(path)
|
||||||
self.children[childnum] = child
|
self.children[childnum] = child
|
||||||
elif child == True:
|
elif child == True:
|
||||||
@@ -679,16 +683,21 @@ class DirtyTiles(object):
|
|||||||
if all(x is True for x in self.children):
|
if all(x is True for x in self.children):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def iterate_dirty(self):
|
def iterate_dirty(self, depth=None):
|
||||||
"""Returns an iterator over every dirty tile in this subtree. Each item
|
"""Returns an iterator over every dirty tile in this subtree. Each item
|
||||||
yielded is a sequence of integers representing the quadtree path to the
|
yielded is a sequence of integers representing the quadtree path to the
|
||||||
dirty tile. Yielded sequences are of length self.level.
|
dirty tile. Yielded sequences are of length self.depth.
|
||||||
|
|
||||||
|
If zoom is None, iterates over tiles of the highest level, i.e.
|
||||||
|
worldtiles. If zoom is a value between 0 and the depth, iterates over
|
||||||
|
tiles at that zoom level. Zoom level 0 is zoomed all the way out, zoom
|
||||||
|
level `depth` is all the way in.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
return (reversed(rpath) for rpath in self._iterate_dirty_helper())
|
return (tuple(reversed(rpath)) for rpath in self._iterate_dirty_helper())
|
||||||
|
|
||||||
def _iterate_dirty_helper(self):
|
def _iterate_dirty_helper(self):
|
||||||
if self.level == 1:
|
if self.depth == 1:
|
||||||
# Base case
|
# Base case
|
||||||
if self.children[0]: yield [0]
|
if self.children[0]: yield [0]
|
||||||
if self.children[1]: yield [1]
|
if self.children[1]: yield [1]
|
||||||
@@ -700,7 +709,7 @@ class DirtyTiles(object):
|
|||||||
for c, child in enumerate(self.children):
|
for c, child in enumerate(self.children):
|
||||||
if child == True:
|
if child == True:
|
||||||
# All dirty down this subtree, iterate over every leaf
|
# All dirty down this subtree, iterate over every leaf
|
||||||
for x in iterate_base4(self.level-1):
|
for x in iterate_base4(self.depth-1):
|
||||||
x = list(x)
|
x = list(x)
|
||||||
x.append(c)
|
x.append(c)
|
||||||
yield x
|
yield x
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ class DirtyTilesTest(unittest.TestCase):
|
|||||||
self.tree.set_dirty((1,1,1))
|
self.tree.set_dirty((1,1,1))
|
||||||
self.assertRaises(AssertionError, self.test_iterate)
|
self.assertRaises(AssertionError, self.test_iterate)
|
||||||
|
|
||||||
# If something was supposed to be returned but didn't
|
# If something was supposed to be returned but wasn't
|
||||||
tree = DirtyTiles(3)
|
tree = DirtyTiles(3)
|
||||||
c = len(self.dirty_paths) // 2
|
c = len(self.dirty_paths) // 2
|
||||||
for t in self.dirty_paths:
|
for t in self.dirty_paths:
|
||||||
@@ -116,5 +116,14 @@ class DirtyTilesTest(unittest.TestCase):
|
|||||||
l2.remove(p)
|
l2.remove(p)
|
||||||
self.assertEqual(len(dirty), 0, "Never iterated over these items: %s" % l2)
|
self.assertEqual(len(dirty), 0, "Never iterated over these items: %s" % l2)
|
||||||
|
|
||||||
|
# level 1
|
||||||
|
l1 = set()
|
||||||
|
for p in self.dirty_paths:
|
||||||
|
l1.add(p[0:1])
|
||||||
|
for p in self.tree.iterate_dirty(1):
|
||||||
|
self.assertTrue(p in l1, "%s was not supposed to be returned!" % (p,))
|
||||||
|
l1.remove(p)
|
||||||
|
self.assertEqual(len(dirty), 0, "Never iterated over these items: %s" % l1)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
Reference in New Issue
Block a user