11 """Compare @inter1 and @inter2 and returns the associated INT_* case
12 @inter1, @inter2: interval instance
17 inter1_start, inter1_stop = inter1
18 inter2_start, inter2_stop = inter2
20 if inter1_start <= inter2_start
and inter1_stop >= inter2_stop:
22 if inter2_start <= inter1_start
and inter2_stop >= inter1_stop:
24 if inter1_stop + 1 == inter2_start:
26 if inter2_stop + 1 == inter1_start:
28 if inter1_start > inter2_stop + 1
or inter2_start > inter1_stop + 1:
34 """Stands for intervals with integer bounds
36 Offers common methods to work with interval"""
39 """Instance an interval object
40 @bounds: (optional) list of (int, int) and/or interval instance
44 elif isinstance(bounds, interval):
45 bounds = bounds.intervals
51 """Iterate on intervals"""
58 Return a cannonizes list of intervals
59 @tmp: list of (int, int)
61 tmp = sorted([x
for x
in tmp
if x[0] <= x[1]])
72 elif rez == INT_DISJOIN:
74 elif rez == INT_B_IN_A:
76 elif rez
in [INT_JOIN, INT_JOIN_AB, INT_JOIN_BA, INT_A_IN_B]:
79 INT_JOIN, INT_JOIN_AB, INT_JOIN_BA, INT_A_IN_B]:
80 u = min(u, out[-1][0])
81 v = max(v, out[-1][1])
85 raise ValueError(
'unknown state', rez)
89 "Apply .cannon_list() on self contained intervals"
97 o =
" U ".join([
"[0x%X 0x%X]" % (x[0], x[1])
104 if isinstance(other, interval):
105 for intervalB
in other.intervals:
108 if cmp_interval(intervalA, intervalB)
in [INT_EQ, INT_B_IN_A]:
116 if intervalA[0] <= other <= intervalA[1]:
124 if isinstance(i, interval):
132 to_del = v.intervals[:]
133 while i < len(to_test) - 1:
141 while to_del
and to_del[0][1] < x[0]:
148 if rez == INT_DISJOIN:
154 elif rez == INT_A_IN_B:
158 elif rez == INT_B_IN_A:
160 i1 = (x[0], y[0] - 1)
161 i2 = (y[1] + 1, x[1])
162 to_test[i:i] = [i1, i2]
165 elif rez
in [INT_JOIN_AB, INT_JOIN_BA]:
167 elif rez == INT_JOIN:
170 to_test[i:i] = [(x[0], y[0] - 1)]
172 to_test[i:i] = [(y[1] + 1, x[1])]
176 raise ValueError(
'unknown state', rez)
184 for y
in v.intervals:
187 if rez == INT_DISJOIN:
192 elif rez == INT_A_IN_B:
195 elif rez == INT_B_IN_A:
198 elif rez == INT_JOIN_AB:
200 elif rez == INT_JOIN_BA:
202 elif rez == INT_JOIN:
204 out.append((y[0], x[1]))
206 out.append((x[0], y[1]))
209 raise ValueError(
'unknown state', rez)
213 "Return the first and the last bounds of intervals"
221 """Return True iff the interval is empty"""
224 def show(self, img_x=1350, img_y=20, dry_run=False):
226 show image representing the interval
232 print 'cannot import python PIL imaging'
235 img = Image.new(
'RGB', (img_x, img_y), (100, 100, 100))
236 draw = ImageDraw.Draw(img)
237 i_min, i_max = self.
hull()
239 print hex(i_min), hex(i_max)
241 addr2x =
lambda addr: (addr - i_min) * img_x / (i_max - i_min)
243 draw.rectangle((addr2x(a), 0, addr2x(b), img_y), (200, 0, 0))