Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
Converters.h
Go to the documentation of this file.
1 // @(#)root/pyroot:$Id$
2 // Author: Wim Lavrijsen, Jan 2005
3 #ifndef PYROOT_CONVERTERS_H
4 #define PYROOT_CONVERTERS_H
5 
6 // ROOT
7 #include "TString.h"
8 
9 // Standard
10 #include <limits.h>
11 #include <string>
12 #include <map>
13 
14 
15 namespace PyROOT {
16 
17  class ObjectProxy;
18  struct TParameter;
19  struct TCallContext;
20 
21  class TConverter {
22  public:
23  virtual ~TConverter() {}
24 
25  public:
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 );
29  };
30 
31 #define PYROOT_DECLARE_BASIC_CONVERTER( name ) \
32  class T##name##Converter : public TConverter { \
33  public: \
34  virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );\
35  virtual PyObject* FromMemory( void* ); \
36  virtual Bool_t ToMemory( PyObject*, void* ); \
37  }; \
38  \
39  class TConst##name##RefConverter : public TConverter { \
40  public: \
41  virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );\
42  }
43 
44 
45 #define PYROOT_DECLARE_BASIC_CONVERTER2( name, base ) \
46  class T##name##Converter : public T##base##Converter { \
47  public: \
48  virtual PyObject* FromMemory( void* ); \
49  virtual Bool_t ToMemory( PyObject*, void* ); \
50  }; \
51  \
52  class TConst##name##RefConverter : public TConverter { \
53  public: \
54  virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );\
55  }
56 
57 #define PYROOT_DECLARE_REF_CONVERTER( name ) \
58  class T##name##RefConverter : public TConverter { \
59  public: \
60  virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );\
61  };
62 
63 #define PYROOT_DECLARE_ARRAY_CONVERTER( name ) \
64  class T##name##Converter : public TConverter { \
65  public: \
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* ); \
70  private: \
71  Py_ssize_t fSize; \
72  }; \
73  \
74  class T##name##RefConverter : public T##name##Converter { \
75  public: \
76  using T##name##Converter::T##name##Converter; \
77  virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );\
78  }
79 
80 // converters for built-ins
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 );
95 
96  PYROOT_DECLARE_REF_CONVERTER( Int );
97  PYROOT_DECLARE_REF_CONVERTER( Long );
98  PYROOT_DECLARE_REF_CONVERTER( Double );
99 
100  class TVoidConverter : public TConverter {
101  public:
102  virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
103  };
104 
105  class TCStringConverter : public TConverter {
106  public:
107  TCStringConverter( UInt_t maxSize = UINT_MAX ) : fMaxSize( maxSize ) {}
108 
109  public:
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 );
113 
114  protected:
115  std::string fBuffer;
116  UInt_t fMaxSize;
117  };
118 
119  class TNonConstCStringConverter : public TCStringConverter {
120  public:
121  TNonConstCStringConverter( UInt_t maxSize = UINT_MAX ) : TCStringConverter( maxSize ) {}
122 
123  public:
124  virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
125  virtual PyObject* FromMemory( void* address );
126  };
127 
128  class TNonConstUCStringConverter : public TNonConstCStringConverter {
129  public:
130  TNonConstUCStringConverter( UInt_t maxSize = UINT_MAX ) : TNonConstCStringConverter( maxSize ) {}
131 
132  public:
133  virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
134  };
135 
136 // pointer/array conversions
137  class TVoidArrayConverter : public TConverter {
138  public:
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 );
143 
144  protected:
145  virtual Bool_t GetAddressSpecialCase( PyObject* pyobject, void*& address );
146 
147  protected:
148  Bool_t KeepControl() { return fKeepControl; }
149 
150  private:
151  Bool_t fKeepControl;
152  };
153 
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 );
163 
164  class TLongLongArrayConverter : public TVoidArrayConverter {
165  public:
166  virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
167  };
168 
169 // converters for special cases
170  class TCppObjectConverter : public TVoidArrayConverter {
171  public:
172  TCppObjectConverter( Cppyy::TCppType_t klass, Bool_t keepControl = kFALSE ) :
173  TVoidArrayConverter( keepControl ), fClass( klass ), fObjProxy(nullptr) {}
174 
175  public:
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 );
179 
180  protected:
181  Cppyy::TCppType_t fClass;
182  ObjectProxy* fObjProxy;
183  };
184 
185  class TStrictCppObjectConverter : public TCppObjectConverter {
186  public:
187  using TCppObjectConverter::TCppObjectConverter;
188 
189  protected:
190  virtual Bool_t GetAddressSpecialCase( PyObject*, void*& ) { return kFALSE; }
191  };
192 
193  class TValueCppObjectConverter : public TStrictCppObjectConverter {
194  public:
195  using TStrictCppObjectConverter::TStrictCppObjectConverter;
196 
197  public:
198  virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
199  };
200 
201  class TRefCppObjectConverter : public TConverter {
202  public:
203  TRefCppObjectConverter( Cppyy::TCppType_t klass ) : fClass( klass ), fObjProxy(nullptr) {}
204 
205  public:
206  virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
207 
208  protected:
209  Cppyy::TCppType_t fClass;
210  ObjectProxy* fObjProxy;
211  };
212 
213  template <bool ISREFERENCE>
214  class TCppObjectPtrConverter : public TCppObjectConverter {
215  public:
216  using TCppObjectConverter::TCppObjectConverter;
217 
218  public:
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 );
222  };
223 
224  extern template class TCppObjectPtrConverter<true>;
225  extern template class TCppObjectPtrConverter<false>;
226 
227  class TCppObjectArrayConverter : public TCppObjectConverter {
228  public:
229  TCppObjectArrayConverter( Cppyy::TCppType_t klass, size_t size, Bool_t keepControl = kFALSE ) :
230  TCppObjectConverter( klass, keepControl ), m_size( size ) {}
231 
232  public:
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 );
236 
237  protected:
238  size_t m_size;
239  };
240 
241 // CLING WORKAROUND -- classes for STL iterators are completely undefined in that
242 // they come in a bazillion different guises, so just do whatever
243  class TSTLIteratorConverter : public TConverter {
244  public:
245  virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
246  };
247 // -- END CLING WORKAROUND
248 
249  class TVoidPtrRefConverter : public TConverter {
250  public:
251  virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
252  };
253 
254  class TVoidPtrPtrConverter : public TConverter {
255  public:
256  virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
257  virtual PyObject* FromMemory( void* address );
258  };
259 
260  PYROOT_DECLARE_BASIC_CONVERTER( PyObject );
261 
262 #define PYROOT_DECLARE_STRING_CONVERTER( name, strtype ) \
263  class T##name##Converter : public TCppObjectConverter { \
264  public: \
265  T##name##Converter( Bool_t keepControl = kTRUE ); \
266  public: \
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 ); \
270  private: \
271  strtype fBuffer; \
272  }
273 
274  PYROOT_DECLARE_STRING_CONVERTER( TString, TString );
275  PYROOT_DECLARE_STRING_CONVERTER( STLString, std::string );
276  PYROOT_DECLARE_STRING_CONVERTER( STLStringView, std::string_view );
277 
278  class TNotImplementedConverter : public TConverter {
279  public:
280  virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* = 0 );
281  };
282 
283 // smart pointer converter
284  class TSmartPtrCppObjectConverter : public TConverter {
285  public:
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 ) {}
293 
294  public:
295  virtual Bool_t SetArg( PyObject*, TParameter&, TCallContext* ctxt = 0 );
296  virtual PyObject* FromMemory( void* address );
297  //virtual Bool_t ToMemory( PyObject* value, void* address );
298 
299  protected:
300  virtual Bool_t GetAddressSpecialCase( PyObject*, void*& ) { return kFALSE; }
301 
302  Cppyy::TCppType_t fClass;
303  Cppyy::TCppType_t fRawPtrType;
304  Cppyy::TCppMethod_t fDereferencer;
305  Bool_t fKeepControl;
306  Bool_t fHandlePtr;
307  };
308 
309 // create converter from fully qualified type
310  TConverter* CreateConverter( const std::string& fullType, Long_t size = -1 );
311 
312 } // namespace PyROOT
313 
314 #endif // !PYROOT_CONVERTERS_H