43#ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_CLASS_DEFINITION_H
44#define LASS_GUARDIAN_OF_INCLUSION_PYTHON_CLASS_DEFINITION_H
175 LASS_PYTHON_DLL PyMethodDef LASS_CALL createPyMethodDef(
176 const char *ml_name, PyCFunction ml_meth,
int ml_flags,
178 LASS_PYTHON_DLL PyGetSetDef LASS_CALL createPyGetSetDef(
179 const char* name, getter get, setter set,
const char* doc,
void* closure);
181 LASS_PYTHON_DLL
void LASS_CALL dealloc(PyObject* obj);
182 LASS_PYTHON_DLL PyObject* LASS_CALL repr(PyObject* obj);
183 LASS_PYTHON_DLL PyObject* LASS_CALL str(PyObject* obj);
188 NamePredicate(
const char* name): name_(name) {}
189 template <
typename T>
bool operator()(
const T& x)
const {
return cmp(x.name()); }
190 bool operator()(
const PyMethodDef& x)
const {
return cmp(x.ml_name); }
191 template <
typename T>
bool operator()(T* x)
const {
return (*
this)(*x); }
193 bool cmp(
const char* name)
const {
return name && strcmp(name, name_) == 0; }
197 class StaticMemberHelper
200 virtual ~StaticMemberHelper() {}
203 typedef util::SharedPtr<StaticMemberHelper> TStaticMemberHelperPtr;
205 template <
typename T>
206 class StaticMemberHelperObject:
public StaticMemberHelper
209 StaticMemberHelperObject(
const T& obj): obj_(obj) {}
210 TPyObjPtr build()
const override {
return TPyObjPtr(PyExportTraits<const T>::build(obj_)); }
214 template <
typename T,
size_t N>
215 class StaticMemberHelperObject<T[N]>:
public StaticMemberHelper
218 StaticMemberHelperObject(
const T obj[N]): obj_(obj) {}
219 TPyObjPtr build()
const override {
return TPyObjPtr(PyExportTraits<const T*>::build(obj_)); }
224 class StaticMemberHelperObject<PyObject*>:
public StaticMemberHelper
227 StaticMemberHelperObject(PyObject* obj): obj_(obj) {}
228 TPyObjPtr build()
const override {
return obj_; }
232 template <
typename T>
233 inline TStaticMemberHelperPtr staticMemberHelperObject(
const T& obj)
235 return TStaticMemberHelperPtr(
new StaticMemberHelperObject<T>(obj));
241 StaticMember(
const char* name,
const TStaticMemberHelperPtr member): member_(member), name_(name) {}
242 const TStaticMemberHelperPtr& member()
const {
return member_; }
243 const char* name()
const {
return name_; }
245 TStaticMemberHelperPtr member_;
249 struct LASS_PYTHON_DLL CompareFunc
251 PyCFunction dispatcher;
253 CompareFunc(PyCFunction dispatcher,
int op): dispatcher(dispatcher), op(op) {}
256 template <
typename CppClass> PyObject* richCompareDispatcher(PyObject* self, PyObject* other,
int op)
258 return CppClass::_lassPyClassDef.callRichCompare(self, other, op);
277 typedef void(*TClassRegisterHook)();
289 richcmpfunc richcmp,
ClassDefinition* parent, TClassRegisterHook registerHook);
295 PyTypeObject*
type();
296 const PyTypeObject*
type()
const;
300 const char*
name()
const;
302 const char*
doc()
const;
323 void addMethod(
const char*
name,
const char*
doc, PyCFunction dispatcher, OverloadLink& overloadChain);
325 void addMethod(
const ComparatorSlot& slot,
const char*
doc, PyCFunction dispatcher, OverloadLink& overloadChain);
327 void addMethod(
const UnarySlot& slot,
const char*
doc, unaryfunc dispatcher, OverloadLink& overloadChain);
329 void addMethod(
const BinarySlot& slot,
const char*
doc, binaryfunc dispatcher, OverloadLink& overloadChain);
331 void addMethod(
const TernarySlot& slot,
const char*
doc, ternaryfunc dispatcher, OverloadLink& overloadChain);
333 void addMethod(
const LenSlot& slot,
const char*
doc, lenfunc dispatcher, OverloadLink& overloadChain);
335 void addMethod(
const SsizeArgSlot& slot,
const char*
doc, ssizeargfunc dispatcher, OverloadLink& overloadChain);
337 void addMethod(
const SsizeObjArgSlot& slot,
const char*
doc, ssizeobjargproc dispatcher, OverloadLink& overloadChain);
339 void addMethod(
const ObjObjSlot& slot,
const char*
doc, objobjproc dispatcher, OverloadLink& overloadChain);
341 void addMethod(
const ObjObjArgSlot& slot,
const char*
doc, objobjargproc dispatcher, OverloadLink& overloadChain);
343 void addMethod(
const IterSlot& slot,
const char*
doc, getiterfunc dispatcher, OverloadLink& overloadChain);
345 void addMethod(
const IterNextSlot& slot,
const char*
doc, iternextfunc dispatcher, OverloadLink& overloadChain);
347 void addMethod(
const ArgKwSlot& slot,
const char*
doc, ternaryfunc dispatcher, OverloadLink& overloadChain);
349 void addMethod(
const InquirySlot& slot,
const char*
doc, inquiry dispatcher, OverloadLink& overloadChain);
353 void addStaticMethod(
const char*
name,
const char*
doc, PyCFunction dispatcher, PyCFunction& overloadChain);
356 template <
typename T>
void addStaticConst(
const char*
name,
const T& value)
358 LASS_ASSERT(std::count_if(statics_.begin(), statics_.end(), NamePredicate(
name)) == 0);
359 statics_.push_back(StaticMember(
name, staticMemberHelperObject(value)));
371 void* getSlot(TSlotID slotId);
373 void* setSlot(TSlotID slotId,
void* value);
376 return reinterpret_cast<Ptr
>(
setSlot(slotId,
reinterpret_cast<void*
>(value)));
383 PyObject* freezeDefinition(PyObject* module =
nullptr);
386 PyObject* callRichCompare(PyObject* self, PyObject* other,
int op);
392 template <
typename T>
friend struct ShadowTraits;
394 typedef std::vector<PyMethodDef> TMethods;
395 typedef std::vector<PyGetSetDef> TGetSetters;
396 typedef std::vector<CompareFunc> TCompareFuncs;
397 typedef std::vector<StaticMember> TStaticMembers;
398 typedef std::vector<ClassDefinition*> TClassDefs;
399 typedef std::vector<EnumDefinitionBase*> TEnumDefs;
400 typedef std::vector<PyType_Slot> TSlots;
402 PyObject* freezeDefinition(PyObject* module,
const char* scopeName);
409 TGetSetters getSetters_;
410 TCompareFuncs compareFuncs_;
411 TStaticMembers statics_;
412 TClassDefs innerClasses_;
413 TClassDefs subClasses_;
414 TEnumDefs innerEnums_;
416 TClassRegisterHook classRegisterHook_;
417 const char* className_;
428 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.