Mercurial > projects > qtd
diff generator/abstractmetalang.h @ 310:5bcfe9e7db7f lifetime
Committing local changes
author | maxter <spambox@d-coding.com> |
---|---|
date | Wed, 23 Dec 2009 16:10:46 +0200 |
parents | 90131f64c9c9 |
children |
line wrap: on
line diff
--- a/generator/abstractmetalang.h Tue Sep 22 15:22:37 2009 +0000 +++ b/generator/abstractmetalang.h Wed Dec 23 16:10:46 2009 +0200 @@ -784,12 +784,49 @@ void setForceShellClass(bool on) { m_force_shell_class = on; } bool generateShellClass() const; - bool hasVirtualSlots() const { return m_has_virtual_slots; } - bool hasVirtualFunctions() const { return !isFinal() && (m_has_virtuals || hasVirtualDestructor()); } + bool hasVirtualSlots() const { return m_has_virtual_slots; } + + // returns true if this class has overridable virtual functions other than + // the virtual destructor if one exists. + bool hasVirtualFunctions() const { return !isFinal() && m_has_virtuals; } + + // returns true if this class or its base classes define a + // virtual destructor bool hasVirtualDestructor() const { return m_has_virtual_destructor - || (m_base_class && m_base_class->hasVirtualDestructor()); } + || m_base_class && m_base_class->hasVirtualDestructor(); } + + // returns the uppermost base class having virtual functions + const AbstractMetaClass* polymorphicBase() const + { + const AbstractMetaClass* ret = this; + for (const AbstractMetaClass* base = this->m_base_class; base; base = base->m_base_class) + { + if (base->m_has_virtuals || base->m_has_virtual_destructor) + ret = base; + } + return ret; + } + + // returns true if this class or its base classes have any virtual functions + bool isPolymorphic() const { return m_has_virtuals + || m_has_virtual_destructor + || m_base_class && m_base_class->isPolymorphic(); + } + + // returns the uppermost base class with virtual destructors + const AbstractMetaClass* virtualDestructorBase() const + { + const AbstractMetaClass* ret = NULL; + for (const AbstractMetaClass* base = this; base; base = base->m_base_class) + { + if (base->m_has_virtual_destructor) + ret = base; + } + return ret; + } + bool setHasVirtualDestructor(bool value) { m_has_virtual_destructor = value; } - bool isPolymorphic() const { return typeEntry()->isObject() && (hasVirtualFunctions() || hasVirtualDestructor()); } + bool hasProtectedFunctions() const; QList<TypeEntry *> templateArguments() const { return m_template_args; }