3 #ifndef PYROOT_CONVERTERS_H
4 #define PYROOT_CONVERTERS_H
23 virtual ~TConverter() {}
26 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 ) = 0;
27 virtual PyObject* FromMemory(
void* address );
28 virtual Bool_t ToMemory( PyObject* value,
void* address );
31 #define PYROOT_DECLARE_BASIC_CONVERTER( name ) \
32 class T##name##Converter : public TConverter { \
34 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );\
35 virtual PyObject* FromMemory( void* ); \
36 virtual Bool_t ToMemory( PyObject*, void* ); \
39 class TConst##name##RefConverter : public TConverter { \
41 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );\
45 #define PYROOT_DECLARE_BASIC_CONVERTER2( name, base ) \
46 class T##name##Converter : public T##base##Converter { \
48 virtual PyObject* FromMemory( void* ); \
49 virtual Bool_t ToMemory( PyObject*, void* ); \
52 class TConst##name##RefConverter : public TConverter { \
54 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );\
57 #define PYROOT_DECLARE_REF_CONVERTER( name ) \
58 class T##name##RefConverter : public TConverter { \
60 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );\
63 #define PYROOT_DECLARE_ARRAY_CONVERTER( name ) \
64 class T##name##Converter : public TConverter { \
66 T##name##Converter( Py_ssize_t size = -1 ) { fSize = size; } \
67 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );\
68 virtual PyObject* FromMemory( void* ); \
69 virtual Bool_t ToMemory( PyObject*, void* ); \
74 class T##name##RefConverter : public T##name##Converter { \
76 using T##name##Converter::T##name##Converter; \
77 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );\
81 PYROOT_DECLARE_BASIC_CONVERTER( Long );
82 PYROOT_DECLARE_BASIC_CONVERTER( Bool );
83 PYROOT_DECLARE_BASIC_CONVERTER( Char );
84 PYROOT_DECLARE_BASIC_CONVERTER( UChar );
85 PYROOT_DECLARE_BASIC_CONVERTER( Short );
86 PYROOT_DECLARE_BASIC_CONVERTER( UShort );
87 PYROOT_DECLARE_BASIC_CONVERTER( Int );
88 PYROOT_DECLARE_BASIC_CONVERTER( ULong );
89 PYROOT_DECLARE_BASIC_CONVERTER2( UInt, ULong );
90 PYROOT_DECLARE_BASIC_CONVERTER( LongLong );
91 PYROOT_DECLARE_BASIC_CONVERTER( ULongLong );
92 PYROOT_DECLARE_BASIC_CONVERTER( Double );
93 PYROOT_DECLARE_BASIC_CONVERTER( Float );
94 PYROOT_DECLARE_BASIC_CONVERTER( LongDouble );
96 PYROOT_DECLARE_REF_CONVERTER( Int );
97 PYROOT_DECLARE_REF_CONVERTER( Long );
98 PYROOT_DECLARE_REF_CONVERTER( Double );
100 class TVoidConverter :
public TConverter {
102 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
105 class TCStringConverter :
public TConverter {
107 TCStringConverter( UInt_t maxSize = UINT_MAX ) : fMaxSize( maxSize ) {}
110 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
111 virtual PyObject* FromMemory(
void* address );
112 virtual Bool_t ToMemory( PyObject* value,
void* address );
119 class TNonConstCStringConverter :
public TCStringConverter {
121 TNonConstCStringConverter( UInt_t maxSize = UINT_MAX ) : TCStringConverter( maxSize ) {}
124 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
125 virtual PyObject* FromMemory(
void* address );
128 class TNonConstUCStringConverter :
public TNonConstCStringConverter {
130 TNonConstUCStringConverter( UInt_t maxSize = UINT_MAX ) : TNonConstCStringConverter( maxSize ) {}
133 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
137 class TVoidArrayConverter :
public TConverter {
139 TVoidArrayConverter( Bool_t keepControl = kTRUE ) { fKeepControl = keepControl; }
140 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
141 virtual PyObject* FromMemory(
void* address );
142 virtual Bool_t ToMemory( PyObject* value,
void* address );
145 virtual Bool_t GetAddressSpecialCase( PyObject* pyobject,
void*& address );
148 Bool_t KeepControl() {
return fKeepControl; }
154 PYROOT_DECLARE_ARRAY_CONVERTER( BoolArray );
155 PYROOT_DECLARE_ARRAY_CONVERTER( ShortArray );
156 PYROOT_DECLARE_ARRAY_CONVERTER( UShortArray );
157 PYROOT_DECLARE_ARRAY_CONVERTER( IntArray );
158 PYROOT_DECLARE_ARRAY_CONVERTER( UIntArray );
159 PYROOT_DECLARE_ARRAY_CONVERTER( LongArray );
160 PYROOT_DECLARE_ARRAY_CONVERTER( ULongArray );
161 PYROOT_DECLARE_ARRAY_CONVERTER( FloatArray );
162 PYROOT_DECLARE_ARRAY_CONVERTER( DoubleArray );
164 class TLongLongArrayConverter :
public TVoidArrayConverter {
166 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
170 class TCppObjectConverter :
public TVoidArrayConverter {
172 TCppObjectConverter( Cppyy::TCppType_t klass, Bool_t keepControl = kFALSE ) :
173 TVoidArrayConverter( keepControl ), fClass( klass ), fObjProxy(nullptr) {}
176 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
177 virtual PyObject* FromMemory(
void* address );
178 virtual Bool_t ToMemory( PyObject* value,
void* address );
181 Cppyy::TCppType_t fClass;
182 ObjectProxy* fObjProxy;
185 class TStrictCppObjectConverter :
public TCppObjectConverter {
187 using TCppObjectConverter::TCppObjectConverter;
190 virtual Bool_t GetAddressSpecialCase( PyObject*,
void*& ) {
return kFALSE; }
193 class TValueCppObjectConverter :
public TStrictCppObjectConverter {
195 using TStrictCppObjectConverter::TStrictCppObjectConverter;
198 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
201 class TRefCppObjectConverter :
public TConverter {
203 TRefCppObjectConverter( Cppyy::TCppType_t klass ) : fClass( klass ), fObjProxy(nullptr) {}
206 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
209 Cppyy::TCppType_t fClass;
210 ObjectProxy* fObjProxy;
213 template <
bool ISREFERENCE>
214 class TCppObjectPtrConverter :
public TCppObjectConverter {
216 using TCppObjectConverter::TCppObjectConverter;
219 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
220 virtual PyObject* FromMemory(
void* address );
221 virtual Bool_t ToMemory( PyObject* value,
void* address );
224 extern template class TCppObjectPtrConverter<true>;
225 extern template class TCppObjectPtrConverter<false>;
227 class TCppObjectArrayConverter :
public TCppObjectConverter {
229 TCppObjectArrayConverter( Cppyy::TCppType_t klass,
size_t size, Bool_t keepControl = kFALSE ) :
230 TCppObjectConverter( klass, keepControl ), m_size( size ) {}
233 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
234 virtual PyObject* FromMemory(
void* address );
235 virtual Bool_t ToMemory( PyObject* value,
void* address );
243 class TSTLIteratorConverter :
public TConverter {
245 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
249 class TVoidPtrRefConverter :
public TConverter {
251 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
254 class TVoidPtrPtrConverter :
public TConverter {
256 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
257 virtual PyObject* FromMemory(
void* address );
260 PYROOT_DECLARE_BASIC_CONVERTER( PyObject );
262 #define PYROOT_DECLARE_STRING_CONVERTER( name, strtype ) \
263 class T##name##Converter : public TCppObjectConverter { \
265 T##name##Converter( Bool_t keepControl = kTRUE ); \
267 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );\
268 virtual PyObject* FromMemory( void* address ); \
269 virtual Bool_t ToMemory( PyObject* value, void* address ); \
274 PYROOT_DECLARE_STRING_CONVERTER( TString, TString );
275 PYROOT_DECLARE_STRING_CONVERTER( STLString, std::string );
276 PYROOT_DECLARE_STRING_CONVERTER( STLStringView, std::string_view );
278 class TNotImplementedConverter :
public TConverter {
280 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* = 0 );
284 class TSmartPtrCppObjectConverter :
public TConverter {
286 TSmartPtrCppObjectConverter( Cppyy::TCppType_t klass,
287 Cppyy::TCppType_t rawPtrType,
288 Cppyy::TCppMethod_t deref,
289 Bool_t keepControl = kFALSE,
290 Bool_t handlePtr = kFALSE )
291 : fClass( klass ), fRawPtrType( rawPtrType ), fDereferencer( deref ),
292 fKeepControl( keepControl ), fHandlePtr( handlePtr ) {}
295 virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
296 virtual PyObject* FromMemory(
void* address );
300 virtual Bool_t GetAddressSpecialCase( PyObject*,
void*& ) {
return kFALSE; }
302 Cppyy::TCppType_t fClass;
303 Cppyy::TCppType_t fRawPtrType;
304 Cppyy::TCppMethod_t fDereferencer;
310 TConverter* CreateConverter(
const std::string& fullType, Long_t size = -1 );
314 #endif // !PYROOT_CONVERTERS_H