1 #ifndef AWFUL_PYTHON_POINTER_H
2 #define AWFUL_PYTHON_POINTER_H
4 namespace awful
{ namespace PythonImpl
6 template< class C
> struct TypeConverter
< NormalType
, Pointer
< C
> >
8 class PointerConverter
: public GenericPointerTable::PointerConverter_i
11 virtual void ConvertFromPython_nocheck( PyObject
* pPyObj_
, GenericPointer
& Dest_
)
13 typedef TypeConverter
< NormalType
, Pointer
< C
> > tc
;
15 tc::ConvertFromPython_nocheck( pPyObj_
, pObj
);
19 virtual PyObject
* ConvertToPython( const GenericPointer
& Ptr_
)
21 typedef TypeConverter
< NormalType
, Pointer
< C
> > tc
;
22 Pointer
< C
> pObj
= static_cast< C
* >( Ptr_
);
23 return tc::ConvertToPython( pObj
);
27 static void RegisterPointerConversion()
29 Pointer
< PointerConverter
> pConverter
= new PointerConverter
;
31 GenericPointerTable::PointerToPythonConverters
.insert( std::make_pair(
32 TypeInfoKey( typeid( C
) ),
35 GenericPointerTable::PointerFromPythonConverters
.insert( std::make_pair(
36 &ClassStuff
< C
>::TypeObject
,
40 static bool CheckType_nothrow( PyObject
* pPyObj_
)
42 if( pPyObj_
== Py_None
)
45 if( PyObject_TypeCheck( pPyObj_
, &ClassStuff
< C
>::TypeObject
) )
48 const PyTypeObject
* pTypeObject
= pPyObj_
->ob_type
;
49 typename ClassStuff
< C
>::Wrapper
* pWrapper
=
50 static_cast< typename ClassStuff
< C
>::Wrapper
* >( pPyObj_
);
52 // This should be kept around to be reused by convertfrompython.
53 TypeCastMap::const_iterator it
= pWrapper
->pTypeCastMap
->find( &ClassStuff
< C
>::TypeObject
);
54 return it
!= pWrapper
->pTypeCastMap
->end();
56 // if( PyObject_TypeCheck( pPyObj_, &ClassStuff< C >::TypeObject ) || pPyObj_ == Py_None;
59 static void ConvertFromPython_nocheck( PyObject
* pPyObj_
, Pointer
< C
>& Dest_
)
61 if( pPyObj_
== Py_None
)
65 typename ClassStuff
< C
>::Wrapper
* pWrapper
=
66 static_cast< typename ClassStuff
< C
>::Wrapper
* >( pPyObj_
);
68 if( PyObject_TypeCheck( pPyObj_
, &ClassStuff
< C
>::TypeObject
) )
69 Dest_
= pWrapper
->pObj
;
73 TypeCastMap::const_iterator it
= pWrapper
->pTypeCastMap
->find( &ClassStuff
< C
>::TypeObject
);
74 Dest_
= static_cast< C
* >( it
->second( &pWrapper
->pObj
) );
79 static void ConvertFromPython( PyObject
* pPyObj_
, Pointer
< C
>& Dest_
)
81 if( !CheckType_nothrow( pPyObj_
) )
82 throw Error::TypeMismatch();
83 ConvertFromPython_nocheck( pPyObj_
, Dest_
);
86 static PyObject
* ConvertToPython( const Pointer
< C
>& Ptr_
)
88 if( !flags::Scriptable
< C
>::value
)
96 pPyObj
= PyType_GenericAlloc( &ClassStuff
< C
>::TypeObject
, 0 );
98 Py_RETURN_NONE
; //throw std::bad_alloc();
102 typedef typename ClassStuff
< C
>::Wrapper Wrapper
;
103 new( pPyObj
) Wrapper( Ptr_
);
106 catch( const Error::Base
& error
)
108 error
.ConvertToPython();