initialize wxClassInfo::sm_classTable automatically

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22626 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2003-08-06 10:44:48 +00:00
parent 14fc7eb426
commit d1d738f18c
5 changed files with 68 additions and 104 deletions

View File

@@ -63,27 +63,28 @@ class WXDLLIMPEXP_BASE wxClassInfo
{ {
public: public:
wxClassInfo( const wxChar *className, wxClassInfo( const wxChar *className,
const wxChar *baseName1, const wxClassInfo *baseInfo1,
const wxChar *baseName2, const wxClassInfo *baseInfo2,
int size, int size,
wxObjectConstructorFn ctor ) wxObjectConstructorFn ctor )
: m_className(className) : m_className(className)
, m_baseClassName1(baseName1)
, m_baseClassName2(baseName2)
, m_objectSize(size) , m_objectSize(size)
, m_objectConstructor(ctor) , m_objectConstructor(ctor)
, m_baseInfo1(0) , m_baseInfo1(baseInfo1)
, m_baseInfo2(0) , m_baseInfo2(baseInfo2)
, m_next(sm_first) , m_next(sm_first)
{ sm_first = this; } {
sm_first = this;
Register();
}
~wxClassInfo(); ~wxClassInfo();
wxObject *CreateObject() { return m_objectConstructor ? (*m_objectConstructor)() : 0; } wxObject *CreateObject() { return m_objectConstructor ? (*m_objectConstructor)() : 0; }
const wxChar *GetClassName() const { return m_className; } const wxChar *GetClassName() const { return m_className; }
const wxChar *GetBaseClassName1() const { return m_baseClassName1; } const wxChar *GetBaseClassName1() const { return m_baseInfo1->GetClassName(); }
const wxChar *GetBaseClassName2() const { return m_baseClassName2; } const wxChar *GetBaseClassName2() const { return m_baseInfo2->GetClassName(); }
const wxClassInfo *GetBaseClass1() const { return m_baseInfo1; } const wxClassInfo *GetBaseClass1() const { return m_baseInfo1; }
const wxClassInfo *GetBaseClass2() const { return m_baseInfo2; } const wxClassInfo *GetBaseClass2() const { return m_baseInfo2; }
int GetSize() const { return m_objectSize; } int GetSize() const { return m_objectSize; }
@@ -104,19 +105,14 @@ public:
( m_baseInfo2 && m_baseInfo2->IsKindOf(info) ) ); ( m_baseInfo2 && m_baseInfo2->IsKindOf(info) ) );
} }
// Initializes parent pointers and hash table for fast searching. // Initializes parent pointers and hash table for fast searching.
static void InitializeClasses(); static void InitializeClasses();
// Cleans up hash table used for fast searching. // Cleans up hash table used for fast searching.
static void CleanUpClasses(); static void CleanUpClasses();
public: public:
const wxChar *m_className; const wxChar *m_className;
const wxChar *m_baseClassName1;
const wxChar *m_baseClassName2;
int m_objectSize; int m_objectSize;
wxObjectConstructorFn m_objectConstructor; wxObjectConstructorFn m_objectConstructor;
@@ -140,6 +136,11 @@ private:
static wxClassInfo *GetBaseByName(const wxChar *name); static wxClassInfo *GetBaseByName(const wxChar *name);
DECLARE_NO_COPY_CLASS(wxClassInfo) DECLARE_NO_COPY_CLASS(wxClassInfo)
protected:
// registers the class
void Register();
void Unregister();
}; };
WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name); WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name);
@@ -174,8 +175,9 @@ WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name);
#define IMPLEMENT_DYNAMIC_CLASS(name, basename) \ #define IMPLEMENT_DYNAMIC_CLASS(name, basename) \
wxObject* wxConstructorFor##name() \ wxObject* wxConstructorFor##name() \
{ return new name; } \ { return new name; } \
wxClassInfo name::sm_class##name(wxT(#name), wxT(#basename), \ wxClassInfo name::sm_class##name(wxT(#name), \
0, (int) sizeof(name), \ &basename::sm_class##basename, NULL, \
(int) sizeof(name), \
(wxObjectConstructorFn) wxConstructorFor##name); (wxObjectConstructorFn) wxConstructorFor##name);
// Multiple inheritance with two base classes // Multiple inheritance with two base classes
@@ -183,7 +185,9 @@ WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name);
#define IMPLEMENT_DYNAMIC_CLASS2(name, basename1, basename2) \ #define IMPLEMENT_DYNAMIC_CLASS2(name, basename1, basename2) \
wxObject* wxConstructorFor##name() \ wxObject* wxConstructorFor##name() \
{ return new name; } \ { return new name; } \
wxClassInfo name::sm_class##name(wxT(#name), wxT(#basename1), \ wxClassInfo name::sm_class##name(wxT(#name), \
&basename1::sm_class##basename1, \
&basename2::sm_class##basename2, \
wxT(#basename2), (int) sizeof(name), \ wxT(#basename2), (int) sizeof(name), \
(wxObjectConstructorFn) wxConstructorFor##name); (wxObjectConstructorFn) wxConstructorFor##name);
@@ -194,14 +198,17 @@ WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name);
// Single inheritance with one base class // Single inheritance with one base class
#define IMPLEMENT_ABSTRACT_CLASS(name, basename) \ #define IMPLEMENT_ABSTRACT_CLASS(name, basename) \
wxClassInfo name::sm_class##name(wxT(#name), wxT(#basename), \ wxClassInfo name::sm_class##name(wxT(#name), \
0, (int) sizeof(name), (wxObjectConstructorFn) 0); &basename::sm_class##basename, NULL, \
(int) sizeof(name), (wxObjectConstructorFn) 0);
// Multiple inheritance with two base classes // Multiple inheritance with two base classes
#define IMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \ #define IMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \
wxClassInfo name::sm_class##name(wxT(#name), wxT(#basename1), \ wxClassInfo name::sm_class##name(wxT(#name), \
wxT(#basename2), (int) sizeof(name), \ &basename1::sm_class##basename1, \
&basename2::sm_class##basename2, \
(int) sizeof(name), \
(wxObjectConstructorFn) 0); (wxObjectConstructorFn) 0);
#define IMPLEMENT_CLASS IMPLEMENT_ABSTRACT_CLASS #define IMPLEMENT_CLASS IMPLEMENT_ABSTRACT_CLASS

