[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