Author: Romain Guillebert <[email protected]>
Branch: numpypy-nditer
Changeset: r64919:324066eec689
Date: 2013-06-17 17:01 +0200
http://bitbucket.org/pypy/pypy/changeset/324066eec689/

Log:    Implement C style iteration

diff --git a/pypy/module/micronumpy/interp_nditer.py 
b/pypy/module/micronumpy/interp_nditer.py
--- a/pypy/module/micronumpy/interp_nditer.py
+++ b/pypy/module/micronumpy/interp_nditer.py
@@ -221,13 +221,9 @@
         self.shape = shape
         self.index = [0] * len(shape)
         self.backward = backward
-        self.called = False
 
     def next(self):
         # TODO It's probably possible to refactor all the "next" method from 
each iterator
-        if not self.called:
-            self.called = True
-            return
         for i in range(len(self.shape) - 1, -1, -1):
             if self.index[i] < self.shape[i] - 1:
                 self.index[i] += 1
@@ -236,8 +232,6 @@
                 self.index[i] = 0
 
     def getvalue(self):
-        if not self.called:
-            return 0
         if not self.backward:
             ret = self.index[-1]
             for i in range(len(self.shape) - 2, -1, -1):
@@ -265,6 +259,7 @@
         self.zerosize_ok = False
         self.index_iter = None
         self.done = False
+        self.first_next = True
         if space.isinstance_w(w_seq, space.w_tuple) or \
            space.isinstance_w(w_seq, space.w_list):
             w_seq_as_list = space.listview(w_seq)
@@ -293,8 +288,12 @@
         return space.wrap(self)
 
     def descr_getitem(self, space, w_idx):
-        raise OperationError(space.w_NotImplementedError, space.wrap(
-            'not implemented yet'))
+        idx = space.int_w(w_idx)
+        try:
+            ret = space.wrap(self.iters[idx].getitem(space, self.seq[idx]))
+        except IndexError:
+            raise OperationError(space.w_IndexError, space.wrap("Iterator 
operand index %d is out of bounds" % idx))
+        return ret
 
     def descr_setitem(self, space, w_idx, w_value):
         raise OperationError(space.w_NotImplementedError, space.wrap(
@@ -313,7 +312,10 @@
             raise OperationError(space.w_StopIteration, space.w_None)
         res = []
         if self.index_iter:
-            self.index_iter.next()
+            if not self.first_next:
+                self.index_iter.next()
+            else:
+                self.first_next = False
         for i in range(len(self.iters)):
             res.append(self.iters[i].getitem(space, self.seq[i]))
             self.iters[i].next()
@@ -321,9 +323,21 @@
             return res[0]
         return space.newtuple(res)
 
+    def iternext(self):
+        if self.index_iter:
+            self.index_iter.next()
+        for i in range(len(self.iters)):
+            self.iters[i].next()
+        for it in self.iters:
+            if not it.done():
+                break
+        else:
+            self.done = True
+            return self.done
+        return self.done
+
     def descr_iternext(self, space):
-        raise OperationError(space.w_NotImplementedError, space.wrap(
-            'not implemented yet'))
+        return space.wrap(self.iternext())
 
     def descr_copy(self, space):
         raise OperationError(space.w_NotImplementedError, space.wrap(
@@ -359,8 +373,7 @@
             'not implemented yet'))
 
     def descr_get_finished(self, space):
-        raise OperationError(space.w_NotImplementedError, space.wrap(
-            'not implemented yet'))
+        return space.wrap(self.done)
 
     def descr_get_has_delayed_bufalloc(self, space):
         raise OperationError(space.w_NotImplementedError, space.wrap(
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to