1.1 --- a/iixr/files.py Sat Nov 20 23:56:16 2010 +0100
1.2 +++ b/iixr/files.py Sun Nov 21 20:44:43 2010 +0100
1.3 @@ -18,7 +18,7 @@
1.4 with this program. If not, see <http://www.gnu.org/licenses/>.
1.5 """
1.6
1.7 -from iixr.data import vint
1.8 +from iixr.data import vint, vint_to_array
1.9 from array import array
1.10 import zlib
1.11
1.12 @@ -51,6 +51,18 @@
1.13 self.f.close()
1.14 self.f = None
1.15
1.16 + def get_value_size(self, value):
1.17 + if isinstance(value, (list, tuple)):
1.18 + return len(value)
1.19 + else:
1.20 + return 0
1.21 +
1.22 + def get_initial_value(self, size):
1.23 + if size:
1.24 + return [0] * size
1.25 + else:
1.26 + return 0
1.27 +
1.28 class FileWriter(File):
1.29
1.30 "Writing basic data types to files."
1.31 @@ -97,6 +109,24 @@
1.32 length = len(s)
1.33 self.f.write("".join([flag, vint(length), s]))
1.34
1.35 + def write_sequence(self, output, value, last, size, monotonic=1):
1.36 + if size:
1.37 + emit_delta = 1
1.38 + for v, l in map(None, value, last)[:size]:
1.39 + if v is None:
1.40 + v = l
1.41 + if monotonic or emit_delta:
1.42 + v_out = v - l
1.43 + if emit_delta and v_out != 0:
1.44 + emit_delta = 0
1.45 + else:
1.46 + v_out = v + 1
1.47 + vint_to_array(v_out, output)
1.48 + else:
1.49 + vint_to_array(value - last, output)
1.50 +
1.51 + return value
1.52 +
1.53 class FileReader(File):
1.54
1.55 "Reading basic data types from files."
1.56 @@ -152,4 +182,20 @@
1.57
1.58 return unicode(s, "utf-8")
1.59
1.60 + def read_sequence(self, last, size, monotonic=1):
1.61 + if size:
1.62 + expect_delta = 1
1.63 + value = []
1.64 + for v in last:
1.65 + v_in = self.read_number()
1.66 + if monotonic or expect_delta:
1.67 + value.append(v + v_in)
1.68 + if expect_delta and v_in != 0:
1.69 + expect_delta = 0
1.70 + else:
1.71 + value.append(v_in - 1)
1.72 + return tuple(value)
1.73 + else:
1.74 + return last + self.read_number()
1.75 +
1.76 # vim: tabstop=4 expandtab shiftwidth=4