All modules now compile again.
[fail.git] / src / blawful / pyawful / pointer.h
blobe30dc4eb9c0d554858c1f440b25b609a4aa2f860
1 #ifndef AWFUL_PYTHON_POINTER_H
2 #define AWFUL_PYTHON_POINTER_H
4 namespace awful { namespace PythonImpl
5 {
6 template< class C > struct TypeConverter< NormalType, Pointer< C > >
8 class PointerConverter : public GenericPointerTable::PointerConverter_i
10 public:
11 virtual void ConvertFromPython_nocheck( PyObject* pPyObj_, GenericPointer& Dest_ )
13 typedef TypeConverter< NormalType, Pointer< C > > tc;
14 Pointer< C > pObj;
15 tc::ConvertFromPython_nocheck( pPyObj_, pObj );
16 Dest_ = 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 ) ),
33 pConverter ) );
35 GenericPointerTable::PointerFromPythonConverters.insert( std::make_pair(
36 &ClassStuff< C >::TypeObject,
37 pConverter ) );
40 static bool CheckType_nothrow( PyObject* pPyObj_ )
42 if( pPyObj_ == Py_None )
43 return true;
45 if( PyObject_TypeCheck( pPyObj_, &ClassStuff< C >::TypeObject ) )
46 return true;
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 )
62 Dest_ = 0;
63 else
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;
70 else
72 // We need to cast.
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 )
89 Py_RETURN_NONE;
91 if( !Ptr_ )
92 Py_RETURN_NONE;
94 PyObject* pPyObj;
96 pPyObj = PyType_GenericAlloc( &ClassStuff< C >::TypeObject, 0 );
97 if( !pPyObj )
98 Py_RETURN_NONE; //throw std::bad_alloc();
102 typedef typename ClassStuff< C >::Wrapper Wrapper;
103 new( pPyObj ) Wrapper( Ptr_ );
104 return pPyObj;
106 catch( const Error::Base& error )
108 error.ConvertToPython();
109 Py_DECREF( pPyObj );
110 return NULL;
116 #endif