[Python-checkins] CVS: python/dist/src/Lib weakref.py,1.9,1.10
Fred L. Drake
fdrake@users.sourceforge.net
Tue, 01 May 2001 22:43:11 -0700
Update of /cvsroot/python/python/dist/src/Lib
In directory usw-pr-cvs1:/tmp/cvs-serv28469
Modified Files:
weakref.py
Log Message:
Added iterator support to the Weak*Dictionary classes.
Index: weakref.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/weakref.py,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -r1.9 -r1.10
*** weakref.py 2001/04/19 16:26:06 1.9
--- weakref.py 2001/05/02 05:43:09 1.10
***************
*** 85,88 ****
--- 85,98 ----
return L
+ def iteritems(self):
+ return WeakValuedItemIterator(self)
+
+ def iterkeys(self):
+ return self.data.iterkeys()
+ __iter__ = iterkeys
+
+ def itervalues(self):
+ return WeakValuedValueIterator(self)
+
def popitem(self):
while 1:
***************
*** 168,171 ****
--- 178,191 ----
return L
+ def iteritems(self):
+ return WeakKeyedItemIterator(self)
+
+ def iterkeys(self):
+ return WeakKeyedKeyIterator(self)
+ __iter__ = iterkeys
+
+ def itervalues(self):
+ return self.data.itervalues()
+
def keys(self):
L = []
***************
*** 190,193 ****
--- 210,266 ----
for key, value in dict.items():
d[ref(key, self._remove)] = value
+
+
+ class BaseIter:
+ def __iter__(self):
+ return self
+
+
+ class WeakKeyedKeyIterator(BaseIter):
+ def __init__(self, weakdict):
+ self._next = weakdict.data.iterkeys().next
+
+ def next(self):
+ while 1:
+ wr = self._next()
+ obj = wr()
+ if obj is not None:
+ return obj
+
+
+ class WeakKeyedItemIterator(BaseIter):
+ def __init__(self, weakdict):
+ self._next = weakdict.data.iteritems().next
+
+ def next(self):
+ while 1:
+ wr, value = self._next()
+ key = wr()
+ if key is not None:
+ return key, value
+
+
+ class WeakValuedValueIterator(BaseIter):
+ def __init__(self, weakdict):
+ self._next = weakdict.data.itervalues().next
+
+ def next(self):
+ while 1:
+ wr = self._next()
+ obj = wr()
+ if obj is not None:
+ return obj
+
+
+ class WeakValuedItemIterator(BaseIter):
+ def __init__(self, weakdict):
+ self._next = weakdict.data.iteritems().next
+
+ def next(self):
+ while 1:
+ key, wr = self._next()
+ value = wr()
+ if value is not None:
+ return key, value