| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #ifndef __CXX_ExtensionModule__h |
| | #define __CXX_ExtensionModule__h |
| |
|
| | namespace Py |
| | { |
| | class PYCXX_EXPORT ExtensionModuleBase |
| | { |
| | public: |
| | ExtensionModuleBase( const char *name ); |
| | virtual ~ExtensionModuleBase(); |
| |
|
| | Module module( void ) const; |
| | Dict moduleDictionary( void ) const; |
| |
|
| | virtual Object invoke_method_noargs( void *method_def ) = 0; |
| | virtual Object invoke_method_keyword( void *method_def, const Tuple &_args, const Dict &_keywords ) = 0; |
| | virtual Object invoke_method_varargs( void *method_def, const Tuple &_args ) = 0; |
| |
|
| | const std::string &name() const; |
| | const std::string &fullName() const; |
| |
|
| | |
| | Object moduleObject( void ) const; |
| |
|
| | protected: |
| | |
| | void initialize( const char *module_doc ); |
| |
|
| | const std::string m_module_name; |
| | const std::string m_full_module_name; |
| | MethodTable m_method_table; |
| | PyModuleDef m_module_def; |
| | PyObject *m_module; |
| |
|
| | private: |
| | |
| | |
| | |
| | ExtensionModuleBase( const ExtensionModuleBase & ); |
| | void operator=( const ExtensionModuleBase & ); |
| | }; |
| |
|
| | |
| | extern "C" PYCXX_EXPORT PyObject *method_noargs_call_handler( PyObject *_self_and_name_tuple, PyObject * ); |
| | extern "C" PYCXX_EXPORT PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ); |
| | extern "C" PYCXX_EXPORT PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ); |
| |
|
| | template<TEMPLATE_TYPENAME T> |
| | class ExtensionModule : public ExtensionModuleBase |
| | { |
| | public: |
| | ExtensionModule( const char *name ) |
| | : ExtensionModuleBase( name ) |
| | {} |
| | virtual ~ExtensionModule() |
| | {} |
| |
|
| | protected: |
| | typedef Object (T::*method_noargs_function_t)(); |
| | typedef Object (T::*method_varargs_function_t)( const Tuple &args ); |
| | typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); |
| | typedef std::map<std::string, MethodDefExt<T> *> method_map_t; |
| |
|
| | static void add_noargs_method( const char *name, method_noargs_function_t function, const char *doc="" ) |
| | { |
| | method_map_t &mm = methods(); |
| | mm[ std::string( name ) ] = new MethodDefExt<T>( name, function, method_noargs_call_handler, doc ); |
| | } |
| |
|
| | static void add_varargs_method( const char *name, method_varargs_function_t function, const char *doc="" ) |
| | { |
| | method_map_t &mm = methods(); |
| | mm[ std::string( name ) ] = new MethodDefExt<T>( name, function, method_varargs_call_handler, doc ); |
| | } |
| |
|
| | static void add_keyword_method( const char *name, method_keyword_function_t function, const char *doc="" ) |
| | { |
| | method_map_t &mm = methods(); |
| | mm[ std::string( name ) ] = new MethodDefExt<T>( name, function, method_keyword_call_handler, doc ); |
| | } |
| |
|
| | void initialize( const char *module_doc="" ) |
| | { |
| | ExtensionModuleBase::initialize( module_doc ); |
| | Dict dict( moduleDictionary() ); |
| |
|
| | |
| | |
| | |
| | |
| | method_map_t &mm = methods(); |
| | EXPLICIT_TYPENAME method_map_t::const_iterator i = mm.begin(); |
| | EXPLICIT_TYPENAME method_map_t::const_iterator i_end = mm.end(); |
| | for ( ; i != i_end; ++i ) |
| | { |
| | MethodDefExt<T> *method_def = (*i).second; |
| |
|
| | static PyObject *self = PyCapsule_New( this, NULL, NULL ); |
| |
|
| | Tuple args( 2 ); |
| | args[0] = Object( self, true ); |
| | args[1] = Object( PyCapsule_New( method_def, NULL, NULL ), true ); |
| |
|
| | assert( m_module != NULL ); |
| | PyObject *func = PyCFunction_NewEx |
| | ( |
| | &method_def->ext_meth_def, |
| | new_reference_to( args ), |
| | m_module |
| | ); |
| |
|
| | method_def->py_method = Object( func, true ); |
| |
|
| | dict[ (*i).first ] = method_def->py_method; |
| | } |
| | } |
| |
|
| | protected: |
| | static method_map_t &methods( void ) |
| | { |
| | static method_map_t *map_of_methods = NULL; |
| | if( map_of_methods == NULL ) |
| | map_of_methods = new method_map_t; |
| |
|
| | return *map_of_methods; |
| | } |
| |
|
| | |
| | virtual Object invoke_method_noargs( void *method_def ) |
| | { |
| | |
| | T *self = static_cast<T *>( this ); |
| | MethodDefExt<T> *meth_def = reinterpret_cast<MethodDefExt<T> *>( method_def ); |
| |
|
| | return (self->*meth_def->ext_noargs_function)(); |
| | } |
| |
|
| | |
| | virtual Object invoke_method_varargs( void *method_def, const Tuple &args ) |
| | { |
| | |
| | T *self = static_cast<T *>( this ); |
| | MethodDefExt<T> *meth_def = reinterpret_cast<MethodDefExt<T> *>( method_def ); |
| |
|
| | return (self->*meth_def->ext_varargs_function)( args ); |
| | } |
| |
|
| | |
| | virtual Object invoke_method_keyword( void *method_def, const Tuple &args, const Dict &keywords ) |
| | { |
| | |
| | T *self = static_cast<T *>( this ); |
| | MethodDefExt<T> *meth_def = reinterpret_cast<MethodDefExt<T> *>( method_def ); |
| |
|
| | return (self->*meth_def->ext_keyword_function)( args, keywords ); |
| | } |
| |
|
| | private: |
| | |
| | |
| | |
| | ExtensionModule( const ExtensionModule<T> & ); |
| | void operator=( const ExtensionModule<T> & ); |
| | }; |
| | } |
| |
|
| |
|
| | |
| | #endif |
| |
|