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
|