class area: def __init__(self): self.area=[] self.all=[] def show(self): self.pack() self.area.sort() end_old=0 for start,end in self.area: print "\t\t%15d - %-15d %15s" % (start,end,(start-end_old) or '') end_old=end def add(self,start,size,fn=''): if size<=0: return end=start+size self.area.append((start,end)) self.all.append((start,end,fn)) c=self.pack() #print start,end,self.area,c def remove(self,a): try: self.area.remove(a) except ValueError: pass def sum(self): c=0 for s,e in self.area: c+=e-s return c def pack(self): c=0 for s1,e1 in self.area: for s2,e2 in self.area: if (s1==s2) and (e1==e2): continue elif s1<=s2<=e1: if e2<=e1: self.remove((s2,e2)) c+=1 else: self.remove((s1,e1)) self.remove((s2,e2)) self.area.append((s1,e2)) c+=1 elif s1<=e2<=e1: if s1<=s2: self.remove((s2,e2)) c+=1 else: self.remove((s1,e1)) self.remove((s2,e2)) self.area.append((s2,e1)) c+=1 #self.area.sort() if c>0: c=self.pack() return c def begin_with(self,pos): s2,e2,fn2=0,0,'' for s1,e1,fn1 in self.all: if s1<=pos(e2-s2): s2,e2,fn2=s1,e1,fn1 return s2,e2,fn2 def begins(self,pos): b=[] for s1,e1,fn1 in self.all: if s1<=pos