1 /** 2 Mirror _descrobject.h 3 */ 4 module deimos.python.descrobject; 5 6 import deimos.python.pyport; 7 import deimos.python.object; 8 import deimos.python.methodobject; 9 import deimos.python.structmember; 10 11 extern(C): 12 // Python-header-file: Include/descrobject.h: 13 14 /// _ 15 alias PyObject* function(PyObject*, void*) getter; 16 /// _ 17 alias int function(PyObject*, PyObject*, void*) setter; 18 19 /// _ 20 struct PyGetSetDef { 21 /// _ 22 char* name; 23 /// ditto 24 getter get; 25 /// ditto 26 setter set; 27 /// ditto 28 char* doc; 29 /// ditto 30 void* closure; 31 } 32 33 /// _ 34 alias PyObject* function(PyObject*, PyObject*, void*) wrapperfunc; 35 /// _ 36 alias PyObject* function(PyObject*, PyObject*, void*, PyObject*) wrapperfunc_kwds; 37 38 /// _ 39 struct wrapperbase { 40 /// _ 41 char* name; 42 /// ditto 43 int offset; 44 /// ditto 45 void* function_; 46 /// ditto 47 wrapperfunc wrapper; 48 /// ditto 49 char* doc; 50 /// ditto 51 int flags; 52 /// ditto 53 PyObject* name_strobj; 54 } 55 56 /// _ 57 enum PyWrapperFlag_KEYWORDS = 1; 58 59 /// _ 60 template PyDescr_COMMON() { 61 version(Python_3_0_Or_Later) { 62 /// _ 63 PyDescrObject d_common; 64 }else{ 65 mixin PyObject_HEAD; 66 /// _ 67 PyTypeObject* d_type; 68 /// _ 69 PyObject* d_name; 70 } 71 } 72 73 /// subclass of PyObject. 74 struct PyDescrObject { 75 version(Python_3_0_Or_Later) { 76 mixin PyObject_HEAD; 77 /// _ 78 PyTypeObject* d_type; 79 /// _ 80 PyObject* d_name; 81 }else{ 82 mixin PyDescr_COMMON; 83 } 84 } 85 86 /// introduced in python 3, but looks generally useful. 87 PyTypeObject* PyDescr_TYPE(T)(T* x) 88 if( is(T == PyDescrObject) || 89 is(T == PyMethodDescrObject) || 90 is(T == PyMemberDescrObject) || 91 is(T == PyGetSetDescrObject) || 92 is(T == PyWrapperDescrObject)) 93 { 94 return ((cast(PyDescrObject*)x).d_type); 95 } 96 97 /// introduced in python 3, but looks generally useful. 98 PyObject* PyDescr_NAME(T)(T* x) 99 if( is(T == PyDescrObject) || 100 is(T == PyMethodDescrObject) || 101 is(T == PyMemberDescrObject) || 102 is(T == PyGetSetDescrObject) || 103 is(T == PyWrapperDescrObject)) 104 { 105 return ((cast(PyDescrObject*)x).d_name); 106 } 107 108 /// subclass of PyDescrObject 109 struct PyMethodDescrObject { 110 mixin PyDescr_COMMON; 111 /// _ 112 PyMethodDef* d_method; 113 } 114 115 /// subclass of PyDescrObject 116 struct PyMemberDescrObject { 117 mixin PyDescr_COMMON; 118 /// _ 119 PyMemberDef* d_member; 120 } 121 122 /// subclass of PyDescrObject 123 struct PyGetSetDescrObject { 124 mixin PyDescr_COMMON; 125 /// _ 126 PyGetSetDef* d_getset; 127 } 128 129 /// subclass of PyDescrObject 130 struct PyWrapperDescrObject { 131 mixin PyDescr_COMMON; 132 /// _ 133 wrapperbase* d_base; 134 /** This can be any function pointer */ 135 void* d_wrapped; 136 } 137 138 /// _ 139 mixin(PyAPI_DATA!"PyTypeObject PyWrapperDescr_Type"); 140 version(Python_2_6_Or_Later) { 141 /// Availability: >= 2.6 142 mixin(PyAPI_DATA!"PyTypeObject PyDictProxy_Type"); 143 /// Availability: >= 2.6 144 mixin(PyAPI_DATA!"PyTypeObject PyGetSetDescr_Type"); 145 /// Availability: >= 2.6 146 mixin(PyAPI_DATA!"PyTypeObject PyMemberDescr_Type"); 147 } 148 version(Python_3_0_Or_Later) { 149 /// Availability: 3.2 150 mixin(PyAPI_DATA!"PyTypeObject PyClassMethodDescr_Type"); 151 /// Availability: 3.2 152 mixin(PyAPI_DATA!"PyTypeObject PyMethodDescr_Type"); 153 /// Availability: 3.2 154 mixin(PyAPI_DATA!"PyTypeObject _PyMethodWrapper_Type"); 155 } 156 157 /// _ 158 PyObject* PyDescr_NewMethod(PyTypeObject*, PyMethodDef*); 159 /// _ 160 PyObject* PyDescr_NewClassMethod(PyTypeObject*, PyMethodDef*); 161 /// _ 162 PyObject* PyDescr_NewMember(PyTypeObject*, PyMemberDef*); 163 /// _ 164 PyObject* PyDescr_NewGetSet(PyTypeObject*, PyGetSetDef*); 165 /// _ 166 PyObject* PyDescr_NewWrapper(PyTypeObject*, wrapperbase*, void*); 167 /// _ 168 PyObject* PyDictProxy_New(PyObject*); 169 /// _ 170 PyObject* PyWrapper_New(PyObject*, PyObject*); 171 172 /// _ 173 mixin(PyAPI_DATA!"PyTypeObject PyProperty_Type"); 174 175