Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
DeclareConverters.h
Go to the documentation of this file.
1#ifndef CPYCPPYY_DECLARECONVERTERS_H
2#define CPYCPPYY_DECLARECONVERTERS_H
3
4// Bindings
5#include "Converters.h"
6#include "Dimensions.h"
7
8// Standard
9#include <complex>
10#include <string>
11
12
13namespace CPyCppyy {
14
15namespace {
16
17#define CPPYY_DECLARE_BASIC_CONVERTER(name) \
18class name##Converter : public Converter { \
19public: \
20 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
21 PyObject* FromMemory(void*) override; \
22 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override; \
23}; \
24 \
25class Const##name##RefConverter : public Converter { \
26public: \
27 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
28 PyObject* FromMemory(void*) override; \
29}
30
31
32#define CPPYY_DECLARE_BASIC_CONVERTER2(name, base) \
33class name##Converter : public base##Converter { \
34public: \
35 PyObject* FromMemory(void*) override; \
36 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override; \
37}; \
38 \
39class Const##name##RefConverter : public Converter { \
40public: \
41 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
42 PyObject* FromMemory(void*) override; \
43}
44
45#define CPPYY_DECLARE_REFCONVERTER(name) \
46class name##RefConverter : public Converter { \
47public: \
48 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
49 PyObject* FromMemory(void*) override; \
50};
51
52#define CPPYY_DECLARE_ARRAY_CONVERTER(name) \
53class name##ArrayConverter : public Converter { \
54public: \
55 name##ArrayConverter(cdims_t dims); \
56 name##ArrayConverter(const name##ArrayConverter&) = delete; \
57 name##ArrayConverter& operator=(const name##ArrayConverter&) = delete; \
58 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
59 PyObject* FromMemory(void*) override; \
60 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override; \
61 bool HasState() override { return true; } \
62protected: \
63 dims_t fShape; \
64 bool fIsFixed; \
65};
66
67
68// converters for built-ins
72class SCharAsIntConverter : public CharConverter {
73public:
74 using CharConverter::CharConverter;
75 PyObject* FromMemory(void*) override;
76};
78class UCharAsIntConverter : public UCharConverter {
79public:
80 using UCharConverter::UCharConverter;
81 PyObject* FromMemory(void*) override;
82};
102
127
128class VoidConverter : public Converter {
129public:
130 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
131};
132
133class CStringConverter : public Converter {
134public:
135 CStringConverter(std::string::size_type maxSize = std::string::npos) : fMaxSize(maxSize) {}
136
137public:
138 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
139 PyObject* FromMemory(void* address) override;
140 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
141 bool HasState() override { return true; }
142
143protected:
144 std::string fBuffer;
145 std::string::size_type fMaxSize;
146};
147
148class NonConstCStringConverter : public CStringConverter {
149public:
150 using CStringConverter::CStringConverter;
151
152public:
153 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
154 PyObject* FromMemory(void* address) override;
155};
156
157class WCStringConverter : public Converter {
158public:
159 WCStringConverter(std::wstring::size_type maxSize = std::wstring::npos) :
160 fBuffer(nullptr), fMaxSize(maxSize) {}
161 WCStringConverter(const WCStringConverter&) = delete;
162 WCStringConverter& operator=(const WCStringConverter&) = delete;
163 virtual ~WCStringConverter() { free(fBuffer); }
164
165public:
166 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
167 PyObject* FromMemory(void* address) override;
168 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
169 bool HasState() override { return true; }
170
171protected:
172 wchar_t* fBuffer;
173 std::wstring::size_type fMaxSize;
174};
175
176class CString16Converter : public Converter {
177public:
178 CString16Converter(std::wstring::size_type maxSize = std::wstring::npos) :
179 fBuffer(nullptr), fMaxSize(maxSize) {}
180 CString16Converter(const CString16Converter&) = delete;
181 CString16Converter& operator=(const CString16Converter&) = delete;
182 virtual ~CString16Converter() { free(fBuffer); }
183
184public:
185 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
186 PyObject* FromMemory(void* address) override;
187 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
188 bool HasState() override { return true; }
189
190protected:
191 char16_t* fBuffer;
192 std::wstring::size_type fMaxSize;
193};
194
195class CString32Converter : public Converter {
196public:
197 CString32Converter(std::wstring::size_type maxSize = std::wstring::npos) :
198 fBuffer(nullptr), fMaxSize(maxSize) {}
199 CString32Converter(const CString32Converter&) = delete;
200 CString32Converter& operator=(const CString32Converter&) = delete;
201 virtual ~CString32Converter() { free(fBuffer); }
202
203public:
204 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
205 PyObject* FromMemory(void* address) override;
206 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
207 bool HasState() override { return true; }
208
209protected:
210 char32_t* fBuffer;
211 std::wstring::size_type fMaxSize;
212};
213
214// pointer/array conversions
218#if (__cplusplus > 201402L) || (defined(_MSC_VER) && _MSVC_LANG > 201402L)
220#endif
240
241class CStringArrayConverter : public SCharArrayConverter {
242public:
243 CStringArrayConverter(cdims_t dims, bool fixed) : SCharArrayConverter(dims) {
244 fIsFixed = fixed; // overrides SCharArrayConverter decision
245 }
246 using SCharArrayConverter::SCharArrayConverter;
247 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
248 PyObject* FromMemory(void* address) override;
249 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override;
250
251private:
252 std::vector<const char*> fBuffer;
253};
254
255class NonConstCStringArrayConverter : public CStringArrayConverter {
256public:
257 using CStringArrayConverter::CStringArrayConverter;
258 PyObject* FromMemory(void* address) override;
259};
260
261// converters for special cases
262class NullptrConverter : public Converter {
263public:
264 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
265};
266
267class InstanceConverter : public StrictInstancePtrConverter {
268public:
269 using StrictInstancePtrConverter::StrictInstancePtrConverter;
270 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
271 PyObject* FromMemory(void*) override;
272 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override;
273};
274
275class InstanceRefConverter : public Converter {
276public:
277 InstanceRefConverter(Cppyy::TCppType_t klass, bool isConst) :
279
280public:
281 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
282 PyObject* FromMemory(void* address) override;
283 bool HasState() override { return true; }
284
285protected:
288};
289
290class InstanceMoveConverter : public InstanceRefConverter {
291public:
292 InstanceMoveConverter(Cppyy::TCppType_t klass) : InstanceRefConverter(klass, true) {}
293 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
294};
295
296template <bool ISREFERENCE>
297class InstancePtrPtrConverter : public InstancePtrConverter<false> {
298public:
300
301public:
302 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
303 PyObject* FromMemory(void* address) override;
304 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
305};
306
307class InstanceArrayConverter : public InstancePtrConverter<false> {
308public:
309 InstanceArrayConverter(Cppyy::TCppType_t klass, cdims_t dims, bool keepControl = false) :
310 InstancePtrConverter<false>(klass, keepControl), fShape(dims) { }
311 InstanceArrayConverter(const InstanceArrayConverter&) = delete;
312 InstanceArrayConverter& operator=(const InstanceArrayConverter&) = delete;
313
314public:
315 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
316 PyObject* FromMemory(void* address) override;
317 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
318
319protected:
321};
322
323
324class ComplexDConverter: public InstanceConverter {
325public:
326 ComplexDConverter(bool keepControl = false);
327
328public:
329 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
330 PyObject* FromMemory(void* address) override;
331 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
332 bool HasState() override { return true; }
333
334private:
335 std::complex<double> fBuffer;
336};
337
338
339// CLING WORKAROUND -- classes for STL iterators are completely undefined in that
340// they come in a bazillion different guises, so just do whatever
341class STLIteratorConverter : public Converter {
342public:
343 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
344};
345// -- END CLING WORKAROUND
346
347
348class VoidPtrRefConverter : public Converter {
349public:
350 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
351};
352
353class VoidPtrPtrConverter : public Converter {
354public:
355 VoidPtrPtrConverter(cdims_t dims);
356
357public:
358 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
359 PyObject* FromMemory(void* address) override;
360 bool HasState() override { return true; }
361
362protected:
364 bool fIsFixed;
365};
366
368
369
370#define CPPYY_DECLARE_STRING_CONVERTER(name, strtype) \
371class name##Converter : public InstanceConverter { \
372public: \
373 name##Converter(bool keepControl = true); \
374 \
375public: \
376 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
377 PyObject* FromMemory(void* address) override; \
378 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override; \
379 bool HasState() override { return true; } \
380 \
381protected: \
382 strtype fBuffer; \
383}
384
387#if (__cplusplus > 201402L) || (defined(_MSC_VER) && _MSVC_LANG > 201402L)
389#endif
390
391class STLStringMoveConverter : public STLStringConverter {
392public:
393 using STLStringConverter::STLStringConverter;
394
395public:
396 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
397};
398
399
400// function pointers
401class FunctionPointerConverter : public Converter {
402public:
403 FunctionPointerConverter(const std::string& ret, const std::string& sig) :
404 fRetType(ret), fSignature(sig) {}
405
406public:
407 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
408 PyObject* FromMemory(void* address) override;
409 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override;
410 bool HasState() override { return true; }
411
412protected:
413 std::string fRetType;
414 std::string fSignature;
415};
416
417// std::function
418class StdFunctionConverter : public FunctionPointerConverter {
419public:
420 StdFunctionConverter(Converter* cnv, const std::string& ret, const std::string& sig) :
421 FunctionPointerConverter(ret, sig), fConverter(cnv) {}
422 StdFunctionConverter(const StdFunctionConverter&) = delete;
423 StdFunctionConverter& operator=(const StdFunctionConverter&) = delete;
424 virtual ~StdFunctionConverter() { delete fConverter; }
425
426public:
427 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
428 PyObject* FromMemory(void* address) override;
429 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
430
431protected:
432 Converter* fConverter;
433};
434
435
436// smart pointer converter
437class SmartPtrConverter : public Converter {
438public:
439 SmartPtrConverter(Cppyy::TCppType_t smart,
441 bool keepControl = false,
442 bool isRef = false)
445
446public:
447 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
448 PyObject* FromMemory(void* address) override;
449 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override;
450 bool HasState() override { return true; }
451
452protected:
453 virtual bool GetAddressSpecialCase(PyObject*, void*&) { return false; }
454
458 bool fIsRef;
459};
460
461
462// initializer lists
463class InitializerListConverter : public InstanceConverter {
464public:
465 InitializerListConverter(Cppyy::TCppType_t klass, std::string const& value_type);
466 InitializerListConverter(const InitializerListConverter&) = delete;
467 InitializerListConverter& operator=(const InitializerListConverter&) = delete;
469
470public:
471 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
472 bool HasState() override { return true; }
473
474protected:
475 void Clear();
476
477protected:
478 void* fBuffer = nullptr;
479 std::vector<Converter*> fConverters;
480 std::string fValueTypeName;
483};
484
485
486// raising converter to take out overloads
487class NotImplementedConverter : public Converter {
488public:
489 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
490};
491
492} // unnamed namespace
493
494} // namespace CPyCppyy
495
496#endif // !CPYCPPYY_DECLARECONVERTERS_H
fBuffer
std::string fRetType
#define CPPYY_DECLARE_ARRAY_CONVERTER(name)
dims_t fShape
size_t fValueSize
#define CPPYY_DECLARE_STRING_CONVERTER(name, strtype)
bool fIsConst
std::string fValueTypeName
bool fIsFixed
Cppyy::TCppType_t fValueType
bool fKeepControl
#define CPPYY_DECLARE_BASIC_CONVERTER(name)
bool fIsRef
#define CPPYY_DECLARE_REFCONVERTER(name)
Cppyy::TCppType_t fClass
Cppyy::TCppType_t fSmartPtrType
std::string fSignature
Cppyy::TCppType_t fUnderlyingType
Converter * fConverter
#define CPPYY_DECLARE_BASIC_CONVERTER2(name, base)
std::string::size_type fMaxSize
std::vector< Converter * > fConverters
_object PyObject
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Binding & operator=(OUT(*fun)(void))
#define free
Definition civetweb.c:1578
InstancePtrConverter(Cppyy::TCppType_t klass, bool keepControl=false)
Definition Converters.h:65
Dimensions dims_t
Definition API.h:103
const dims_t & cdims_t
Definition API.h:104
TCppScope_t TCppType_t
Definition cpp_cppyy.h:19