View File

@@ -1135,14 +1135,15 @@ private:
const wxPropertyAccessor *FindAccessor (const wxChar *propertyName); const wxPropertyAccessor *FindAccessor (const wxChar *propertyName);
// registers the class
static void Register(const wxChar *name, wxClassInfo *info);
static void Unregister(const wxChar *name);
// InitializeClasses() helper // InitializeClasses() helper
static wxClassInfo *GetBaseByName(const wxChar *name); static wxClassInfo *GetBaseByName(const wxChar *name);
protected:
// registers the class
void Register();
void Unregister();
DECLARE_NO_COPY_CLASS(wxClassInfo) DECLARE_NO_COPY_CLASS(wxClassInfo)
}; };

View File

@@ -159,16 +159,6 @@ void wxPluginLibrary::UpdateClassInfo()
(*ms_classes)[info->m_className] = this; (*ms_classes)[info->m_className] = this;
} }
} }
#if wxUSE_EXTENDED_RTTI == 0
for(info = m_after; info != m_before; info = info->m_next)
{
if( info->m_baseClassName1 )
info->m_baseInfo1 = (wxClassInfo *)t->Get(info->m_baseClassName1);
if( info->m_baseClassName2 )
info->m_baseInfo2 = (wxClassInfo *)t->Get(info->m_baseClassName2);
}
#endif
} }
void wxPluginLibrary::RestoreClassInfo() void wxPluginLibrary::RestoreClassInfo()
@@ -531,7 +521,7 @@ void wxLibrary::PrepareClasses(wxClassInfo *first)
info = info->m_next; info = info->m_next;
} }
#if wxUSE_EXTENDED_RTTI == 0 #if !wxUSE_EXTENDED_RTTI
// Set base pointers for each wxClassInfo // Set base pointers for each wxClassInfo
info = first; info = first;
while (info) while (info)

View File

