diff --git a/int2intmaplike.py b/int2intmaplike.py index 593176d..35b40e2 100644 --- a/int2intmaplike.py +++ b/int2intmaplike.py @@ -16,6 +16,7 @@ class Int2IntMapLike(): def __init__(self, file): self._file = file self._handle = open(file, "w+t") + self._buffer = "" def close(self): if not self._handle.closed: @@ -27,13 +28,22 @@ class Int2IntMapLike(): def add(self, start: int, length: int, val: int): line = "%d,%d,%d\n" % (start, length, val) length = len(line) - offset = self._handle.tell() + offset = self._handle.tell() + len(self._buffer) if offset % self.blocksize + length > self.blocksize: + # end of block: fill block fill_bytes = self.blocksize - offset % self.blocksize - self._handle.write("\n" * fill_bytes) - self._handle.write(line) + self._buffer = self._buffer + ("\n" * fill_bytes) + else: + self._buffer = self._buffer + line + + def _flush_buffer(self): + self._handle.write(self._buffer) + self._buffer = "" + self._handle.flush() def find(self, key: int) -> Optional[int]: + if (len(self._buffer)) > 0: + self._flush_buffer() size = os.stat(self._file).st_size if size == 0: return None diff --git a/testint2intmaplike.py b/testint2intmaplike.py index 3be2038..b5fcec7 100644 --- a/testint2intmaplike.py +++ b/testint2intmaplike.py @@ -16,6 +16,35 @@ class Int2IntMapLikeTest(unittest.TestCase): self.map.close() self.test_dir.cleanup() + def test_empty_map(self): + map = self.map + self.assertEqual(None, map.find(0)) + + def test_one_line_one_byte(self): + map = self.map + map.add(10, 1, 1) # add only the key 10 + self.assertEqual(None, map.find(9)) # directly before + self.assertEqual(1, map.find(10)) + self.assertEqual(None, map.find(11)) # directly after + + def test_one_line_two_bytes(self): + map = self.map + map.add(10, 2, 1) # added keys 10 and 11 + self.assertEqual(None, map.find(9)) # directly before + self.assertEqual(1, map.find(10)) + self.assertEqual(1, map.find(11)) + self.assertEqual(None, map.find(12)) # directly after + + def test_two_lines(self): + map = self.map + map.add(10, 1, 1) # added key 10 + map.add(12, 1, 2) # added key 12 + self.assertEqual(None, map.find(9)) # directly before + self.assertEqual(1, map.find(10)) + self.assertEqual(None, map.find(11)) # between + self.assertEqual(2, map.find(12)) + self.assertEqual(None, map.find(13)) # directly after + def test_fill_map(self): map = self.map map.blocksize = 64