From 74f06fb1eec2a6e194e2ba4534622a6305f32cb8 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Wed, 18 Oct 2000 14:55:26 +0000 Subject: [PATCH] Move all base<->derived conversion stuff into ExtensionClassBase, where it belongs. Clean up some formatting. [SVN r8002] --- extclass.h | 96 +++++++++++++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 44 deletions(-) diff --git a/extclass.h b/extclass.h index 05bb8017..9b5ff64b 100644 --- a/extclass.h +++ b/extclass.h @@ -27,6 +27,7 @@ namespace py { // forward declarations class ExtensionInstance; +class ExtensionClassBase; template class InstanceHolder; template class InstanceValueHolder; template class InstancePtrHolder; @@ -53,30 +54,39 @@ T* check_non_null(T* p) template class HeldInstance; -namespace detail -{ +namespace detail { + typedef void* (*ConversionFunction)(void*); -typedef void * (*ConversionFunction)(void *); - -struct BaseClassInfo -{ - typedef Class ClassObject; + struct BaseClassInfo + { + BaseClassInfo(ExtensionClassBase* t, ConversionFunction f) + :class_object(t), convert(f) + {} - BaseClassInfo(ClassObject * t, ConversionFunction f) - :class_object(t), convert(f) - {} - - ClassObject * class_object; - ConversionFunction convert; -}; -typedef BaseClassInfo DerivedClassInfo; + ExtensionClassBase* class_object; + ConversionFunction convert; + }; + typedef BaseClassInfo DerivedClassInfo; } class ExtensionClassBase : public Class { public: ExtensionClassBase(const char* name); + + public: + // the purpose of try_class_conversions() and its related functions + // is explained in extclass.cpp + void* try_class_conversions(InstanceHolderBase*) const; + void* try_base_class_conversions(InstanceHolderBase*) const; + void* try_derived_class_conversions(InstanceHolderBase*) const; + + private: + virtual void* extract_object_from_holder(InstanceHolderBase* v) const = 0; + virtual std::vector const& base_classes() const = 0; + virtual std::vector const& derived_classes() const = 0; + protected: void add_method(PyPtr method, const char* name); void add_default_method(PyPtr method, const char* name); @@ -86,30 +96,28 @@ class ExtensionClassBase : public Class void add_constructor_object(Function*); void add_setter_method(Function*, const char* name); void add_getter_method(Function*, const char* name); - - // the purpose of try_class_conversions() and its related functions - // is explained in extclass.cpp - virtual void * try_class_conversions(InstanceHolderBase*) const; - virtual void * try_base_class_conversions(InstanceHolderBase*) const; - virtual void * try_derived_class_conversions(InstanceHolderBase*) const; - virtual std::vector const & base_classes() const = 0; - virtual std::vector const & derived_classes() const = 0; }; template class ClassRegistry { - public: - static Class* class_object() + public: + static ExtensionClassBase* class_object() { return static_class_object; } - static void register_class(py::Class*); - static void unregister_class(py::Class*); - static void register_base_class(py::detail::BaseClassInfo const &); - static void register_derived_class(py::detail::DerivedClassInfo const &); - static std::vector const & base_classes(); - static std::vector const & derived_classes(); + + // Register/unregister the Python class object corresponding to T + static void register_class(ExtensionClassBase*); + static void unregister_class(ExtensionClassBase*); + + // Establish C++ inheritance relationships + static void register_base_class(py::detail::BaseClassInfo const&); + static void register_derived_class(py::detail::DerivedClassInfo const&); + + // Query the C++ inheritance relationships + static std::vector const& base_classes(); + static std::vector const& derived_classes(); private: - static py::Class* static_class_object; + static ExtensionClassBase* static_class_object; static std::vector static_base_class_info; static std::vector static_derived_class_info; }; @@ -438,15 +446,15 @@ class ExtensionClass ClassRegistry::register_derived_class(derivedInfo); } - private: + private: // types typedef InstanceValueHolder Holder; - - virtual std::vector const & base_classes() const; - virtual std::vector const & derived_classes() const; - // the purpose of this function is explained in extclass.cpp - virtual void * extract_object_from_holder(InstanceHolderBase * v) const; + private: // ExtensionClassBase virtual function implementations + std::vector const& base_classes() const; + std::vector const& derived_classes() const; + void* extract_object_from_holder(InstanceHolderBase* v) const; + private: // Utility functions template void add_constructor(Signature sig) { @@ -580,7 +588,7 @@ ExtensionClass::derived_classes() const } template -void * ExtensionClass::extract_object_from_holder(InstanceHolderBase * v) const +void* ExtensionClass::extract_object_from_holder(InstanceHolderBase* v) const { py::InstanceHolder* held = dynamic_cast*>(v); if(held) return held->target(); @@ -594,7 +602,7 @@ ExtensionClass::~ExtensionClass() } template -inline void ClassRegistry::register_class(Class* p) +inline void ClassRegistry::register_class(ExtensionClassBase* p) { // You're not expected to create more than one of these! assert(static_class_object == 0); @@ -602,7 +610,7 @@ inline void ClassRegistry::register_class(Class* p) } template -inline void ClassRegistry::unregister_class(Class* p) +inline void ClassRegistry::unregister_class(ExtensionClassBase* p) { // The user should be destroying the same object they created. assert(static_class_object == p); @@ -623,13 +631,13 @@ void ClassRegistry::register_derived_class(py::detail::DerivedClassInfo const } template -std::vector const & ClassRegistry::base_classes() +std::vector const& ClassRegistry::base_classes() { return static_base_class_info; } template -std::vector const & ClassRegistry::derived_classes() +std::vector const& ClassRegistry::derived_classes() { return static_derived_class_info; } @@ -638,7 +646,7 @@ std::vector const & ClassRegistry::derived_clas // Static data member declaration. // template -Class* ClassRegistry::static_class_object; +ExtensionClassBase* ClassRegistry::static_class_object; template std::vector ClassRegistry::static_base_class_info; template