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
238
239class CStringArrayConverter : public SCharArrayConverter {
240public:
241 CStringArrayConverter(cdims_t dims, bool fixed) : SCharArrayConverter(dims) {
242 fIsFixed = fixed; // overrides SCharArrayConverter decision
243 }
244 using SCharArrayConverter::SCharArrayConverter;
245 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
246 PyObject* FromMemory(void* address) override;
247 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override;
248
249private:
250 std::vector<const char*> fBuffer;
251};
252
253class NonConstCStringArrayConverter : public CStringArrayConverter {
254public:
255 using CStringArrayConverter::CStringArrayConverter;
256 PyObject* FromMemory(void* address) override;
257};
258
259// converters for special cases
260class NullptrConverter : public Converter {
261public:
262 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
263};
264
265class InstanceConverter : public StrictInstancePtrConverter {
266public:
267 using StrictInstancePtrConverter::StrictInstancePtrConverter;
268 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
269 PyObject* FromMemory(void*) override;
270 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override;
271};
272
273class InstanceRefConverter : public Converter {
274public:
275 InstanceRefConverter(Cppyy::TCppType_t klass, bool isConst) :
277
278public:
279 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
280 PyObject* FromMemory(void* address) override;
281 bool HasState() override { return true; }
282
283protected:
286};
287
288class InstanceMoveConverter : public InstanceRefConverter {
289public:
290 InstanceMoveConverter(Cppyy::TCppType_t klass) : InstanceRefConverter(klass, true) {}
291 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
292};
293
294template <bool ISREFERENCE>
295class InstancePtrPtrConverter : public InstancePtrConverter<false> {
296public:
298
299public:
300 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
301 PyObject* FromMemory(void* address) override;
302 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
303};
304
305class InstanceArrayConverter : public InstancePtrConverter<false> {
306public:
307 InstanceArrayConverter(Cppyy::TCppType_t klass, cdims_t dims, bool keepControl = false) :
308 InstancePtrConverter<false>(klass, keepControl), fShape(dims) { }
309 InstanceArrayConverter(const InstanceArrayConverter&) = delete;
310 InstanceArrayConverter& operator=(const InstanceArrayConverter&) = delete;
311
312public:
313 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
314 PyObject* FromMemory(void* address) override;
315 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
316
317protected:
319};
320
321
322class ComplexDConverter: public InstanceConverter {
323public:
324 ComplexDConverter(bool keepControl = false);
325
326public:
327 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
328 PyObject* FromMemory(void* address) override;
329 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
330 bool HasState() override { return true; }
331
332private:
333 std::complex<double> fBuffer;
334};
335
336
337// CLING WORKAROUND -- classes for STL iterators are completely undefined in that
338// they come in a bazillion different guises, so just do whatever
339class STLIteratorConverter : public Converter {
340public:
341 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
342};
343// -- END CLING WORKAROUND
344
345
346class VoidPtrRefConverter : public Converter {
347public:
348 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
349};
350
351class VoidPtrPtrConverter : public Converter {
352public:
353 VoidPtrPtrConverter(cdims_t dims);
354
355public:
356 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
357 PyObject* FromMemory(void* address) override;
358 bool HasState() override { return true; }
359
360protected:
362 bool fIsFixed;
363};
364
366
367
368#define CPPYY_DECLARE_STRING_CONVERTER(name, strtype) \
369class name##Converter : public InstanceConverter { \
370public: \
371 name##Converter(bool keepControl = true); \
372 \
373public: \
374 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
375 PyObject* FromMemory(void* address) override; \
376 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override; \
377 bool HasState() override { return true; } \
378 \
379protected: \
380 strtype fBuffer; \
381}
382
386
387class STLStringMoveConverter : public STLStringConverter {
388public:
389 using STLStringConverter::STLStringConverter;
390
391public:
392 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
393};
394
395
396// function pointers
397class FunctionPointerConverter : public Converter {
398public:
399 FunctionPointerConverter(const std::string& ret, const std::string& sig) :
400 fRetType(ret), fSignature(sig) {}
401
402public:
403 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
404 PyObject* FromMemory(void* address) override;
405 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override;
406 bool HasState() override { return true; }
407
408protected:
409 std::string fRetType;
410 std::string fSignature;
411};
412
413// std::function
414class StdFunctionConverter : public FunctionPointerConverter {
415public:
416 StdFunctionConverter(Converter* cnv, const std::string& ret, const std::string& sig) :
417 FunctionPointerConverter(ret, sig), fConverter(cnv) {}
418 StdFunctionConverter(const StdFunctionConverter&) = delete;
419 StdFunctionConverter& operator=(const StdFunctionConverter&) = delete;
420 virtual ~StdFunctionConverter() { delete fConverter; }
421
422public:
423 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
424 PyObject* FromMemory(void* address) override;
425 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
426
427protected:
428 Converter* fConverter;
429};
430
431
432// smart pointer converter
433class SmartPtrConverter : public Converter {
434public:
435 SmartPtrConverter(Cppyy::TCppType_t smart,
437 bool keepControl = false,
438 bool isRef = false)
441
442public:
443 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
444 PyObject* FromMemory(void* address) override;
445 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override;
446 bool HasState() override { return true; }
447
448protected:
449 virtual bool GetAddressSpecialCase(PyObject*, void*&) { return false; }
450
454 bool fIsRef;
455};
456
457
458// initializer lists
459class InitializerListConverter : public InstanceConverter {
460public:
461 InitializerListConverter(Cppyy::TCppType_t klass, std::string const& value_type);
462 InitializerListConverter(const InitializerListConverter&) = delete;
463 InitializerListConverter& operator=(const InitializerListConverter&) = delete;
465
466public:
467 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
468 bool HasState() override { return true; }
469
470protected:
471 void Clear();
472
473protected:
474 void* fBuffer = nullptr;
475 std::vector<Converter*> fConverters;
476 std::string fValueTypeName;
479};
480
481
482// raising converter to take out overloads
483class NotImplementedConverter : public Converter {
484public:
485 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
486};
487
488} // unnamed namespace
489
490} // namespace CPyCppyy
491
492#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:35