))
class Tracker(object):
- def __init__(self, shares=[], delta_type=AttributeDelta):
+ def __init__(self, shares=[], delta_type=AttributeDelta, subset_of=None):
self.shares = {} # hash -> share
self.reverse_shares = {} # delta.tail -> set of share_hashes
self.added = variable.Event()
self.removed = variable.Event()
- self.get_nth_parent_hash = DistanceSkipList(self)
+ if subset_of is None:
+ self.get_nth_parent_hash = DistanceSkipList(self)
+ else:
+ self.get_nth_parent_hash = subset_of.get_nth_parent_hash
self.delta_type = delta_type
+ self.subset_of = subset_of
for share in shares:
self.add(share)
def add(self, share):
assert not isinstance(share, (int, long, type(None)))
delta = self.delta_type.from_element(share)
+ if self.subset_of is not None:
+ assert delta.head in self.subset_of.shares
if delta.head in self.shares:
raise ValueError('share already present')
assert isinstance(share_hash, (int, long, type(None)))
if share_hash not in self.shares:
raise KeyError()
+ if self.subset_of is not None:
+ assert share_hash in self.subset_of.shares
share = self.shares[share_hash]
del share_hash