From: <bl...@us...> - 2003-04-30 08:06:32
|
Update of /cvsroot/cpptool/rfta/include/xtl/python In directory sc8-pr-cvs1:/tmp/cvs-serv25288/include/xtl/python Added Files: ExposeEnumerator.h Log Message: * added ExposeEnumerator to expose a Enumerato as a python iterator. --- NEW FILE: ExposeEnumerator.h --- #ifndef PYRFTA_EXPOSE_ENUMERATOR_H_INCLUDED #define PYRFTA_EXPOSE_ENUMERATOR_H_INCLUDED #include <boost/python.hpp> #include <xtl/Enumerator.h> namespace Xtl { namespace Python { class ExposeEnumeratorInit { public: ExposeEnumeratorInit() { static Initializer dummy; } static void translate_EnumeratorError( const Xtl::EnumeratorError &e ) { // Use the Python 'C' API to set up an exception object PyErr_SetString( PyExc_StopIteration, e.what() ); } private: class Initializer { public: Initializer() { boost::python::register_exception_translator<Xtl::EnumeratorError>( &translate_EnumeratorError ); } }; }; /** Use this to expose a Xtl::Enumerator to python. * For example, * \code * Xtl::Python::ExposeEnumerator<StatementPtr>( "StatementEnumerator" ); * \endcode * will expose the class Xtl::Enumerator<StatementPtr> to python as a python iterator. */ template<typename EnumeratedType> class ExposeEnumerator : private ExposeEnumeratorInit { public: typedef Xtl::Enumerator<EnumeratedType> WrappedEnumerator; ExposeEnumerator( const char *name ) { boost::python::class_< WrappedEnumerator >( "StatementEnumerator" ) .def( "next", &WrappedEnumerator::getNext ) .def( "__iter__", &Enumerator_iter ) ; } private: static WrappedEnumerator Enumerator_iter( const WrappedEnumerator &enumerator ) { return enumerator; } }; } } // namespace Xtl { namespace Python #endif // PYRFTA_EXPOSE_ENUMERATOR_H_INCLUDED |