43#ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_CLASS_DEFINITION_H
44#define LASS_GUARDIAN_OF_INCLUSION_PYTHON_CLASS_DEFINITION_H
174 LASS_PYTHON_DLL PyMethodDef LASS_CALL createPyMethodDef(
175 const char *ml_name, PyCFunction ml_meth,
int ml_flags,
177 LASS_PYTHON_DLL PyGetSetDef LASS_CALL createPyGetSetDef(
178 const char* name, getter get, setter set,
const char* doc,
void* closure);
180 LASS_PYTHON_DLL
void LASS_CALL dealloc(PyObject* obj);
181 LASS_PYTHON_DLL PyObject* LASS_CALL repr(PyObject* obj);
182 LASS_PYTHON_DLL PyObject* LASS_CALL str(PyObject* obj);
187 NamePredicate(
const char* name): name_(name) {}
188 template <
typename T>
bool operator()(
const T& x)
const {
return cmp(x.name()); }
189 bool operator()(
const PyMethodDef& x)
const {
return cmp(x.ml_name); }
190 template <
typename T>
bool operator()(T* x)
const {
return (*
this)(*x); }
192 bool cmp(
const char* name)
const {
return name && strcmp(name, name_) == 0; }
196 class StaticMemberHelper
199 virtual ~StaticMemberHelper() {}
202 typedef util::SharedPtr<StaticMemberHelper> TStaticMemberHelperPtr;
204 template <
typename T>
205 class StaticMemberHelperObject:
public StaticMemberHelper
208 StaticMemberHelperObject(
const T& obj): obj_(obj) {}
209 TPyObjPtr build()
const override {
return TPyObjPtr(PyExportTraits<const T>::build(obj_)); }
213 template <
typename T,
size_t N>
214 class StaticMemberHelperObject<T[N]>:
public StaticMemberHelper
217 StaticMemberHelperObject(
const T obj[N]): obj_(obj) {}
218 TPyObjPtr build()
const override {
return TPyObjPtr(PyExportTraits<const T*>::build(obj_)); }
223 class StaticMemberHelperObject<PyObject*>:
public StaticMemberHelper
226 StaticMemberHelperObject(PyObject* obj): obj_(obj) {}
227 TPyObjPtr build()
const override {
return obj_; }
231 template <
typename T>
232 inline TStaticMemberHelperPtr staticMemberHelperObject(
const T& obj)
234 return TStaticMemberHelperPtr(
new StaticMemberHelperObject<T>(obj));
240 StaticMember(
const char* name,
const TStaticMemberHelperPtr member): member_(member), name_(name) {}
241 const TStaticMemberHelperPtr& member()
const {
return member_; }
242 const char* name()
const {
return name_; }
244 TStaticMemberHelperPtr member_;
248 struct LASS_PYTHON_DLL CompareFunc
250 PyCFunction dispatcher;
252 CompareFunc(PyCFunction dispatcher,
int op): dispatcher(dispatcher), op(op) {}
255 template <
typename CppClass> PyObject* richCompareDispatcher(PyObject* self, PyObject* other,
int op)
257 return CppClass::_lassPyClassDef.callRichCompare(self, other, op);
276 typedef void(*TClassRegisterHook)();
288 richcmpfunc richcmp,
ClassDefinition* parent, TClassRegisterHook registerHook);
294 PyTypeObject*
type();
295 const PyTypeObject*
type()
const;
299 const char*
name()
const;
301 const char*
doc()
const;
322 void addMethod(
const char*
name,
const char*
doc, PyCFunction dispatcher, OverloadLink& overloadChain);
324 void addMethod(
const ComparatorSlot& slot,
const char*
doc, PyCFunction dispatcher, OverloadLink& overloadChain);
326 void addMethod(
const UnarySlot& slot,
const char*
doc, unaryfunc dispatcher, OverloadLink& overloadChain);
328 void addMethod(
const BinarySlot& slot,
const char*
doc, binaryfunc dispatcher, OverloadLink& overloadChain);
330 void addMethod(
const TernarySlot& slot,
const char*
doc, ternaryfunc dispatcher, OverloadLink& overloadChain);
332 void addMethod(
const LenSlot& slot,
const char*
doc, lenfunc dispatcher, OverloadLink& overloadChain);
334 void addMethod(
const SsizeArgSlot& slot,
const char*
doc, ssizeargfunc dispatcher, OverloadLink& overloadChain);
336 void addMethod(
const SsizeObjArgSlot& slot,
const char*
doc, ssizeobjargproc dispatcher, OverloadLink& overloadChain);
338 void addMethod(
const ObjObjSlot& slot,
const char*
doc, objobjproc dispatcher, OverloadLink& overloadChain);
340 void addMethod(
const ObjObjArgSlot& slot,
const char*
doc, objobjargproc dispatcher, OverloadLink& overloadChain);
342 void addMethod(
const IterSlot& slot,
const char*
doc, getiterfunc dispatcher, OverloadLink& overloadChain);
344 void addMethod(
const IterNextSlot& slot,
const char*
doc, iternextfunc dispatcher, OverloadLink& overloadChain);
346 void addMethod(
const ArgKwSlot& slot,
const char*
doc, ternaryfunc dispatcher, OverloadLink& overloadChain);
348 void addMethod(
const InquirySlot& slot,
const char*
doc, inquiry dispatcher, OverloadLink& overloadChain);
352 void addStaticMethod(
const char*
name,
const char*
doc, PyCFunction dispatcher, PyCFunction& overloadChain);
355 template <
typename T>
void addStaticConst(
const char*
name,
const T& value)
357 LASS_ASSERT(std::count_if(statics_.begin(), statics_.end(), NamePredicate(
name)) == 0);
358 statics_.push_back(StaticMember(
name, staticMemberHelperObject(value)));
370 void* getSlot(TSlotID slotId);
372 void* setSlot(TSlotID slotId,
void* value);
375 return reinterpret_cast<Ptr
>(
setSlot(slotId,
reinterpret_cast<void*
>(value)));
382 PyObject* freezeDefinition(PyObject* module =
nullptr);
385 PyObject* callRichCompare(PyObject* self, PyObject* other,
int op);
391 template <
typename T>
friend struct ShadowTraits;
393 typedef std::vector<PyMethodDef> TMethods;
394 typedef std::vector<PyGetSetDef> TGetSetters;
395 typedef std::vector<CompareFunc> TCompareFuncs;
396 typedef std::vector<StaticMember> TStaticMembers;
397 typedef std::vector<ClassDefinition*> TClassDefs;
398 typedef std::vector<EnumDefinitionBase*> TEnumDefs;
399 typedef std::vector<PyType_Slot> TSlots;
401 PyObject* freezeDefinition(PyObject* module,
const char* scopeName);
407 TGetSetters getSetters_;
408 TCompareFuncs compareFuncs_;
409 TStaticMembers statics_;
410 TClassDefs innerClasses_;
411 TClassDefs subClasses_;
412 TEnumDefs innerEnums_;
414 TClassRegisterHook classRegisterHook_;
415 const char* className_;
426 void* implicitConvertersSlot_;
Base class of all enum definitions.
Definition of a Python class.
void addGetSetter(const char *name, const char *doc, getter get, setter set)
Add a property with optional getter/setter.
void setDocIfNotNull(const char *doc)
Set the class docstring if non-null (keeps existing one if nullptr).
void addMethod(const char *name, const char *doc, PyCFunction dispatcher, OverloadLink &overloadChain)
Add a named method.
void * setSlot(TSlotID slotId, void *value)
Set raw pointer for a given slot id.
ClassDefinition(const char *name, const char *doc, Py_ssize_t typeSize, richcmpfunc richcmp, ClassDefinition *parent, TClassRegisterHook registerHook)
Construct a class definition.
Ptr setSlot(TSlotID slotId, Ptr value)
Get raw pointer from a given slot id.
int TSlotID
Function to call during registration of the class (optional).
PyTypeObject * type()
Get the Python type object (available after freezeDefinition() has been called).
const char * doc() const
Get the class docstring.
void addStaticMethod(const char *name, const char *doc, PyCFunction dispatcher, PyCFunction &overloadChain)
Add a static method with overload support.
void setDoc(const char *doc)
Set the class docstring.
void addConstructor(newfunc dispatcher, newfunc &overloadChain)
Add a constructor overload (__init__ dispatcher).
const char * name() const
Get the class name.
PyObjectPtr< PyObject >::Type TPyObjPtr
PyObjectPtr to a PyObject.
Comprehensive C++ to Python binding library.
Library for Assembled Shared Sources.
PyObject * establishMagicalBackLinks(PyObject *result, PyObject *self)
Here, we try to fix some lifetime issues to guarantee some lifetime requirements on self.