From 582b8a564681b7fee479a0d28babfa699593873e Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Sat, 28 Oct 2000 21:51:58 +0000 Subject: [PATCH] Overloaded constructors reduce the number of type_info objects we should have to link in. Support for multiple-inheritance from Python types and Extension classes. [SVN r8050] --- newtypes.h | 53 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/newtypes.h b/newtypes.h index ec8839a8..b8e82bc2 100644 --- a/newtypes.h +++ b/newtypes.h @@ -27,9 +27,11 @@ # include "base_object.h" # include # include +# include namespace py { +class String; class InstanceHolderBase; class TypeObjectBase : public PythonType @@ -116,12 +118,19 @@ class TypeObject : public TypeObjectBase { public: typedef T Instance; - - TypeObject(PyTypeObject* type_type, const char* name = 0) - : TypeObjectBase(type_type) - { - this->tp_name = const_cast(name ? name : typeid(Instance).name()); - } + + TypeObject(PyTypeObject* type_type, const char* name) + : Base(type_type) + { + assert(name != 0); + this->tp_name = const_cast(name); + } + + TypeObject(PyTypeObject* type_type) + : Base(type_type) + { + this->tp_name = const_cast(typeid(Instance).name()); + } private: // Overridable behaviors. // Called when the reference count goes to zero. The default implementation @@ -142,7 +151,8 @@ class Callable : public Base public: typedef Callable Properties; // Convenience for derived class construction typedef typename Base::Instance Instance; - Callable(PyTypeObject* type_type, const char* name = 0); + Callable(PyTypeObject* type_type, const char* name); + Callable(PyTypeObject* type_type); private: PyObject* instance_call(PyObject* instance, PyObject* args, PyObject* kw) const; }; @@ -153,7 +163,8 @@ class Getattrable : public Base public: typedef Getattrable Properties; // Convenience for derived class construction typedef typename Base::Instance Instance; - Getattrable(PyTypeObject* type_type, const char* name = 0); + Getattrable(PyTypeObject* type_type, const char* name); + Getattrable(PyTypeObject* type_type); private: PyObject* instance_getattr(PyObject* instance, const char* name) const; }; @@ -164,7 +175,8 @@ class Setattrable : public Base public: typedef Setattrable Properties; // Convenience for derived class construction typedef typename Base::Instance Instance; - Setattrable(PyTypeObject* type_type, const char* name = 0); + Setattrable(PyTypeObject* type_type, const char* name); + Setattrable(PyTypeObject* type_type); private: int instance_setattr(PyObject* instance, const char* name, PyObject* value) const; }; @@ -194,6 +206,13 @@ Callable::Callable(PyTypeObject* type_type, const char* name) this->enable(call); } +template +Callable::Callable(PyTypeObject* type_type) + : Base(type_type) +{ + this->enable(call); +} + template PyObject* Callable::instance_call(PyObject* instance, PyObject* args, PyObject* kw) const { @@ -208,6 +227,13 @@ Getattrable::Getattrable(PyTypeObject* type_type, const char* name) this->enable(getattr); } +template +Getattrable::Getattrable(PyTypeObject* type_type) + : Base(type_type) +{ + this->enable(getattr); +} + template PyObject* Getattrable::instance_getattr(PyObject* instance, const char* name) const { @@ -222,6 +248,13 @@ Setattrable::Setattrable(PyTypeObject* type_type, const char* name) this->enable(setattr); } +template +Setattrable::Setattrable(PyTypeObject* type_type) + : Base(type_type) +{ + this->enable(setattr); +} + template int Setattrable::instance_setattr(PyObject* instance, const char* name, PyObject* value) const { @@ -250,7 +283,7 @@ namespace detail { extern const CapabilityEntry capabilities[]; extern const std::size_t num_capabilities; - void add_capability(std::size_t index, PyTypeObject* dest, AllMethods&, const PyTypeObject* src = 0); + void add_capability(std::size_t index, PyTypeObject* dest, AllMethods&); class UniquePodSet {