Commit: b58beed604f69ff8136d55f91ad75003cc5f575f
Author: Tamito Kajiyama
Date:   Fri Jan 31 13:40:24 2014 +0900
https://developer.blender.org/rBb58beed604f69ff8136d55f91ad75003cc5f575f

Imported D222 Diff 2 (ID 781) by flokkievids (Folkert de Vries).

===================================================================

M       
source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp
M       source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h
M       
source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp
M       
source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h
M       
source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp
M       
source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.h
M       
source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp
M       
source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h

===================================================================

diff --git 
a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp 
b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp
index 2927297..8ff744c 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.cpp
@@ -74,10 +74,14 @@ static int AdjacencyIterator_init(BPy_AdjacencyIterator 
*self, PyObject *args, P
        PyObject *obj1 = 0, *obj2 = 0, *obj3 = 0;
 
        if (PyArg_ParseTupleAndKeywords(args, kwds, "|O!", (char **)kwlist_1, 
&AdjacencyIterator_Type, &obj1)) {
-               if (!obj1)
+        if (!obj1) {
                        self->a_it = new AdjacencyIterator();
-               else 
+            self->at_start = true;
+        }
+        else {
                        self->a_it = new 
AdjacencyIterator(*(((BPy_AdjacencyIterator *)obj1)->a_it));
+            self->at_start = ((BPy_AdjacencyIterator *)obj1)->at_start;
+        }
        }
        else if (PyErr_Clear(), (obj2 = obj3 = 0),
                 PyArg_ParseTupleAndKeywords(args, kwds, "O!|O!O!", (char 
**)kwlist_2,
@@ -86,6 +90,7 @@ static int AdjacencyIterator_init(BPy_AdjacencyIterator 
*self, PyObject *args, P
                bool restrictToSelection = (!obj2) ? true : 
bool_from_PyBool(obj2);
                bool restrictToUnvisited = (!obj3) ? true : 
bool_from_PyBool(obj3);
                self->a_it = new AdjacencyIterator(((BPy_ViewVertex 
*)obj1)->vv, restrictToSelection, restrictToUnvisited);
+        self->at_start = ((BPy_AdjacencyIterator *)obj1)->at_start;
        }
        else {
                PyErr_SetString(PyExc_TypeError, "invalid argument(s)");
@@ -95,15 +100,31 @@ static int AdjacencyIterator_init(BPy_AdjacencyIterator 
*self, PyObject *args, P
        return 0;
 }
 
+static PyObject *AdjacencyIterator_iter(BPy_AdjacencyIterator *self)
+{
+    Py_INCREF(self);
+    self->at_start = true;
+    return (PyObject *) self;
+}
+
 static PyObject *AdjacencyIterator_iternext(BPy_AdjacencyIterator *self)
 {
        if (self->a_it->isEnd()) {
                PyErr_SetNone(PyExc_StopIteration);
                return NULL;
        }
-       ViewEdge *ve = self->a_it->operator*();
-       self->a_it->increment();
-       return BPy_ViewEdge_from_ViewEdge(*ve);
+
+    if (self->at_start)
+        self->at_start = false;
+    else {
+        self->a_it->increment();
+        if (self->a_it->isEnd()){
+            PyErr_SetNone(PyExc_StopIteration);
+            return NULL;
+        }
+    }
+    ViewEdge *ve = self->a_it->operator->();
+    return BPy_ViewEdge_from_ViewEdge(*ve);
 }
 
 /*----------------------AdjacencyIterator get/setters 
----------------------------*/
@@ -175,7 +196,7 @@ PyTypeObject AdjacencyIterator_Type = {
        0,                              /* tp_clear */
        0,                              /* tp_richcompare */
        0,                              /* tp_weaklistoffset */
-       PyObject_SelfIter,              /* tp_iter */
+    (getiterfunc)AdjacencyIterator_iter, /* tp_iter */
        (iternextfunc)AdjacencyIterator_iternext, /* tp_iternext */
        0,                              /* tp_methods */
        0,                              /* tp_members */
diff --git 
a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h 
b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h
index 3fd1441..d675cdb 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_AdjacencyIterator.h
@@ -45,6 +45,7 @@ extern PyTypeObject AdjacencyIterator_Type;
 typedef struct {
        BPy_Iterator py_it;
        AdjacencyIterator *a_it;
+    bool at_start;
 } BPy_AdjacencyIterator;
 
 
///////////////////////////////////////////////////////////////////////////////////////////
diff --git 
a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp 
b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp
index 3a24626..e6a0180 100644
--- 
a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp
+++ 
b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp
@@ -76,41 +76,66 @@ static int Interface0DIterator_init(BPy_Interface0DIterator 
*self, PyObject *arg
 
        if (PyArg_ParseTupleAndKeywords(args, kwds, "O&", (char **)kwlist_1, 
convert_nested_it, &nested_it)) {
                self->if0D_it = new Interface0DIterator(nested_it->copy());
+        self->at_start = true;
+        self->reversed = false;
        }
        else if (PyErr_Clear(),
                 PyArg_ParseTupleAndKeywords(args, kwds, "O!", (char 
**)kwlist_2, &Interface0DIterator_Type, &brother))
        {
                self->if0D_it = new 
Interface0DIterator(*(((BPy_Interface0DIterator *)brother)->if0D_it));
+        self->at_start = ((BPy_Interface0DIterator *)brother)->at_start;
+        self->reversed = ((BPy_Interface0DIterator *)brother)->reversed;
        }
        else {
                PyErr_SetString(PyExc_TypeError, "invalid argument(s)");
                return -1;
        }
        self->py_it.it = self->if0D_it;
-       self->reversed = 0;
        return 0;
 }
 
-static PyObject *Interface0DIterator_iternext(BPy_Interface0DIterator *self)
+static PyObject *Interface0DIterator_iter(BPy_Interface0DIterator *self)
 {
-       Interface0D *if0D;
+    Py_INCREF(self);
+    self->at_start = true;
+    return (PyObject *) self;
+}
 
+static PyObject *Interface0DIterator_iternext(BPy_Interface0DIterator *self)
+{
        if (self->reversed) {
                if (self->if0D_it->isBegin()) {
                        PyErr_SetNone(PyExc_StopIteration);
                        return NULL;
                }
-               self->if0D_it->decrement();
-               if0D = self->if0D_it->operator->();
+
+        if (self->at_start)
+            self->at_start = false;
+        else {
+            self->if0D_it->decrement();
+            if (self->if0D_it->isBegin()) {
+                PyErr_SetNone(PyExc_StopIteration);
+                return NULL;
+            }
+        }
+
        }
        else {
                if (self->if0D_it->isEnd()) {
                        PyErr_SetNone(PyExc_StopIteration);
                        return NULL;
                }
-               if0D = self->if0D_it->operator->();
-               self->if0D_it->increment();
-       }
+        if (self->at_start)
+            self->at_start = false;
+        else {
+            self->if0D_it->increment();
+            if (self->if0D_it->isEnd()) {
+                PyErr_SetNone(PyExc_StopIteration);
+                return NULL;
+            }
+        }
+    }
+    Interface0D *if0D = self->if0D_it->operator->();
        return Any_BPy_Interface0D_from_Interface0D(*if0D);
 }
 
@@ -186,7 +211,7 @@ PyTypeObject Interface0DIterator_Type = {
        0,                              /* tp_clear */
        0,                              /* tp_richcompare */
        0,                              /* tp_weaklistoffset */
-       PyObject_SelfIter,              /* tp_iter */
+    (getiterfunc)Interface0DIterator_iter, /* tp_iter */
        (iternextfunc)Interface0DIterator_iternext, /* tp_iternext */
        0,                              /* tp_methods */
        0,                              /* tp_members */
diff --git 
a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h 
b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h
index 359e009..afc21c6 100644
--- a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h
+++ b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h
@@ -45,7 +45,8 @@ extern PyTypeObject Interface0DIterator_Type;
 typedef struct {
        BPy_Iterator py_it;
        Interface0DIterator *if0D_it;
-       int reversed;
+    bool reversed;
+    bool at_start;
 } BPy_Interface0DIterator;
 
 
///////////////////////////////////////////////////////////////////////////////////////////
diff --git 
a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp 
b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp
index 8287e28..a284ea2 100644
--- 
a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp
+++ 
b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp
@@ -68,35 +68,68 @@ static int 
StrokeVertexIterator_init(BPy_StrokeVertexIterator *self, PyObject *a
 
        if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O!", (char **)kwlist, 
&StrokeVertexIterator_Type, &brother))
                return -1;
-       if (!brother)
+    if (!brother) {
                self->sv_it = new StrokeInternal::StrokeVertexIterator();
-       else
+        self->reversed = false;
+        self->at_start = true;
+    }
+    else {
                self->sv_it = new 
StrokeInternal::StrokeVertexIterator(*(((BPy_StrokeVertexIterator 
*)brother)->sv_it));
+        self->reversed = ((BPy_StrokeVertexIterator *)brother)->reversed;
+        self->at_start = ((BPy_StrokeVertexIterator *)brother)->at_start;
+    }
        self->py_it.it = self->sv_it;
-       self->reversed = 0;
        return 0;
 }
 
+static PyObject *StrokeVertexIterator_iter(BPy_StrokeVertexIterator *self)
+{
+    Py_INCREF(self);
+    self->at_start = true;
+    return (PyObject *) self;
+}
+
 static PyObject *StrokeVertexIterator_iternext(BPy_StrokeVertexIterator *self)
 {
        StrokeVertex *sv;
 
        if (self->reversed) {
-               if (self->sv_it->isBegin()) {
-                       PyErr_SetNone(PyExc_StopIteration);
-                       return NULL;
-               }
-               self->sv_it->decrement();
-               sv = self->sv_it->operator->();
+        if (self->sv_it->isBegin()) {
+            PyErr_SetNone(PyExc_StopIteration);
+            return NULL;
+        }
+
+        if (self->at_start)
+            self->at_start = false;      
+        else {
+            self->sv_it->increment();
+            if (self->sv_it->isBegin()){
+                PyErr_SetNone(PyExc_StopIteration);
+                return NULL;
+            }
+        }
        }
+
        else {
-               if (self->sv_it->isEnd()) {
-                       PyErr_SetNone(PyExc_StopIteration);
-                       return NULL;
-               }
-               sv = self->sv_it->operator->();
-               self->sv_it->increment();
-       }
+        if (self->sv_it->isEnd()) {
+            PyErr_SetNone(PyExc_StopIteration);
+            return NULL;
+        }
+        /* if at the start of the iterator, only return the object
+         * and don't increment, to keep for-loops in sync */
+        if (self->at_start)
+            self->at_start = false;
+        /* after incrementing, check if the iterator is at its end
+         * exit the loop if it is. not doing so will result in a crash */
+        else {
+            self->sv_it->increment();
+            if (self->sv_it->isEnd()){
+                PyErr_SetNone(PyExc_StopIteration);
+                return NULL;
+            }
+    

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to