mirror of
https://github.com/boostorg/python.git
synced 2026-01-22 05:22:45 +00:00
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]
This commit is contained in:
53
newtypes.h
53
newtypes.h
@@ -27,9 +27,11 @@
|
||||
# include "base_object.h"
|
||||
# include <typeinfo>
|
||||
# include <vector>
|
||||
# include <cassert>
|
||||
|
||||
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<char*>(name ? name : typeid(Instance).name());
|
||||
}
|
||||
|
||||
TypeObject(PyTypeObject* type_type, const char* name)
|
||||
: Base(type_type)
|
||||
{
|
||||
assert(name != 0);
|
||||
this->tp_name = const_cast<char*>(name);
|
||||
}
|
||||
|
||||
TypeObject(PyTypeObject* type_type)
|
||||
: Base(type_type)
|
||||
{
|
||||
this->tp_name = const_cast<char*>(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<Base>::Callable(PyTypeObject* type_type, const char* name)
|
||||
this->enable(call);
|
||||
}
|
||||
|
||||
template <class Base>
|
||||
Callable<Base>::Callable(PyTypeObject* type_type)
|
||||
: Base(type_type)
|
||||
{
|
||||
this->enable(call);
|
||||
}
|
||||
|
||||
template <class Base>
|
||||
PyObject* Callable<Base>::instance_call(PyObject* instance, PyObject* args, PyObject* kw) const
|
||||
{
|
||||
@@ -208,6 +227,13 @@ Getattrable<Base>::Getattrable(PyTypeObject* type_type, const char* name)
|
||||
this->enable(getattr);
|
||||
}
|
||||
|
||||
template <class Base>
|
||||
Getattrable<Base>::Getattrable(PyTypeObject* type_type)
|
||||
: Base(type_type)
|
||||
{
|
||||
this->enable(getattr);
|
||||
}
|
||||
|
||||
template <class Base>
|
||||
PyObject* Getattrable<Base>::instance_getattr(PyObject* instance, const char* name) const
|
||||
{
|
||||
@@ -222,6 +248,13 @@ Setattrable<Base>::Setattrable(PyTypeObject* type_type, const char* name)
|
||||
this->enable(setattr);
|
||||
}
|
||||
|
||||
template <class Base>
|
||||
Setattrable<Base>::Setattrable(PyTypeObject* type_type)
|
||||
: Base(type_type)
|
||||
{
|
||||
this->enable(setattr);
|
||||
}
|
||||
|
||||
template <class Base>
|
||||
int Setattrable<Base>::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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user