deprecated Initialize/CleanUpClasses

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22629 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2003-08-06 12:10:30 +00:00
parent ab94455525
commit cafc76a4bb
3 changed files with 35 additions and 46 deletions

View File

@@ -105,11 +105,13 @@ public:
( m_baseInfo2 && m_baseInfo2->IsKindOf(info) ) ); ( m_baseInfo2 && m_baseInfo2->IsKindOf(info) ) );
} }
#ifdef WXWIN_COMPATIBILITY_2_4
// Initializes parent pointers and hash table for fast searching. // Initializes parent pointers and hash table for fast searching.
static void InitializeClasses(); wxDEPRECATED( static void InitializeClasses() );
// Cleans up hash table used for fast searching. // Cleans up hash table used for fast searching.
static void CleanUpClasses(); wxDEPRECATED( static void CleanUpClasses() );
#endif
static void CleanUp();
public: public:
const wxChar *m_className; const wxChar *m_className;
@@ -145,6 +147,11 @@ protected:
WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name); WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name);
#ifdef WXWIN_COMPATIBILITY_2_4
inline void wxClassInfo::InitializeClasses() {}
inline void wxClassInfo::CleanUpClasses() {}
#endif
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// Dynamic class macros // Dynamic class macros
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -206,8 +206,6 @@ static void FreeConvertedArgs()
// initialization which is always done (not customizable) before wxApp creation // initialization which is always done (not customizable) before wxApp creation
static bool DoCommonPreInit() static bool DoCommonPreInit()
{ {
wxClassInfo::InitializeClasses();
return true; return true;
} }
@@ -331,7 +329,7 @@ static void DoCommonPreCleanup()
// cleanup done after destroying wxTheApp // cleanup done after destroying wxTheApp
static void DoCommonPostCleanup() static void DoCommonPostCleanup()
{ {
wxClassInfo::CleanUpClasses(); wxClassInfo::CleanUp();
// we can't do this in wxApp itself because it doesn't know if argv had // we can't do this in wxApp itself because it doesn't know if argv had
// been allocated // been allocated

View File

@@ -215,52 +215,31 @@ wxClassInfo *wxClassInfo::FindClass(const wxChar *className)
} }
} }
// Set pointers to base class(es) to speed up IsKindOf void wxClassInfo::CleanUp()
void wxClassInfo::InitializeClasses()
{ {
if ( sm_classTable )
{
delete sm_classTable;
sm_classTable = NULL;
}
}
void wxClassInfo::Register()
{
if ( !sm_classTable )
{
sm_classTable = new wxHashTable(wxKEY_STRING);
}
// using IMPLEMENT_DYNAMIC_CLASS() macro twice (which may happen if you // using IMPLEMENT_DYNAMIC_CLASS() macro twice (which may happen if you
// link any object module twice mistakenly) will break this function // link any object module twice mistakenly) will break this function
// because it will enter an infinite loop and eventually die with "out of // because it will enter an infinite loop and eventually die with "out of
// memory" - as this is quite hard to detect if you're unaware of this, // memory" - as this is quite hard to detect if you're unaware of this,
// try to do some checks here // try to do some checks here
wxASSERT_MSG( sm_classTable->Get(m_className) == NULL,
#ifdef __WXDEBUG__ _T("class already in RTTI table - have you used IMPLEMENT_DYNAMIC_CLASS() twice (may be by linking some object module(s) twice)?") );
static const size_t nMaxClasses = 10000; // more than we'll ever have
size_t nClass = 0; sm_classTable->Put(m_className, (wxObject *)this);
#endif
// Do this initialization only once, because classes are added
// automatically if
if ( sm_classTable == NULL )
{
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)
{
if (info->m_className)
{
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);
}
}
}
}
void wxClassInfo::CleanUpClasses()
{
delete wxClassInfo::sm_classTable;
wxClassInfo::sm_classTable = NULL;
}
void wxClassInfo::Register()
{
if ( sm_classTable )
{
sm_classTable->Put(m_className, (wxObject *)this);
}
} }
void wxClassInfo::Unregister() void wxClassInfo::Unregister()
@@ -268,6 +247,11 @@ void wxClassInfo::Unregister()
if ( sm_classTable ) if ( sm_classTable )
{ {
sm_classTable->Delete(m_className); sm_classTable->Delete(m_className);
if ( sm_classTable->GetCount() == 0 )
{
delete sm_classTable;
sm_classTable = NULL;
}
} }
} }