Make wxClassInfo attributes private. Replace
direct access to sm_classTable with a (const) iterator interface. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45478 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
a4a44612a6
commit
644cb5372c
@ -82,8 +82,8 @@ public:
|
||||
|
||||
private:
|
||||
|
||||
wxClassInfo *m_before; // sm_first before loading this lib
|
||||
wxClassInfo *m_after; // ..and after.
|
||||
const wxClassInfo *m_before; // sm_first before loading this lib
|
||||
const wxClassInfo *m_after; // ..and after.
|
||||
|
||||
size_t m_linkcount; // Ref count of library link calls
|
||||
size_t m_objcount; // ..and (pluggable) object instantiations.
|
||||
|
@ -335,6 +335,8 @@ private:
|
||||
|
||||
#else // if wxUSE_OLD_HASH_TABLE
|
||||
|
||||
typedef wxNode wxHashTable_Node;
|
||||
|
||||
class WXDLLIMPEXP_BASE wxHashTable : public wxObject
|
||||
{
|
||||
public:
|
||||
|
@ -171,7 +171,7 @@ public:
|
||||
const wxValidator& validator = wxDefaultValidator,
|
||||
const wxString& name = wxT("mediaCtrl"));
|
||||
|
||||
bool DoCreate(wxClassInfo* instance,
|
||||
bool DoCreate(const wxClassInfo* instance,
|
||||
wxWindow* parent, wxWindowID winid,
|
||||
const wxPoint& pos = wxDefaultPosition,
|
||||
const wxSize& size = wxDefaultSize,
|
||||
@ -213,7 +213,7 @@ public:
|
||||
{ return Load(wxURI(fileName), wxURI(proxy)); }
|
||||
|
||||
protected:
|
||||
static wxClassInfo* NextBackend();
|
||||
static const wxClassInfo* NextBackend(wxClassInfo::const_iterator* it);
|
||||
|
||||
void OnMediaFinished(wxMediaEvent& evt);
|
||||
virtual void DoMoveWindow(int x, int y, int w, int h);
|
||||
|
@ -25,6 +25,37 @@ class WXDLLIMPEXP_BASE wxObject;
|
||||
#define wxUSE_EXTENDED_RTTI 0
|
||||
#endif
|
||||
|
||||
#define DECLARE_CLASS_INFO_ITERATORS() \
|
||||
class WXDLLIMPEXP_BASE const_iterator \
|
||||
{ \
|
||||
typedef wxHashTable_Node Node; \
|
||||
public: \
|
||||
typedef const wxClassInfo* value_type; \
|
||||
typedef const value_type& const_reference; \
|
||||
typedef const_iterator itor; \
|
||||
typedef value_type* ptr_type; \
|
||||
\
|
||||
Node* m_node; \
|
||||
wxHashTable* m_table; \
|
||||
public: \
|
||||
typedef const_reference reference_type; \
|
||||
typedef ptr_type pointer_type; \
|
||||
\
|
||||
const_iterator(Node* node, wxHashTable* table) \
|
||||
: m_node(node), m_table(table) { } \
|
||||
const_iterator() : m_node(NULL), m_table(NULL) { } \
|
||||
value_type operator*() const; \
|
||||
itor& operator++(); \
|
||||
const itor operator++(int); \
|
||||
bool operator!=(const itor& it) const \
|
||||
{ return it.m_node != m_node; } \
|
||||
bool operator==(const itor& it) const \
|
||||
{ return it.m_node == m_node; } \
|
||||
}; \
|
||||
\
|
||||
static const_iterator begin_classinfo(); \
|
||||
static const_iterator end_classinfo();
|
||||
|
||||
#if wxUSE_EXTENDED_RTTI
|
||||
#include "wx/xti.h"
|
||||
#else
|
||||
@ -35,7 +66,10 @@ class WXDLLIMPEXP_BASE wxObject;
|
||||
|
||||
class WXDLLIMPEXP_BASE wxClassInfo;
|
||||
class WXDLLIMPEXP_BASE wxHashTable;
|
||||
class WXDLLIMPEXP_BASE wxObject;
|
||||
class WXDLLIMPEXP_BASE wxPluginLibrary;
|
||||
class WXDLLIMPEXP_BASE wxObjectRefData;
|
||||
class WXDLLIMPEXP_BASE wxHashTable_Node;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxClassInfo
|
||||
@ -45,6 +79,8 @@ typedef wxObject *(*wxObjectConstructorFn)(void);
|
||||
|
||||
class WXDLLIMPEXP_BASE wxClassInfo
|
||||
{
|
||||
friend class WXDLLIMPEXP_BASE wxObject;
|
||||
friend wxObject *wxCreateDynamicObject(const wxChar *name);
|
||||
public:
|
||||
wxClassInfo( const wxChar *className,
|
||||
const wxClassInfo *baseInfo1,
|
||||
@ -94,7 +130,8 @@ public:
|
||||
( m_baseInfo2 && m_baseInfo2->IsKindOf(info) ) );
|
||||
}
|
||||
|
||||
public:
|
||||
DECLARE_CLASS_INFO_ITERATORS()
|
||||
private:
|
||||
const wxChar *m_className;
|
||||
int m_objectSize;
|
||||
wxObjectConstructorFn m_objectConstructor;
|
||||
@ -110,8 +147,6 @@ public:
|
||||
static wxClassInfo *sm_first;
|
||||
wxClassInfo *m_next;
|
||||
|
||||
// FIXME: this should be private (currently used directly by way too
|
||||
// many clients)
|
||||
static wxHashTable *sm_classTable;
|
||||
|
||||
protected:
|
||||
|
@ -84,6 +84,7 @@ class WXDLLIMPEXP_BASE wxObject;
|
||||
class WXDLLIMPEXP_BASE wxClassInfo;
|
||||
class WXDLLIMPEXP_BASE wxDynamicClassInfo;
|
||||
class WXDLLIMPEXP_BASE wxHashTable;
|
||||
class WXDLLIMPEXP_BASE wxHashTable_Node;
|
||||
class WXDLLIMPEXP_BASE wxObjectRefData;
|
||||
class WXDLLIMPEXP_BASE wxEvent;
|
||||
class WXDLLIMPEXP_BASE wxEvtHandler;
|
||||
@ -1601,6 +1602,7 @@ class WXDLLIMPEXP_BASE wxClassInfo
|
||||
{
|
||||
friend class WXDLLIMPEXP_BASE wxPropertyInfo ;
|
||||
friend class WXDLLIMPEXP_BASE wxHandlerInfo ;
|
||||
friend wxObject *wxCreateDynamicObject(const wxChar *name);
|
||||
public:
|
||||
wxClassInfo(const wxClassInfo **_Parents,
|
||||
const wxChar *_UnitName,
|
||||
@ -1718,6 +1720,8 @@ public:
|
||||
return false ;
|
||||
}
|
||||
|
||||
DECLARE_CLASS_INFO_ITERATORS()
|
||||
|
||||
// if there is a callback registered with that class it will be called
|
||||
// before this object will be written to disk, it can veto streaming out
|
||||
// this object by returning false, if this class has not registered a
|
||||
@ -1788,7 +1792,7 @@ public:
|
||||
// puts all the properties of this class and its superclasses in the map, as long as there is not yet
|
||||
// an entry with the same name (overriding mechanism)
|
||||
void GetProperties( wxPropertyInfoMap &map ) const ;
|
||||
public:
|
||||
private:
|
||||
const wxChar *m_className;
|
||||
int m_objectSize;
|
||||
wxObjectConstructorFn m_objectConstructor;
|
||||
@ -1799,8 +1803,6 @@ public:
|
||||
static wxClassInfo *sm_first;
|
||||
wxClassInfo *m_next;
|
||||
|
||||
// FIXME: this should be private (currently used directly by way too
|
||||
// many clients)
|
||||
static wxHashTable *sm_classTable;
|
||||
|
||||
protected :
|
||||
|
@ -77,9 +77,9 @@ wxPluginLibrary::wxPluginLibrary(const wxString &libname, int flags)
|
||||
: m_linkcount(1)
|
||||
, m_objcount(0)
|
||||
{
|
||||
m_before = wxClassInfo::sm_first;
|
||||
m_before = wxClassInfo::GetFirst();
|
||||
Load( libname, flags );
|
||||
m_after = wxClassInfo::sm_first;
|
||||
m_after = wxClassInfo::GetFirst();
|
||||
|
||||
if( m_handle != 0 )
|
||||
{
|
||||
@ -131,7 +131,7 @@ bool wxPluginLibrary::UnrefLib()
|
||||
|
||||
void wxPluginLibrary::UpdateClasses()
|
||||
{
|
||||
for (wxClassInfo *info = m_after; info != m_before; info = info->m_next)
|
||||
for (const wxClassInfo *info = m_after; info != m_before; info = info->GetNext())
|
||||
{
|
||||
if( info->GetClassName() )
|
||||
{
|
||||
@ -148,7 +148,7 @@ void wxPluginLibrary::RestoreClasses()
|
||||
if (!ms_classes)
|
||||
return;
|
||||
|
||||
for(wxClassInfo *info = m_after; info != m_before; info = info->m_next)
|
||||
for(const wxClassInfo *info = m_after; info != m_before; info = info->GetNext())
|
||||
{
|
||||
ms_classes->erase(ms_classes->find(info->GetClassName()));
|
||||
}
|
||||
@ -167,7 +167,7 @@ void wxPluginLibrary::RegisterModules()
|
||||
wxASSERT_MSG( m_linkcount == 1,
|
||||
_T("RegisterModules should only be called for the first load") );
|
||||
|
||||
for ( wxClassInfo *info = m_after; info != m_before; info = info->m_next)
|
||||
for ( const wxClassInfo *info = m_after; info != m_before; info = info->GetNext())
|
||||
{
|
||||
if( info->IsKindOf(CLASSINFO(wxModule)) )
|
||||
{
|
||||
|
@ -120,12 +120,13 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
|
||||
}
|
||||
else
|
||||
{
|
||||
wxClassInfo::sm_classTable->BeginFind();
|
||||
wxClassInfo::const_iterator it = wxClassInfo::begin_classinfo();
|
||||
|
||||
wxClassInfo* classInfo;
|
||||
const wxClassInfo* classInfo;
|
||||
|
||||
while((classInfo = NextBackend()) != NULL)
|
||||
while((classInfo = NextBackend(&it)) != NULL)
|
||||
{
|
||||
wxLogMessage( classInfo->GetClassName() );
|
||||
if(!DoCreate(classInfo, parent, id,
|
||||
pos, size, style, validator, name))
|
||||
continue;
|
||||
@ -183,11 +184,11 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
|
||||
}
|
||||
else
|
||||
{
|
||||
wxClassInfo::sm_classTable->BeginFind();
|
||||
wxClassInfo::const_iterator it = wxClassInfo::begin_classinfo();
|
||||
|
||||
wxClassInfo* classInfo;
|
||||
const wxClassInfo* classInfo;
|
||||
|
||||
while((classInfo = NextBackend()) != NULL)
|
||||
while((classInfo = NextBackend(&it)) != NULL)
|
||||
{
|
||||
if(!DoCreate(classInfo, parent, id,
|
||||
pos, size, style, validator, name))
|
||||
@ -212,7 +213,7 @@ bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
|
||||
//
|
||||
// Attempts to create the control from a backend
|
||||
//---------------------------------------------------------------------------
|
||||
bool wxMediaCtrl::DoCreate(wxClassInfo* classInfo,
|
||||
bool wxMediaCtrl::DoCreate(const wxClassInfo* classInfo,
|
||||
wxWindow* parent, wxWindowID id,
|
||||
const wxPoint& pos,
|
||||
const wxSize& size,
|
||||
@ -246,19 +247,17 @@ bool wxMediaCtrl::DoCreate(wxClassInfo* classInfo,
|
||||
// incompatible with the old 2.4 stable version - but since
|
||||
// we're in 2.5+ only we don't need to worry about the new version
|
||||
//---------------------------------------------------------------------------
|
||||
wxClassInfo* wxMediaCtrl::NextBackend()
|
||||
const wxClassInfo* wxMediaCtrl::NextBackend(wxClassInfo::const_iterator* it)
|
||||
{
|
||||
wxHashTable::compatibility_iterator
|
||||
node = wxClassInfo::sm_classTable->Next();
|
||||
while (node)
|
||||
for ( wxClassInfo::const_iterator end = wxClassInfo::end_classinfo();
|
||||
*it != end; ++(*it) )
|
||||
{
|
||||
wxClassInfo* classInfo = (wxClassInfo *)node->GetData();
|
||||
const wxClassInfo* classInfo = **it;
|
||||
if ( classInfo->IsKindOf(CLASSINFO(wxMediaBackend)) &&
|
||||
classInfo != CLASSINFO(wxMediaBackend) )
|
||||
{
|
||||
return classInfo;
|
||||
}
|
||||
node = wxClassInfo::sm_classTable->Next();
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -746,14 +746,13 @@ bool wxDebugContext::PrintClasses(void)
|
||||
}
|
||||
|
||||
int n = 0;
|
||||
wxHashTable::compatibility_iterator node;
|
||||
wxClassInfo *info;
|
||||
const wxClassInfo *info;
|
||||
|
||||
wxClassInfo::sm_classTable->BeginFind();
|
||||
node = wxClassInfo::sm_classTable->Next();
|
||||
while (node)
|
||||
for (wxClassInfo::const_iterator node = wxClassInfo::begin_classinfo(),
|
||||
end = wxClassInfo::end_classinfo();
|
||||
node != end; ++node)
|
||||
{
|
||||
info = (wxClassInfo *)node->GetData();
|
||||
info = *node;
|
||||
if (info->GetClassName())
|
||||
{
|
||||
wxString msg(info->GetClassName());
|
||||
@ -776,7 +775,6 @@ bool wxDebugContext::PrintClasses(void)
|
||||
|
||||
wxLogMessage(msg);
|
||||
}
|
||||
node = wxClassInfo::sm_classTable->Next();
|
||||
n ++;
|
||||
}
|
||||
wxLogMessage(wxEmptyString);
|
||||
|
@ -50,23 +50,20 @@ void wxModule::UnregisterModule(wxModule* module)
|
||||
// and register them.
|
||||
void wxModule::RegisterModules()
|
||||
{
|
||||
wxHashTable::compatibility_iterator node;
|
||||
wxClassInfo* classInfo;
|
||||
|
||||
wxClassInfo::sm_classTable->BeginFind();
|
||||
node = wxClassInfo::sm_classTable->Next();
|
||||
while (node)
|
||||
for (wxClassInfo::const_iterator it = wxClassInfo::begin_classinfo(),
|
||||
end = wxClassInfo::end_classinfo();
|
||||
it != end; ++it)
|
||||
{
|
||||
classInfo = (wxClassInfo *)node->GetData();
|
||||
const wxClassInfo* classInfo = *it;
|
||||
|
||||
if ( classInfo->IsKindOf(CLASSINFO(wxModule)) &&
|
||||
(classInfo != (& (wxModule::ms_classInfo))) )
|
||||
(classInfo != (& (wxModule::ms_classInfo))) )
|
||||
{
|
||||
wxLogTrace(TRACE_MODULE, wxT("Registering module %s"),
|
||||
classInfo->GetClassName());
|
||||
wxModule* module = (wxModule *)classInfo->CreateObject();
|
||||
RegisterModule(module);
|
||||
wxModule::RegisterModule(module);
|
||||
}
|
||||
node = wxClassInfo::sm_classTable->Next();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -288,6 +288,37 @@ wxObject *wxCreateDynamicObject(const wxChar *name)
|
||||
}
|
||||
}
|
||||
|
||||
// iterator interface
|
||||
wxClassInfo::const_iterator::value_type
|
||||
wxClassInfo::const_iterator::operator*() const
|
||||
{
|
||||
return (wxClassInfo*)m_node->GetData();
|
||||
}
|
||||
|
||||
wxClassInfo::const_iterator& wxClassInfo::const_iterator::operator++()
|
||||
{
|
||||
m_node = m_table->Next();
|
||||
return *this;
|
||||
}
|
||||
|
||||
const wxClassInfo::const_iterator wxClassInfo::const_iterator::operator++(int)
|
||||
{
|
||||
wxClassInfo::const_iterator tmp = *this;
|
||||
m_node = m_table->Next();
|
||||
return tmp;
|
||||
}
|
||||
|
||||
wxClassInfo::const_iterator wxClassInfo::begin_classinfo()
|
||||
{
|
||||
sm_classTable->BeginFind();
|
||||
|
||||
return const_iterator(sm_classTable->Next(), sm_classTable);
|
||||
}
|
||||
|
||||
wxClassInfo::const_iterator wxClassInfo::end_classinfo()
|
||||
{
|
||||
return const_iterator(NULL, NULL);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxObjectRefData
|
||||
|
Loading…
Reference in New Issue
Block a user