1#ifndef CPYCPPYY_DECLARECONVERTERS_H
2#define CPYCPPYY_DECLARECONVERTERS_H
17#define CPPYY_DECLARE_BASIC_CONVERTER(name) \
18class name##Converter : public Converter { \
20 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
21 PyObject* FromMemory(void*) override; \
22 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override; \
25class Const##name##RefConverter : public Converter { \
27 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
28 PyObject* FromMemory(void*) override; \
32#define CPPYY_DECLARE_BASIC_CONVERTER2(name, base) \
33class name##Converter : public base##Converter { \
35 PyObject* FromMemory(void*) override; \
36 bool ToMemory(PyObject*, void*, PyObject* = nullptr) override; \
39class Const##name##RefConverter : public Converter { \
41 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
42 PyObject* FromMemory(void*) override; \
45#define CPPYY_DECLARE_REFCONVERTER(name) \
46class name##RefConverter : public Converter { \
48 bool SetArg(PyObject*, Parameter&, CallContext* = nullptr) override; \
49 PyObject* FromMemory(void*) override; \
52#define CPPYY_DECLARE_ARRAY_CONVERTER(name) \
53class name##ArrayConverter : public Converter { \
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; } \
72class SCharAsIntConverter :
public CharConverter {
74 using CharConverter::CharConverter;
75 PyObject* FromMemory(
void*)
override;
78class UCharAsIntConverter :
public UCharConverter {
80 using UCharConverter::UCharConverter;
81 PyObject* FromMemory(
void*)
override;
133class CStringConverter :
public Converter {
135 CStringConverter(std::string::size_type maxSize = std::string::npos) : fMaxSize(maxSize) {}
139 PyObject* FromMemory(
void* address)
override;
140 bool ToMemory(
PyObject* value,
void* address,
PyObject* =
nullptr)
override;
141 bool HasState()
override {
return true; }
145 std::string::size_type fMaxSize;
148class NonConstCStringConverter :
public CStringConverter {
150 using CStringConverter::CStringConverter;
154 PyObject* FromMemory(
void* address)
override;
157class WCStringConverter :
public Converter {
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); }
167 PyObject* FromMemory(
void* address)
override;
168 bool ToMemory(
PyObject* value,
void* address,
PyObject* =
nullptr)
override;
169 bool HasState()
override {
return true; }
173 std::wstring::size_type fMaxSize;
176class CString16Converter :
public Converter {
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); }
186 PyObject* FromMemory(
void* address)
override;
187 bool ToMemory(
PyObject* value,
void* address,
PyObject* =
nullptr)
override;
188 bool HasState()
override {
return true; }
192 std::wstring::size_type fMaxSize;
195class CString32Converter :
public Converter {
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); }
205 PyObject* FromMemory(
void* address)
override;
206 bool ToMemory(
PyObject* value,
void* address,
PyObject* =
nullptr)
override;
207 bool HasState()
override {
return true; }
211 std::wstring::size_type fMaxSize;
239class CStringArrayConverter :
public SCharArrayConverter {
241 CStringArrayConverter(
cdims_t dims,
bool fixed) : SCharArrayConverter(dims) {
244 using SCharArrayConverter::SCharArrayConverter;
246 PyObject* FromMemory(
void* address)
override;
250 std::vector<const char*> fBuffer;
253class NonConstCStringArrayConverter :
public CStringArrayConverter {
255 using CStringArrayConverter::CStringArrayConverter;
256 PyObject* FromMemory(
void* address)
override;
260class NullptrConverter :
public Converter {
267 using StrictInstancePtrConverter::StrictInstancePtrConverter;
269 PyObject* FromMemory(
void*)
override;
273class InstanceRefConverter :
public Converter {
276 fClass(klass), fIsConst(isConst) {}
280 PyObject* FromMemory(
void* address)
override;
281 bool HasState()
override {
return true; }
288class InstanceMoveConverter :
public InstanceRefConverter {
290 InstanceMoveConverter(
Cppyy::TCppType_t klass) : InstanceRefConverter(klass, true) {}
294template <
bool ISREFERENCE>
301 PyObject* FromMemory(
void* address)
override;
302 bool ToMemory(
PyObject* value,
void* address,
PyObject* =
nullptr)
override;
308 InstancePtrConverter<false>(klass, keepControl), fShape(dims) { }
309 InstanceArrayConverter(
const InstanceArrayConverter&) =
delete;
310 InstanceArrayConverter&
operator=(
const InstanceArrayConverter&) =
delete;
314 PyObject* FromMemory(
void* address)
override;
315 bool ToMemory(
PyObject* value,
void* address,
PyObject* =
nullptr)
override;
322class ComplexDConverter:
public InstanceConverter {
324 ComplexDConverter(
bool keepControl =
false);
328 PyObject* FromMemory(
void* address)
override;
329 bool ToMemory(
PyObject* value,
void* address,
PyObject* =
nullptr)
override;
330 bool HasState()
override {
return true; }
333 std::complex<double> fBuffer;
339class STLIteratorConverter :
public Converter {
346class VoidPtrRefConverter :
public Converter {
351class VoidPtrPtrConverter :
public Converter {
353 VoidPtrPtrConverter(
cdims_t dims);
357 PyObject* FromMemory(
void* address)
override;
358 bool HasState()
override {
return true; }
368#define CPPYY_DECLARE_STRING_CONVERTER(name, strtype) \
369class name##Converter : public InstanceConverter { \
371 name##Converter(bool keepControl = true); \
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; } \
387class STLStringMoveConverter :
public STLStringConverter {
389 using STLStringConverter::STLStringConverter;
397class FunctionPointerConverter :
public Converter {
399 FunctionPointerConverter(
const std::string&
ret,
const std::string& sig) :
400 fRetType(
ret), fSignature(sig) {}
404 PyObject* FromMemory(
void* address)
override;
406 bool HasState()
override {
return true; }
409 std::string fRetType;
410 std::string fSignature;
411 bool fAllowCppInstance =
false;
415class StdFunctionConverter :
public FunctionPointerConverter {
417 StdFunctionConverter(Converter* cnv,
const std::string&
ret,
const std::string& sig) :
418 FunctionPointerConverter(
ret, sig), fConverter(cnv) {
419 fAllowCppInstance =
true;
421 StdFunctionConverter(
const StdFunctionConverter&) =
delete;
422 StdFunctionConverter&
operator=(
const StdFunctionConverter&) =
delete;
423 virtual ~StdFunctionConverter() {
delete fConverter; }
427 PyObject* FromMemory(
void* address)
override;
428 bool ToMemory(
PyObject* value,
void* address,
PyObject* =
nullptr)
override;
431 Converter* fConverter;
436class SmartPtrConverter :
public Converter {
440 bool keepControl =
false,
442 : fSmartPtrType(smart), fUnderlyingType(underlying),
443 fKeepControl(keepControl), fIsRef(isRef) {}
447 PyObject* FromMemory(
void* address)
override;
449 bool HasState()
override {
return true; }
452 virtual bool GetAddressSpecialCase(
PyObject*,
void*&) {
return false; }
462class InitializerListConverter :
public InstanceConverter {
464 InitializerListConverter(
Cppyy::TCppType_t klass, std::string
const& value_type);
465 InitializerListConverter(
const InitializerListConverter&) =
delete;
466 InitializerListConverter&
operator=(
const InitializerListConverter&) =
delete;
467 virtual ~InitializerListConverter();
471 bool HasState()
override {
return true; }
477 void* fBuffer =
nullptr;
478 std::vector<Converter*> fConverters;
479 std::string fValueTypeName;
#define CPPYY_DECLARE_ARRAY_CONVERTER(name)
#define CPPYY_DECLARE_STRING_CONVERTER(name, strtype)
#define CPPYY_DECLARE_BASIC_CONVERTER(name)
#define CPPYY_DECLARE_REFCONVERTER(name)
#define CPPYY_DECLARE_BASIC_CONVERTER2(name, base)
Binding & operator=(OUT(*fun)(void))
InstancePtrConverter(Cppyy::TCppType_t klass, bool keepControl=false)
CPyCppyy::Parameter Parameter