soc-2008-mxcurioni: added Iterator class, base class for all iterators in Freestyle (on the C++ side). Created the equivalent in Python BPy_Iterator with the simple interface:

- getExactTypeName()
- increment()
- decrement()
- isBegin()
- isEnd()

Contrary to previously stated, I am reverting back to implementing iterators in the (Python) API, for different reasons:
- it will make testing quicker to achieve, as I won't have to recode a big chunk of the original Python files
- it will be a base for API refactoring
- it won't prevent the use a list-based approach later (it is simple to get it from the Iterator)
This commit is contained in:
Maxime Curioni
2008-07-23 10:19:08 +00:00
parent a9789d90ae
commit d1b82d1f15
13 changed files with 7915 additions and 8768 deletions

View File

@@ -74,6 +74,7 @@ python_sources = [
prefix + '/BPy_Interface1D.cpp',
prefix + '/Interface1D/BPy_FEdge.cpp',
prefix + '/Interface1D/BPy_Stroke.cpp',
prefix + '/BPy_Iterator.cpp',
prefix + '/BPy_MediumType.cpp',
prefix + '/BPy_Nature.cpp',
prefix + '/BPy_StrokeAttribute.cpp',

View File

@@ -5,6 +5,7 @@
#include "BPy_Id.h"
#include "BPy_IntegrationType.h"
#include "BPy_Interface0D.h"
#include "BPy_Iterator.h"
#include "Interface0D/BPy_CurvePoint.h"
#include "BPy_Interface1D.h"
#include "BPy_MediumType.h"
@@ -142,6 +143,7 @@ PyObject *Freestyle_Init( void )
IntegrationType_Init( module );
Interface0D_Init( module );
Interface1D_Init( module );
Iterator_Init( module );
StrokeAttribute_Init( module );
StrokeShader_Init( module );
UnaryFunction0D_Init( module );

View File

@@ -0,0 +1,176 @@
#include "BPy_Iterator.h"
#include "BPy_Convert.h"
#ifdef __cplusplus
extern "C" {
#endif
///////////////////////////////////////////////////////////////////////////////////////////
/*--------------- Python API function prototypes for Iterator instance -----------*/
static void Iterator___dealloc__(BPy_Iterator *self);
static PyObject * Iterator___repr__(BPy_Iterator* self);
static PyObject * Iterator_getExactTypeName(BPy_Iterator* self);
static PyObject * Iterator_increment(BPy_Iterator* self);
static PyObject * Iterator_decrement(BPy_Iterator* self);
static PyObject * Iterator_isBegin(BPy_Iterator* self);
static PyObject * Iterator_isEnd(BPy_Iterator* self);
/*----------------------Iterator instance definitions ----------------------------*/
static PyMethodDef BPy_Iterator_methods[] = {
{"getExactTypeName", ( PyCFunction ) Iterator_getExactTypeName, METH_NOARGS, " Returns the string of the name of the iterator."},
{"increment", ( PyCFunction ) Iterator_increment, METH_NOARGS, " Increments iterator."},
{"decrement", ( PyCFunction ) Iterator_decrement, METH_NOARGS, " Decrements iterator."},
{"isBegin", ( PyCFunction ) Iterator_isBegin, METH_NOARGS, " Tests if iterator points to beginning."},
{"isEnd", ( PyCFunction ) Iterator_isEnd, METH_NOARGS, " Tests if iterator points to end."},
{NULL, NULL, 0, NULL}
};
/*-----------------------BPy_Iterator type definition ------------------------------*/
PyTypeObject Iterator_Type = {
PyObject_HEAD_INIT( NULL )
0, /* ob_size */
"Iterator", /* tp_name */
sizeof( BPy_Iterator ), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
(destructor)Iterator___dealloc__, /* tp_dealloc */
NULL, /* printfunc tp_print; */
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
NULL, /* tp_compare */
(reprfunc)Iterator___repr__, /* tp_repr */
/* Method suites for standard classes */
NULL, /* PyNumberMethods *tp_as_number; */
NULL, /* PySequenceMethods *tp_as_sequence; */
NULL, /* PyMappingMethods *tp_as_mapping; */
/* More standard operations (here for binary compatibility) */
NULL, /* hashfunc tp_hash; */
NULL, /* ternaryfunc tp_call; */
NULL, /* reprfunc tp_str; */
NULL, /* getattrofunc tp_getattro; */
NULL, /* setattrofunc tp_setattro; */
/* Functions to access object as input/output buffer */
NULL, /* PyBufferProcs *tp_as_buffer; */
/*** Flags to define presence of optional/expanded features ***/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* long tp_flags; */
NULL, /* char *tp_doc; Documentation string */
/*** Assigned meaning in release 2.0 ***/
/* call function for all accessible objects */
NULL, /* traverseproc tp_traverse; */
/* delete references to contained objects */
NULL, /* inquiry tp_clear; */
/*** Assigned meaning in release 2.1 ***/
/*** rich comparisons ***/
NULL, /* richcmpfunc tp_richcompare; */
/*** weak reference enabler ***/
0, /* long tp_weaklistoffset; */
/*** Added in release 2.2 ***/
/* Iterators */
NULL, /* getiterfunc tp_iter; */
NULL, /* iternextfunc tp_iternext; */
/*** Attribute descriptor and subclassing stuff ***/
BPy_Iterator_methods, /* struct PyMethodDef *tp_methods; */
NULL, /* struct PyMemberDef *tp_members; */
NULL, /* struct PyGetSetDef *tp_getset; */
NULL, /* struct _typeobject *tp_base; */
NULL, /* PyObject *tp_dict; */
NULL, /* descrgetfunc tp_descr_get; */
NULL, /* descrsetfunc tp_descr_set; */
0, /* long tp_dictoffset; */
NULL, /* initproc tp_init; */
NULL, /* allocfunc tp_alloc; */
PyType_GenericNew, /* newfunc tp_new; */
/* Low-level free-memory routine */
NULL, /* freefunc tp_free; */
/* For PyObject_IS_GC */
NULL, /* inquiry tp_is_gc; */
NULL, /* PyObject *tp_bases; */
/* method resolution order */
NULL, /* PyObject *tp_mro; */
NULL, /* PyObject *tp_cache; */
NULL, /* PyObject *tp_subclasses; */
NULL, /* PyObject *tp_weaklist; */
NULL
};
//-------------------MODULE INITIALIZATION--------------------------------
PyMODINIT_FUNC Iterator_Init( PyObject *module )
{
if( module == NULL )
return;
if( PyType_Ready( &Iterator_Type ) < 0 )
return;
Py_INCREF( &Iterator_Type );
PyModule_AddObject(module, "Iterator", (PyObject *)&Iterator_Type);
}
//------------------------INSTANCE METHODS ----------------------------------
void Iterator___dealloc__(BPy_Iterator* self)
{
delete self->it;
self->ob_type->tp_free((PyObject*)self);
}
PyObject * Iterator___repr__(BPy_Iterator* self)
{
return PyString_FromFormat("type: %s - address: %p", self->it->getExactTypeName().c_str(), self->it );
}
PyObject * Iterator_getExactTypeName(BPy_Iterator* self) {
return PyString_FromString( self->it->getExactTypeName().c_str() );
}
PyObject * Iterator_increment(BPy_Iterator* self) {
self->it->increment();
Py_RETURN_NONE;
}
PyObject * Iterator_decrement(BPy_Iterator* self) {
self->it->decrement();
Py_RETURN_NONE;
}
PyObject * Iterator_isBegin(BPy_Iterator* self) {
return PyBool_from_bool( self->it->isBegin() );
}
PyObject * Iterator_isEnd(BPy_Iterator* self) {
return PyBool_from_bool( self->it->isEnd() );
}
///////////////////////////////////////////////////////////////////////////////////////////
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,35 @@
#ifndef FREESTYLE_PYTHON_ITERATOR_H
#define FREESTYLE_PYTHON_ITERATOR_H
#include "../system/Iterator.h"
#ifdef __cplusplus
extern "C" {
#endif
///////////////////////////////////////////////////////////////////////////////////////////
#include <Python.h>
extern PyTypeObject Iterator_Type;
#define BPy_Iterator_Check(v) (( (PyObject *) v)->ob_type == &Iterator_Type)
/*---------------------------Python BPy_Iterator structure definition----------*/
typedef struct {
PyObject_HEAD
Iterator *it;
} BPy_Iterator;
/*---------------------------Python BPy_Iterator visible prototypes-----------*/
PyMODINIT_FUNC Iterator_Init( PyObject *module );
///////////////////////////////////////////////////////////////////////////////////////////
#ifdef __cplusplus
}
#endif
#endif /* FREESTYLE_PYTHON_ITERATOR_H */

View File

@@ -34,13 +34,15 @@
# include "../view_map/ViewMapAdvancedIterators.h"
# include "Predicates1D.h"
#include "../system/Iterator.h" //soc
//using namespace ViewEdgeInternal;
//
// Adjacency iterator used in the chaining process
//
///////////////////////////////////////////////////////////
class LIB_STROKE_EXPORT AdjacencyIterator{
class LIB_STROKE_EXPORT AdjacencyIterator : Iterator {
protected:
ViewVertexInternal::orientedViewEdgeIterator _internalIterator;
bool _restrictToSelection;
@@ -71,10 +73,10 @@ public:
virtual ~AdjacencyIterator(){
}
inline bool isEnd(){
virtual inline bool isEnd(){
return _internalIterator.isEnd();
}
inline bool isBegin(){
virtual inline bool isBegin(){
return _internalIterator.isBegin();
}
/*! Returns true if the current ViewEdge is is coming
@@ -94,8 +96,8 @@ public:
increment();
return tmp;
}
void increment();
virtual void increment();
protected:
bool isValid(ViewEdge* edge);
};

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
* Version 1.3.31
* Version 1.3.35
*
* This file is not intended to be easily readable and contains a number of
* coding conventions designed to improve portability and efficiency. Do not make
@@ -73,7 +73,7 @@ private:
};
class SwigDirector_UnaryFunction0DVoid : public UnaryFunction0D<void >, public Swig::Director {
class SwigDirector_UnaryFunction0DVoid : public UnaryFunction0D< void >, public Swig::Director {
public:
SwigDirector_UnaryFunction0DVoid(PyObject *self);
@@ -119,7 +119,7 @@ private:
};
class SwigDirector_UnaryFunction0DUnsigned : public UnaryFunction0D<unsigned int >, public Swig::Director {
class SwigDirector_UnaryFunction0DUnsigned : public UnaryFunction0D< unsigned int >, public Swig::Director {
public:
SwigDirector_UnaryFunction0DUnsigned(PyObject *self);
@@ -165,7 +165,7 @@ private:
};
class SwigDirector_UnaryFunction0DFloat : public UnaryFunction0D<float >, public Swig::Director {
class SwigDirector_UnaryFunction0DFloat : public UnaryFunction0D< float >, public Swig::Director {
public:
SwigDirector_UnaryFunction0DFloat(PyObject *self);
@@ -211,7 +211,7 @@ private:
};
class SwigDirector_UnaryFunction0DDouble : public UnaryFunction0D<double >, public Swig::Director {
class SwigDirector_UnaryFunction0DDouble : public UnaryFunction0D< double >, public Swig::Director {
public:
SwigDirector_UnaryFunction0DDouble(PyObject *self);
@@ -257,13 +257,13 @@ private:
};
class SwigDirector_UnaryFunction0DVec2f : public UnaryFunction0D<Geometry::Vec2f >, public Swig::Director {
class SwigDirector_UnaryFunction0DVec2f : public UnaryFunction0D< Geometry::Vec2f >, public Swig::Director {
public:
SwigDirector_UnaryFunction0DVec2f(PyObject *self);
virtual ~SwigDirector_UnaryFunction0DVec2f();
virtual std::string getName() const;
virtual VecMat::Vec2<float > operator ()(Interface0DIterator &iter);
virtual VecMat::Vec2< float > operator ()(Interface0DIterator &iter);
/* Internal Director utilities */
@@ -303,13 +303,13 @@ private:
};
class SwigDirector_UnaryFunction0DVec3f : public UnaryFunction0D<Geometry::Vec3f >, public Swig::Director {
class SwigDirector_UnaryFunction0DVec3f : public UnaryFunction0D< Geometry::Vec3f >, public Swig::Director {
public:
SwigDirector_UnaryFunction0DVec3f(PyObject *self);
virtual ~SwigDirector_UnaryFunction0DVec3f();
virtual std::string getName() const;
virtual VecMat::Vec3<float > operator ()(Interface0DIterator &iter);
virtual VecMat::Vec3< float > operator ()(Interface0DIterator &iter);
/* Internal Director utilities */
@@ -349,7 +349,7 @@ private:
};
class SwigDirector_UnaryFunction0DId : public UnaryFunction0D<Id >, public Swig::Director {
class SwigDirector_UnaryFunction0DId : public UnaryFunction0D< Id >, public Swig::Director {
public:
SwigDirector_UnaryFunction0DId(PyObject *self);
@@ -395,7 +395,7 @@ private:
};
class SwigDirector_UnaryFunction1DVoid : public UnaryFunction1D<void >, public Swig::Director {
class SwigDirector_UnaryFunction1DVoid : public UnaryFunction1D< void >, public Swig::Director {
public:
SwigDirector_UnaryFunction1DVoid(PyObject *self);
@@ -442,7 +442,7 @@ private:
};
class SwigDirector_UnaryFunction1DUnsigned : public UnaryFunction1D<unsigned int >, public Swig::Director {
class SwigDirector_UnaryFunction1DUnsigned : public UnaryFunction1D< unsigned int >, public Swig::Director {
public:
SwigDirector_UnaryFunction1DUnsigned(PyObject *self);
@@ -489,7 +489,7 @@ private:
};
class SwigDirector_UnaryFunction1DFloat : public UnaryFunction1D<float >, public Swig::Director {
class SwigDirector_UnaryFunction1DFloat : public UnaryFunction1D< float >, public Swig::Director {
public:
SwigDirector_UnaryFunction1DFloat(PyObject *self);
@@ -536,7 +536,7 @@ private:
};
class SwigDirector_UnaryFunction1DDouble : public UnaryFunction1D<double >, public Swig::Director {
class SwigDirector_UnaryFunction1DDouble : public UnaryFunction1D< double >, public Swig::Director {
public:
SwigDirector_UnaryFunction1DDouble(PyObject *self);
@@ -583,14 +583,14 @@ private:
};
class SwigDirector_UnaryFunction1DVec2f : public UnaryFunction1D<Geometry::Vec2f >, public Swig::Director {
class SwigDirector_UnaryFunction1DVec2f : public UnaryFunction1D< Geometry::Vec2f >, public Swig::Director {
public:
SwigDirector_UnaryFunction1DVec2f(PyObject *self);
SwigDirector_UnaryFunction1DVec2f(PyObject *self, IntegrationType iType);
virtual ~SwigDirector_UnaryFunction1DVec2f();
virtual std::string getName() const;
virtual VecMat::Vec2<float > operator ()(Interface1D &inter);
virtual VecMat::Vec2< float > operator ()(Interface1D &inter);
/* Internal Director utilities */
@@ -630,14 +630,14 @@ private:
};
class SwigDirector_UnaryFunction1DVec3f : public UnaryFunction1D<Geometry::Vec3f >, public Swig::Director {
class SwigDirector_UnaryFunction1DVec3f : public UnaryFunction1D< Geometry::Vec3f >, public Swig::Director {
public:
SwigDirector_UnaryFunction1DVec3f(PyObject *self);
SwigDirector_UnaryFunction1DVec3f(PyObject *self, IntegrationType iType);
virtual ~SwigDirector_UnaryFunction1DVec3f();
virtual std::string getName() const;
virtual VecMat::Vec3<float > operator ()(Interface1D &inter);
virtual VecMat::Vec3< float > operator ()(Interface1D &inter);
/* Internal Director utilities */

View File

@@ -0,0 +1 @@
#include "Iterator.h"

View File

@@ -0,0 +1,38 @@
#ifndef ITERATOR_H
#define ITERATOR_H
#include <iostream>
#include <string>
using namespace std;
class Iterator
{
public:
virtual ~Iterator() {}
virtual string getExactTypeName() const {
return "Iterator";
}
virtual void increment() {
cerr << "Warning: method increment() not implemented" << endl;
}
virtual void decrement() {
cerr << "Warning: method decrement() not implemented" << endl;
}
virtual bool isBegin() const {
cerr << "Warning: method isBegin() not implemented" << endl;
return false;
}
virtual bool isEnd() const {
cerr << "Warning: method isEnd() not implemented" << endl;
return false;
}
};
#endif // ITERATOR_H

View File

@@ -38,6 +38,9 @@
# include "../geometry/Geom.h"
using namespace std;
#include "../system/Iterator.h" //soc
//
// Interface0D
//
@@ -160,7 +163,7 @@ public:
//
//////////////////////////////////////////////////
class Interface0DIteratorNested
class Interface0DIteratorNested : Iterator
{
public:

View File

@@ -32,7 +32,7 @@
# define VIEWMAPADVANCEDITERATORS_H
#include "ViewMap.h"
#include "../system/Iterator.h" //soc
/**********************************/
/* */

View File

@@ -32,6 +32,8 @@
# define VIEWMAPITERATORS_H
#include "ViewMap.h"
#include "../system/Iterator.h" //soc
/**********************************/
/* */
@@ -57,7 +59,7 @@ namespace ViewVertexInternal{
* An instance of an orientedViewEdgeIterator can only
* be obtained from a ViewVertex by calling edgesBegin() or edgesEnd().
*/
class orientedViewEdgeIterator
class orientedViewEdgeIterator : Iterator
{
public:
friend class ViewVertex;
@@ -204,7 +206,7 @@ namespace ViewVertexInternal{
public:
/*! increments.*/
inline void increment()
virtual inline void increment()
{
if(_Nature & Nature::T_VERTEX)
{
@@ -336,11 +338,11 @@ namespace ViewEdgeInternal {
_previous_edge = _previous_edge->previousEdge();
}
bool isBegin() const {
virtual bool isBegin() const {
return _vertex == _begin;
}
bool isEnd() const {
virtual bool isEnd() const {
return (!_vertex) || (_vertex == _begin && _previous_edge);
}
@@ -385,7 +387,7 @@ namespace ViewEdgeInternal {
* ::Caution::: the dereferencing operator returns a *pointer* to
* the pointed ViewEdge.
*/
class ViewEdgeIterator
class ViewEdgeIterator : Iterator
{
public:

View File

@@ -1,5 +1,5 @@
# This file was automatically generated by SWIG (http://www.swig.org).
# Version 1.3.31
# Version 1.3.35
#
# Don't modify this file, modify the SWIG interface instead.
# This file is compatible with both classic and new-style classes.
@@ -60,7 +60,7 @@ class PySwigIterator(_object):
__setattr__ = lambda self, name, value: _swig_setattr(self, PySwigIterator, name, value)
__swig_getmethods__ = {}
__getattr__ = lambda self, name: _swig_getattr(self, PySwigIterator, name)
def __init__(self): raise AttributeError, "No constructor defined"
def __init__(self, *args, **kwargs): raise AttributeError, "No constructor defined"
__repr__ = _swig_repr
__swig_destroy__ = _Freestyle.delete_PySwigIterator
__del__ = lambda self : None;
@@ -718,7 +718,7 @@ class Interface0DIteratorNested(_object):
__setattr__ = lambda self, name, value: _swig_setattr(self, Interface0DIteratorNested, name, value)
__swig_getmethods__ = {}
__getattr__ = lambda self, name: _swig_getattr(self, Interface0DIteratorNested, name)
def __init__(self): raise AttributeError, "No constructor defined"
def __init__(self, *args, **kwargs): raise AttributeError, "No constructor defined"
__repr__ = _swig_repr
__swig_destroy__ = _Freestyle.delete_Interface0DIteratorNested
__del__ = lambda self : None;
@@ -1437,7 +1437,7 @@ class ViewVertex(Interface0D):
__swig_getmethods__ = {}
for _s in [Interface0D]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{}))
__getattr__ = lambda self, name: _swig_getattr(self, ViewVertex, name)
def __init__(self): raise AttributeError, "No constructor defined"
def __init__(self, *args, **kwargs): raise AttributeError, "No constructor defined"
__repr__ = _swig_repr
def getExactTypeName(*args): return _Freestyle.ViewVertex_getExactTypeName(*args)
__swig_setmethods__["userdata"] = _Freestyle.ViewVertex_userdata_set
@@ -4834,7 +4834,7 @@ class Operators(_object):
__setattr__ = lambda self, name, value: _swig_setattr(self, Operators, name, value)
__swig_getmethods__ = {}
__getattr__ = lambda self, name: _swig_getattr(self, Operators, name)
def __init__(self): raise AttributeError, "No constructor defined"
def __init__(self, *args, **kwargs): raise AttributeError, "No constructor defined"
__repr__ = _swig_repr
__swig_getmethods__["select"] = lambda x: _Freestyle.Operators_select
if _newclass:select = staticmethod(_Freestyle.Operators_select)
@@ -4901,7 +4901,7 @@ class Canvas(_object):
__setattr__ = lambda self, name, value: _swig_setattr(self, Canvas, name, value)
__swig_getmethods__ = {}
__getattr__ = lambda self, name: _swig_getattr(self, Canvas, name)
def __init__(self): raise AttributeError, "No constructor defined"
def __init__(self, *args, **kwargs): raise AttributeError, "No constructor defined"
__repr__ = _swig_repr
__swig_getmethods__["getInstance"] = lambda x: _Freestyle.Canvas_getInstance
if _newclass:getInstance = staticmethod(_Freestyle.Canvas_getInstance)