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 <functional>
19#include <utility>
20#include <vector>
21
22
23namespace CPyCppyy {
24
25typedef std::vector<std::pair<ptrdiff_t, PyObject*>> CI_DatamemberCache_t;
26
28public:
29 enum EFlags {
30 kDefault = 0x0000,
31 kNoWrapConv = 0x0001, // use type as-is (eg. no smart ptr wrap)
32 kIsOwner = 0x0002, // Python instance owns C++ object/memory
33 kIsExtended = 0x0004, // has extended data
34 kIsValue = 0x0008, // was created from a by-value return
35 kIsReference = 0x0010, // represents one indirection
36 kIsArray = 0x0020, // represents an array of objects
37 kIsSmartPtr = 0x0040, // is or embeds a smart pointer
38 kIsPtrPtr = 0x0080, // represents two indirections
39 kIsRValue = 0x0100, // can be used as an r-value
40 kIsLValue = 0x0200, // can be used as an l-value
41 kNoMemReg = 0x0400, // do not register with memory regulator
42 kIsRegulated = 0x0800, // is registered with memory regulator
43 kIsActual = 0x1000, // has been downcasted to actual type
44 kHasLifeLine = 0x2000, // has a life line set
45 };
46
47public: // public, as the python C-API works with C structs
49 void* fObject;
50 uint32_t fFlags;
51
52public:
53// construction (never done directly)
54 CPPInstance() = delete;
55
56 void Set(void* address, EFlags flags = kDefault);
57 CPPInstance* Copy(void* cppinst, PyTypeObject* target = nullptr);
58
59// state checking
60 bool IsExtended() const { return fFlags & kIsExtended; }
61 bool IsSmart() const { return fFlags & kIsSmartPtr; }
62
63// access to C++ pointer and type
64 void* GetObject();
65 void*& GetObjectRaw() { return IsExtended() ? *(void**) fObject : fObject; }
66 Cppyy::TCppType_t ObjectIsA(bool check_smart = true) const;
67
68// memory management: ownership of the underlying C++ object
69 void PythonOwns();
70 void CppOwns();
71
72// data member cache
74
75// smart pointer management
77 void* GetSmartObject() { return GetObjectRaw(); }
79
80// cross-inheritance dispatch
81 void SetDispatchPtr(void*);
82
83// redefine pointer to object as fixed-size array
86
87// implementation of the __reduce__ method: doesn't wrap any function by
88// default but can be re-assigned by libraries that add C++ object
89// serialization support, like ROOT
90 static std::function<PyObject *(PyObject *)> &ReduceMethod();
91
92private:
93 void CreateExtension();
94 void* GetExtendedObject();
95};
96
97
98//- public methods -----------------------------------------------------------
99inline void CPPInstance::Set(void* address, EFlags flags)
100{
101// Initialize the proxy with the pointer value 'address.'
102 if (flags != kDefault) fFlags = flags;
103 GetObjectRaw() = address;
104}
105
106//----------------------------------------------------------------------------
108{
109// Retrieve a pointer to the held C++ object.
110 if (!IsExtended()) {
111 if (fObject && (fFlags & kIsReference))
112 return *(reinterpret_cast<void**>(fObject));
113 else
114 return fObject; // may be null
115 } else
116 return GetExtendedObject();
117}
118
119//----------------------------------------------------------------------------
121{
122// Retrieve the C++ type identifier (or raw type if smart).
123 if (check_smart || !IsSmart()) return ((CPPClass*)Py_TYPE(this))->fCppType;
124 return GetSmartIsA();
125}
126
127
128//- object proxy type and type verification ----------------------------------
129// Needs to be extern because the libROOTPythonizations is secretly using it
130#ifdef _MSC_VER
132#else
134#endif
135
136template<typename T>
137inline bool CPPInstance_Check(T* object)
138{
139// Short-circuit the type check by checking tp_new which all generated subclasses
140// of CPPInstance inherit.
141 return object && \
142 (Py_TYPE(object)->tp_new == CPPInstance_Type.tp_new || \
144}
145
146template<typename T>
147inline bool CPPInstance_CheckExact(T* object)
148{
149 return object && Py_TYPE(object) == &CPPInstance_Type;
150}
151
152
153//- helper for memory regulation (no PyTypeObject equiv. member in p2.2) -----
154void op_dealloc_nofree(CPPInstance*);
155
156} // namespace CPyCppyy
157
158#endif // !CPYCPPYY_CPPINSTANCE_H
#define Py_TYPE(ob)
Definition CPyCppyy.h:196
int Py_ssize_t
Definition CPyCppyy.h:215
_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 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
static std::function< PyObject *(PyObject *)> ReduceMethod)()
Cppyy::TCppType_t GetSmartIsA() const
bool IsSmart() const
Definition CPPInstance.h:61
void CastToArray(Py_ssize_t sz)
CPPInstance * Copy(void *cppinst, PyTypeObject *target=nullptr)
void Set(void *address, EFlags flags=kDefault)
Definition CPPInstance.h:99
CI_DatamemberCache_t & GetDatamemberCache()
void SetSmart(PyObject *smart_type)
PyObject_HEAD void * fObject
Definition CPPInstance.h:49
Cppyy::TCppType_t ObjectIsA(bool check_smart=true) const
bool IsExtended() const
Definition CPPInstance.h:60
void SetDispatchPtr(void *)
PyTypeObject CPPInstance_Type
std::vector< std::pair< ptrdiff_t, PyObject * > > CI_DatamemberCache_t
Definition CPPInstance.h:25
void op_dealloc_nofree(CPPInstance *)
bool CPPInstance_Check(T *object)
bool CPPInstance_CheckExact(T *object)
TCppScope_t TCppType_t
Definition cpp_cppyy.h:19