@@ -194,9 +194,7 @@ wxClassInfo::~wxClassInfo()
info = info->m_next; info = info->m_next;
} }
} }
#if wxUSE_EXTENDED_RTTI Unregister();
Unregister( m_className ) ;
#endif
} }
wxClassInfo *wxClassInfo::FindClass(const wxChar *className) wxClassInfo *wxClassInfo::FindClass(const wxChar *className)
@@ -217,30 +215,6 @@ wxClassInfo *wxClassInfo::FindClass(const wxChar *className)
} }
} }
// a tiny InitializeClasses() helper
/* static */
inline wxClassInfo *wxClassInfo::GetBaseByName(const wxChar *name)
{
if ( !name )
return NULL;
wxClassInfo *classInfo = (wxClassInfo *)sm_classTable->Get(name);
#ifdef __WXDEBUG__
// this must be fixed, other things will work wrongly later if you get this
if ( !classInfo )
{
wxFAIL_MSG( wxString::Format
(
_T("base class '%s' is unknown to wxWindows RTTI"),
name
) );
}
#endif // __WXDEBUG__
return classInfo;
}
// Set pointers to base class(es) to speed up IsKindOf // Set pointers to base class(es) to speed up IsKindOf
void wxClassInfo::InitializeClasses() void wxClassInfo::InitializeClasses()
{ {
@@ -255,30 +229,24 @@ void wxClassInfo::InitializeClasses()
size_t nClass = 0; size_t nClass = 0;
#endif #endif
sm_classTable = new wxHashTable(wxKEY_STRING); // Do this initialization only once, because classes are added
// automatically if
// Index all class infos by their class name if ( sm_classTable == NULL )
wxClassInfo *info;
for(info = sm_first; info; info = info->m_next)
{ {
if (info->m_className) sm_classTable = new wxHashTable(wxKEY_STRING);
// Index all class infos by their class name:
wxClassInfo *info;
for(info = sm_first; info; info = info->m_next)
{ {
wxASSERT_MSG( ++nClass < nMaxClasses, if (info->m_className)
_T("an infinite loop detected - have you used IMPLEMENT_DYNAMIC_CLASS() twice (may be by linking some object module(s) twice)?") ); {
sm_classTable->Put(info->m_className, (wxObject *)info); wxASSERT_MSG( ++nClass < nMaxClasses,
_T("an infinite loop detected - have you used IMPLEMENT_DYNAMIC_CLASS() twice (may be by linking some object module(s) twice)?") );
sm_classTable->Put(info->m_className, (wxObject *)info);
}
} }
} }
#if wxUSE_EXTENDED_RTTI == 0
// Set base pointers for each wxClassInfo
for(info = sm_first; info; info = info->m_next)
{
info->m_baseInfo1 = GetBaseByName(info->GetBaseClassName1());
info->m_baseInfo2 = GetBaseByName(info->GetBaseClassName2());
}
#endif
} }
void wxClassInfo::CleanUpClasses() void wxClassInfo::CleanUpClasses()
@@ -287,6 +255,22 @@ void wxClassInfo::CleanUpClasses()
wxClassInfo::sm_classTable = NULL; wxClassInfo::sm_classTable = NULL;
} }
void wxClassInfo::Register()
{
if ( sm_classTable )
{
sm_classTable->Put(m_className, (wxObject *)this);
}
}
void wxClassInfo::Unregister()
{
if ( sm_classTable )
{
sm_classTable->Delete(m_className);
}
}
wxObject *wxCreateDynamicObject(const wxChar *name) wxObject *wxCreateDynamicObject(const wxChar *name)
{ {
#if defined(__WXDEBUG__) || wxUSE_DEBUG_CONTEXT #if defined(__WXDEBUG__) || wxUSE_DEBUG_CONTEXT

View File

@@ -548,24 +548,6 @@ void wxSetStringToArray( const wxString &s , wxArrayString &array )
// wxClassInfo // wxClassInfo
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void wxClassInfo::Register(const char *WXUNUSED(name), wxClassInfo *WXUNUSED(info))
{
/*
if (!ExtendedTypeMap)
ExtendedTypeMap = new ClassMap;
(*ExtendedTypeMap)[string(Name)] = Info;
*/
}
void wxClassInfo::Unregister(const char *WXUNUSED(name))
{
/*
assert(ExtendedTypeMap);
ExtendedTypeMap->erase(Name);
*/
}
const wxPropertyAccessor *wxClassInfo::FindAccessor(const char *PropertyName) const wxPropertyAccessor *wxClassInfo::FindAccessor(const char *PropertyName)
{ {
const wxPropertyInfo* info = FindPropertyInfo( PropertyName ) ; const wxPropertyInfo* info = FindPropertyInfo( PropertyName ) ;