Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
CPPInstance.h
Go to the documentation of this file.
1#ifndef CPYCPPYY_CPPINSTANCE_H
2#define CPYCPPYY_CPPINSTANCE_H
3
4//////////////////////////////////////////////////////////////////////////////
5// //
6// CpyCppyy::CPPInstance //
7// //
8// Python-side proxy, encapsulaties a C++ object. //
9// //
10//////////////////////////////////////////////////////////////////////////////
11
12// Bindings
13#include "CPPScope.h"
14#include "Cppyy.h"
15#include "CallContext.h" // for Parameter
16
17// Standard
18#include <utility>
19#include <vector>
20
21
22namespace CPyCppyy {
23
24typedef std::vector<std::pair<ptrdiff_t, PyObject*>> CI_DatamemberCache_t;
25
27public:
28 enum EFlags {
29 kDefault = 0x0000,
30 kNoWrapConv = 0x0001,
31 kIsOwner = 0x0002,
32 kIsExtended = 0x0004,
33 kIsReference = 0x0008,
34 kIsRValue = 0x0010,
35 kIsLValue = 0x0020,
36 kIsValue = 0x0040,
37 kIsPtrPtr = 0x0080,
38 kIsArray = 0x0100,
39 kIsSmartPtr = 0x0200,
40 kNoMemReg = 0x0400,
41 kHasLifeLine = 0x0800,
42 kIsRegulated = 0x1000,
43 kIsActual = 0x2000 };
44
45public: // public, as the python C-API works with C structs
46 PyObject_HEAD
47 void* fObject;
48 uint32_t fFlags;
49
50public:
51// construction (never done directly)
52 CPPInstance() = delete;
53
54 void Set(void* address, EFlags flags = kDefault);
55 CPPInstance* Copy(void* cppinst, PyTypeObject* target = nullptr);
56
57// state checking
58 bool IsExtended() const { return fFlags & kIsExtended; }
59 bool IsSmart() const { return fFlags & kIsSmartPtr; }
60
61// access to C++ pointer and type
62 void* GetObject();
63 void*& GetObjectRaw() { return IsExtended() ? *(void**) fObject : fObject; }
64 Cppyy::TCppType_t ObjectIsA(bool check_smart = true) const;
65
66// memory management: ownership of the underlying C++ object
67 void PythonOwns();
68 void CppOwns();
69
70// data member cache
72
73// smart pointer management
74 void SetSmart(PyObject* smart_type);
75 void* GetSmartObject() { return GetObjectRaw(); }
77
78// cross-inheritance dispatch
79 void SetDispatchPtr(void*);
80
81// redefine pointer to object as fixed-size array
82 void CastToArray(Py_ssize_t sz);
84
85private:
86 void CreateExtension();
87 void* GetExtendedObject();
88};
89
90
91//- public methods -----------------------------------------------------------
92inline void CPPInstance::Set(void* address, EFlags flags)
93{
94// Initialize the proxy with the pointer value 'address.'
95 if (flags != kDefault) fFlags = flags;
96 GetObjectRaw() = address;
97}
98
99//----------------------------------------------------------------------------
101{
102// Retrieve a pointer to the held C++ object.
103 if (!IsExtended()) {
104 if (fObject && (fFlags & kIsReference))
105 return *(reinterpret_cast<void**>(fObject));
106 else
107 return fObject; // may be null
108 } else
109 return GetExtendedObject();
110}
111
112//----------------------------------------------------------------------------
113inline Cppyy::TCppType_t CPPInstance::ObjectIsA(bool check_smart) const
114{
115// Retrieve the C++ type identifier (or raw type if smart).
116 if (check_smart || !IsSmart()) return ((CPPClass*)Py_TYPE(this))->fCppType;
117 return GetSmartIsA();
118}
119
120
121//- object proxy type and type verification ----------------------------------
123
124template<typename T>
125inline bool CPPInstance_Check(T* object)
126{
127// Short-circuit the type check by checking tp_new which all generated subclasses
128// of CPPInstance inherit.
129 return object && \
130 (Py_TYPE(object)->tp_new == CPPInstance_Type.tp_new || \
131 PyObject_TypeCheck(object, &CPPInstance_Type));
132}
133
134template<typename T>
135inline bool CPPInstance_CheckExact(T* object)
136{
137 return object && Py_TYPE(object) == &CPPInstance_Type;
138}
139
140
141//- helper for memory regulation (no PyTypeObject equiv. member in p2.2) -----
142void op_dealloc_nofree(CPPInstance*);
143
144} // namespace CPyCppyy
145
146#endif // !CPYCPPYY_CPPINSTANCE_H
#define Py_TYPE(ob)
Definition CPyCppyy.h:196
int Py_ssize_t
Definition CPyCppyy.h:215
_object PyObject
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t target
#define CPYCPPYY_IMPORT
Definition CommonDefs.h:26
Cppyy::TCppType_t GetSmartIsA() const
bool IsSmart() const
Definition CPPInstance.h:59
void CastToArray(Py_ssize_t sz)
CPPInstance * Copy(void *cppinst, PyTypeObject *target=nullptr)
void Set(void *address, EFlags flags=kDefault)
Definition CPPInstance.h:92
CI_DatamemberCache_t & GetDatamemberCache()
void SetSmart(PyObject *smart_type)
PyObject_HEAD void * fObject
Definition CPPInstance.h:47
Cppyy::TCppType_t ObjectIsA(bool check_smart=true) const
bool IsExtended() const
Definition CPPInstance.h:58
void SetDispatchPtr(void *)
PyTypeObject CPPInstance_Type
std::vector< std::pair< ptrdiff_t, PyObject * > > CI_DatamemberCache_t
Definition CPPInstance.h:24
void op_dealloc_nofree(CPPInstance *)
bool CPPInstance_Check(T *object)
bool CPPInstance_CheckExact(T *object)
TCppScope_t TCppType_t
Definition cpp_cppyy.h:19