Convert mapping to a generator rather than a list. It must still return in sorted order.

This commit is contained in:
Mike Auty
2016-07-02 15:48:09 +01:00
parent fc34850345
commit c626bebb59
3 changed files with 13 additions and 13 deletions
+1 -1
View File
@@ -95,7 +95,7 @@ class TranslationLayerInterface(DataLayerInterface, metaclass = ABCMeta):
@abstractmethod
def mapping(self, offset, length, ignore_errors = False):
"""Returns a sorted list of (offset, mapped_offset, length, layer) mappings
"""Returns a sorted iterable of (offset, mapped_offset, length, layer) mappings
ignore_errors will provide all available maps with gaps, but their total length may not add up to the requested length
This allows translation layers to provide maps of contiguous regions in one layer
+6 -6
View File
@@ -109,29 +109,29 @@ class Intel(interfaces.layers.TranslationLayerInterface):
return False
def mapping(self, offset, length, ignore_errors = False):
"""Returns a sorted list of (offset, mapped_offset, length, layer) mappings
"""Returns a sorted iterable of (offset, mapped_offset, length, layer) mappings
This allows translation layers to provide maps of contiguous regions in one layer
"""
result = []
if length == 0:
if ignore_errors and not self.is_valid(offset):
return result
raise StopIteration
mapped_offset, _ = self._translate(offset)
return [(offset, mapped_offset, length, self._base_layer)]
yield (offset, mapped_offset, length, self._base_layer)
raise StopIteration
while length > 0:
if ignore_errors:
while not self.is_valid(offset) and length > 0:
length -= 1 << self._page_size_in_bits
offset += 1 << self._page_size_in_bits
if length <= 0:
return result
raise StopIteration
chunk_offset, page_size = self._translate(offset)
chunk_size = min(page_size - (chunk_offset % page_size), length)
result.append((offset, chunk_offset, chunk_size, self._base_layer))
yield (offset, chunk_offset, chunk_size, self._base_layer)
length -= chunk_size
offset += chunk_size
return result
@property
def dependencies(self):
+6 -6
View File
@@ -105,7 +105,7 @@ class LimeLayer(interfaces.layers.TranslationLayerInterface):
return False
def mapping(self, offset, length, ignore_errors = False):
"""Returns a sorted list of (offset, mapped_offset, length, layer) mappings"""
"""Returns a sorted iterable of (offset, mapped_offset, length, layer) mappings"""
result = []
if ignore_errors:
for (seg_offset, mapped_seg_offset, seg_length) in self._segments:
@@ -118,20 +118,20 @@ class LimeLayer(interfaces.layers.TranslationLayerInterface):
seg_offset += diff
if offset + length < seg_offset + seg_length:
seg_length = offset + length - seg_offset
result.append((seg_offset, mapped_seg_offset, seg_length, self._base_layer))
return result
yield (seg_offset, mapped_seg_offset, seg_length, self._base_layer)
raise StopIteration
if length == 0:
logical_start, base_start, size = self._find_segment(offset)
mapped_offset = offset - logical_start + base_start
return [(offset, mapped_offset, 0, self._base_layer)]
yield (offset, mapped_offset, 0, self._base_layer)
raise StopIteration
while length > 0:
logical_start, base_start, size = self._find_segment(offset)
chunk_offset = offset - logical_start + base_start
chunk_size = min(size - (offset - logical_start), length)
result.append((offset, chunk_offset, chunk_size, self._base_layer))
yield (offset, chunk_offset, chunk_size, self._base_layer)
length -= chunk_size
offset += chunk_size
return result
@property
def dependencies(self):