Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
DeclareConverters.h
Go to the documentation of this file.
1#ifndef CPYRT_DECLARECONVERTERS_H
2#define CPYRT_DECLARECONVERTERS_H
3
4// Bindings
5#include "Converters.h"
6#include "Dimensions.h"
7#include "cppjit_interop.h"
8
9// Standard
10#include <complex>
11#include <string>
12
13namespace cppjit::cpyrt {
14
15namespace {
16
17#define CPPJIT_DECLARE_BASIC_CONVERTER(name) \
18 class name##Converter : public Converter { \
19 public: \
20 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
21 PyObject* FromMemory(void*) override; \
22 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override; \
23 std::string GetFailureMsg() override { return "[" #name "Converter]"; } \
24 }; \
25 \
26 class Const##name##RefConverter : public Converter { \
27 public: \
28 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
29 PyObject* FromMemory(void*) override; \
30 std::string GetFailureMsg() override { \
31 return "[Const" #name "RefConverter]"; \
32 } \
33 }
34
35#define CPPJIT_DECLARE_BASIC_CONVERTER2(name, base) \
36 class name##Converter : public base##Converter { \
37 public: \
38 PyObject* FromMemory(void*) override; \
39 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override; \
40 std::string GetFailureMsg() override { return "[" #name "Converter]"; } \
41 }; \
42 \
43 class Const##name##RefConverter : public Converter { \
44 public: \
45 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
46 PyObject* FromMemory(void*) override; \
47 std::string GetFailureMsg() override { \
48 return "[Const" #name "RefConverter]"; \
49 } \
50 }
51
52#define CPPJIT_DECLARE_REFCONVERTER(name) \
53 class name##RefConverter : public Converter { \
54 public: \
55 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
56 PyObject* FromMemory(void*) override; \
57 std::string GetFailureMsg() override { return "[" #name "RefConverter]"; } \
58 };
59
60#define CPPJIT_DECLARE_ARRAY_CONVERTER(name) \
61 class name##ArrayConverter : public Converter { \
62 public: \
63 name##ArrayConverter(cdims_t dims); \
64 name##ArrayConverter(const name##ArrayConverter&) = delete; \
65 name##ArrayConverter& operator=(const name##ArrayConverter&) = delete; \
66 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
67 PyObject* FromMemory(void*) override; \
68 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override; \
69 bool HasState() override { return true; } \
70 std::string GetFailureMsg() override { \
71 return "[" #name "ArrayConverter]"; \
72 } \
73 \
74 protected: \
75 dims_t fShape; \
76 bool fIsFixed; \
77 };
78
79// converters for built-ins
83class SCharAsIntConverter : public CharConverter {
84public:
85 using CharConverter::CharConverter;
86 PyObject* FromMemory(void*) override;
87};
89class UCharAsIntConverter : public UCharConverter {
90public:
91 using UCharConverter::UCharConverter;
92 PyObject* FromMemory(void*) override;
93};
113
138
139// by-value enum parameters: exact-match instances of the same enum in the
140// first resolution round, delegate storage to the underlying integer converter
141class EnumConverter : public Converter {
142public:
143 EnumConverter(Converter* base, const std::string& enum_name)
144 : fBase(base), fEnumName(enum_name) {}
145 ~EnumConverter() override;
146
147public:
148 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
149 PyObject* FromMemory(void* address) override;
150 bool ToMemory(PyObject* value, void* address,
151 PyObject* ctxt = nullptr) override;
152 bool HasState() override { return true; }
153 std::string GetFailureMsg() override;
154
155private:
156 Converter* fBase;
157 std::string fEnumName;
158};
159
160class VoidConverter : public Converter {
161public:
162 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
163};
164
165class CStringConverter : public Converter {
166public:
167 CStringConverter(std::string::size_type maxSize = std::string::npos)
168 : fMaxSize(maxSize) {}
169
170public:
171 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
172 PyObject* FromMemory(void* address) override;
173 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
174 bool HasState() override { return true; }
175 std::string GetFailureMsg() override { return "[CStringConverter]"; }
176
177protected:
178 std::string fBuffer;
179 std::string::size_type fMaxSize;
180};
181
182class NonConstCStringConverter : public CStringConverter {
183public:
184 using CStringConverter::CStringConverter;
185
186public:
187 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
188 PyObject* FromMemory(void* address) override;
189 std::string GetFailureMsg() override { return "[NonConstCStringConverter]"; }
190};
191
192class WCStringConverter : public Converter {
193public:
194 WCStringConverter(std::wstring::size_type maxSize = std::wstring::npos)
195 : fBuffer(nullptr), fMaxSize(maxSize) {}
196 WCStringConverter(const WCStringConverter&) = delete;
197 WCStringConverter& operator=(const WCStringConverter&) = delete;
198 virtual ~WCStringConverter() { free(fBuffer); }
199
200public:
201 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
202 PyObject* FromMemory(void* address) override;
203 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
204 bool HasState() override { return true; }
205 std::string GetFailureMsg() override { return "[WCStringConverter]"; };
206
207protected:
208 wchar_t* fBuffer;
209 std::wstring::size_type fMaxSize;
210};
211
212class CString16Converter : public Converter {
213public:
214 CString16Converter(std::wstring::size_type maxSize = std::wstring::npos)
215 : fBuffer(nullptr), fMaxSize(maxSize) {}
216 CString16Converter(const CString16Converter&) = delete;
217 CString16Converter& operator=(const CString16Converter&) = delete;
218 virtual ~CString16Converter() { free(fBuffer); }
219
220public:
221 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
222 PyObject* FromMemory(void* address) override;
223 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
224 bool HasState() override { return true; }
225 std::string GetFailureMsg() override { return "[CString16Converter]"; };
226
227protected:
228 char16_t* fBuffer;
229 std::wstring::size_type fMaxSize;
230};
231
232class CString32Converter : public Converter {
233public:
234 CString32Converter(std::wstring::size_type maxSize = std::wstring::npos)
235 : fBuffer(nullptr), fMaxSize(maxSize) {}
236 CString32Converter(const CString32Converter&) = delete;
237 CString32Converter& operator=(const CString32Converter&) = delete;
238 virtual ~CString32Converter() { free(fBuffer); }
239
240public:
241 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
242 PyObject* FromMemory(void* address) override;
243 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
244 bool HasState() override { return true; }
245 std::string GetFailureMsg() override { return "[CString32Converter]"; };
246
247protected:
248 char32_t* fBuffer;
249 std::wstring::size_type fMaxSize;
250};
251
252// pointer/array conversions
276
277class CStringArrayConverter : public SCharArrayConverter {
278public:
279 CStringArrayConverter(cdims_t dims, bool fixed) : SCharArrayConverter(dims) {
280 fIsFixed = fixed; // overrides SCharArrayConverter decision
281 }
282 using SCharArrayConverter::SCharArrayConverter;
283 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
284 PyObject* FromMemory(void* address) override;
285 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override;
286 std::string GetFailureMsg() override { return "[CStringArrayConverter]"; };
287
288private:
289 std::vector<const char*> fBuffer;
290};
291
292class NonConstCStringArrayConverter : public CStringArrayConverter {
293public:
294 using CStringArrayConverter::CStringArrayConverter;
295 PyObject* FromMemory(void* address) override;
296 std::string GetFailureMsg() override {
297 return "[NonConstCStringArrayConverter]";
298 };
299};
300
301// converters for special cases
302class NullptrConverter : public Converter {
303public:
304 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
305};
306
307class InstanceConverter : public StrictInstancePtrConverter {
308public:
309 using StrictInstancePtrConverter::StrictInstancePtrConverter;
310 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
311 PyObject* FromMemory(void*) override;
312 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override;
313 std::string GetFailureMsg() override { return "[InstanceConverter]"; };
314};
315
316class InstanceRefConverter : public Converter {
317public:
318 InstanceRefConverter(interop::TCppScope_t klass, bool isConst)
319 : fClass(klass), fIsConst(isConst) {}
320
321public:
322 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
323 PyObject* FromMemory(void* address) override;
324 bool HasState() override { return true; }
325 std::string GetFailureMsg() override { return "[InstanceRefConverter]"; };
326
327protected:
330};
331
332class InstanceMoveConverter : public InstanceRefConverter {
333public:
334 InstanceMoveConverter(interop::TCppScope_t klass)
335 : InstanceRefConverter(klass, true) {}
336 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
337 std::string GetFailureMsg() override { return "[InstanceMoveConverter]"; };
338};
339
340template <bool ISREFERENCE>
341class InstancePtrPtrConverter : public InstancePtrConverter<false> {
342public:
344
345public:
346 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
347 PyObject* FromMemory(void* address) override;
348 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
349 std::string GetFailureMsg() override { return "[InstancePtrPtrConverter]"; };
350};
351
352class InstanceArrayConverter : public InstancePtrConverter<false> {
353public:
354 InstanceArrayConverter(interop::TCppScope_t klass, cdims_t dims,
355 bool keepControl = false)
356 : InstancePtrConverter<false>(klass, keepControl), fShape(dims) {}
357 InstanceArrayConverter(const InstanceArrayConverter&) = delete;
358 InstanceArrayConverter& operator=(const InstanceArrayConverter&) = delete;
359
360public:
361 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
362 PyObject* FromMemory(void* address) override;
363 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
364 std::string GetFailureMsg() override { return "[InstanceArrayConverter]"; };
365
366protected:
368};
369
370class ComplexDConverter : public InstanceConverter {
371public:
372 ComplexDConverter(bool keepControl = false);
373
374public:
375 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
376 PyObject* FromMemory(void* address) override;
377 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
378 bool HasState() override { return true; }
379 std::string GetFailureMsg() override { return "[ComplexDConverter]"; };
380
381private:
382 std::complex<double> fBuffer;
383};
384
385// Cling WORKAROUND -- classes for STL iterators are completely undefined in
386// that they come in a bazillion different guises, so just do whatever
387class STLIteratorConverter : public Converter {
388public:
389 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
390 std::string GetFailureMsg() override { return "[STLIteratorConverter]"; };
391};
392// -- END Cling WORKAROUND
393
394class VoidPtrRefConverter : public Converter {
395public:
396 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
397 std::string GetFailureMsg() override { return "[VoidPtrRefConverter]"; };
398};
399
400class VoidPtrPtrConverter : public Converter {
401public:
402 VoidPtrPtrConverter(cdims_t dims,
403 const std::string& failureMsg = std::string());
404 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
405 PyObject* FromMemory(void* address) override;
406 bool HasState() override { return true; }
407 std::string GetFailureMsg() override {
408 return "[VoidPtrPtrConverter] " + fFailureMsg;
409 }
410
411protected:
413 bool fIsFixed;
414 const std::string fFailureMsg;
415};
416
418
419#define CPPJIT_DECLARE_STRING_CONVERTER(name, strtype) \
420 class name##Converter : public InstanceConverter { \
421 public: \
422 name##Converter(bool keepControl = true); \
423 \
424 public: \
425 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
426 PyObject* FromMemory(void* address) override; \
427 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override; \
428 bool HasState() override { return true; } \
429 std::string GetFailureMsg() override { return "[" #name "Converter]"; }; \
430 \
431 protected: \
432 strtype fBuffer; \
433 }
434
435CPPJIT_DECLARE_STRING_CONVERTER(STLString, std::string);
436CPPJIT_DECLARE_STRING_CONVERTER(STLWString, std::wstring);
437CPPJIT_DECLARE_STRING_CONVERTER(STLStringView, std::string_view);
438
439class STLStringMoveConverter : public STLStringConverter {
440public:
441 using STLStringConverter::STLStringConverter;
442
443public:
444 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
445 std::string GetFailureMsg() override { return "[STLStringMoveConverter]"; };
446};
447
448// function pointers
449class FunctionPointerConverter : public Converter {
450public:
451 FunctionPointerConverter(cppjit::interop::TCppType_t FnType)
452 : fFnType(FnType) {}
453
454public:
455 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
456 PyObject* FromMemory(void* address) override;
457 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override;
458 bool HasState() override { return true; }
459 std::string GetFailureMsg() override { return "[FunctionPointerConverter]"; };
460
461protected:
463 bool fAllowCppInstance = false;
464};
465
466// std::function
467class StdFunctionConverter : public FunctionPointerConverter {
468public:
469 StdFunctionConverter(Converter* cnv, cppjit::interop::TCppType_t fn,
470 const std::string& ret, const std::string& sig)
471 : FunctionPointerConverter(cppjit::interop::GetFnTypeFromStdFn(fn)),
472 fRetType(ret), fSignature(sig), fConverter(cnv) {
473 fAllowCppInstance = true;
474 }
475 StdFunctionConverter(const StdFunctionConverter&) = delete;
476 StdFunctionConverter& operator=(const StdFunctionConverter&) = delete;
477 virtual ~StdFunctionConverter() { delete fConverter; }
478
479public:
480 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
481 PyObject* FromMemory(void* address) override;
482 bool ToMemory(PyObject* value, void* address, PyObject* = nullptr) override;
483 std::string GetFailureMsg() override { return "[StdFunctionConverter]"; };
484
485protected:
486 std::string fRetType;
487 std::string fSignature;
488 Converter* fConverter;
489};
490
491// smart pointer converter
492class SmartPtrConverter : public Converter {
493public:
494 SmartPtrConverter(interop::TCppScope_t smart, interop::TCppScope_t underlying,
495 bool keepControl = false, bool isRef = false)
496 : fSmartPtrType(smart), fUnderlyingType(underlying),
497 fKeepControl(keepControl), fIsRef(isRef) {}
498
499public:
500 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
501 PyObject* FromMemory(void* address) override;
502 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override;
503 bool HasState() override { return true; }
504 std::string GetFailureMsg() override { return "[SmartPtrConverter]"; };
505
506protected:
507 virtual bool GetAddressSpecialCase(PyObject*, void*&) { return false; }
508
512 bool fIsRef;
513};
514
515// initializer lists
516class InitializerListConverter : public InstanceConverter {
517public:
518 InitializerListConverter(interop::TCppScope_t klass,
519 std::string const& value_type);
520 InitializerListConverter(const InitializerListConverter&) = delete;
521 InitializerListConverter& operator=(const InitializerListConverter&) = delete;
522 virtual ~InitializerListConverter();
523
524public:
525 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override;
526 bool HasState() override { return true; }
527 std::string GetFailureMsg() override { return "[FunctionPointerConverter]"; };
528
529protected:
530 void Clear();
531
532protected:
533 void* fBuffer = nullptr;
534 std::vector<Converter*> fConverters;
535 std::string fValueTypeName;
538};
539
540} // unnamed namespace
541
542} // namespace cppjit::cpyrt
543
544#endif // !CPYRT_DECLARECONVERTERS_H
fBuffer
free(fBuffer)
std::string fRetType
interop::TCppScope_t fValueType
bool fAllowCppInstance
interop::TCppScope_t fUnderlyingType
#define CPPJIT_DECLARE_REFCONVERTER(name)
dims_t fShape
const std::string fFailureMsg
size_t fValueSize
cppjit::interop::TCppType_t fFnType
interop::TCppScope_t fSmartPtrType
bool fIsConst
std::string fValueTypeName
bool fIsFixed
bool fKeepControl
#define CPPJIT_DECLARE_BASIC_CONVERTER(name)
bool fIsRef
Converter * fBase
#define CPPJIT_DECLARE_BASIC_CONVERTER2(name, base)
interop::TCppScope_t fClass
#define CPPJIT_DECLARE_ARRAY_CONVERTER(name)
std::string fSignature
#define CPPJIT_DECLARE_STRING_CONVERTER(name, strtype)
std::string fEnumName
Converter * fConverter
std::string::size_type fMaxSize
std::vector< Converter * > fConverters
_object PyObject
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
InstancePtrConverter(interop::TCppScope_t klass, bool keepControl=false, const std::string &failureMsg=std::string())
Definition Converters.h:78
Dimensions dims_t
Definition API.h:113
const dims_t & cdims_t
Definition API.h:114
Cpp::TypeRef TCppType_t
Definition API.h:42
TCppType_t GetFnTypeFromStdFn(TCppType_t fn_type)
Cpp::DeclRef TCppScope_t
Definition API.h:41