]> git.saurik.com Git - wxWidgets.git/commitdiff
Make wxClassInfo attributes private. Replace
authorMattia Barbon <mbarbon@cpan.org>
Sun, 15 Apr 2007 11:43:37 +0000 (11:43 +0000)
committerMattia Barbon <mbarbon@cpan.org>
Sun, 15 Apr 2007 11:43:37 +0000 (11:43 +0000)
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

include/wx/dynload.h
include/wx/hash.h
include/wx/mediactrl.h
include/wx/object.h
include/wx/xti.h
src/common/dynload.cpp
src/common/mediactrlcmn.cpp
src/common/memory.cpp
src/common/module.cpp
src/common/object.cpp

index b754dee03fed44e344196df460ee6557213710a9..fbbf6f2e91f4a0194971dfafd8bb295498e1bd37 100644 (file)
@@ -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.
index 890213f021903824954f278d546f1b31ec264ac4..5cf258f5d20dc00fa0b1df744190ed4f78ee2fd3 100644 (file)
@@ -335,6 +335,8 @@ private:
 
 #else // if wxUSE_OLD_HASH_TABLE
 
+typedef wxNode wxHashTable_Node;
+
 class WXDLLIMPEXP_BASE wxHashTable : public wxObject
 {
 public:
index 4661bde448d484863787395d22380bbc4b94b1be..d5223615a295ff9a9754213e6d2ee36a1ca7d655 100644 (file)
@@ -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);
index a1d021fa9124bed4b9ec81316d3f419dce719b42..4b70945219b2059511a103d568d1a405e95c0b51 100644 (file)
@@ -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:
index 64d24b6dea9a4ad1b23bbbe1b273f074ad393668..1d423fd1a7b017fefc02fb16fd04b98bf81f6fea 100644 (file)
@@ -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 :
index 7759f6f8d1b9731f80742d62002e68c5ec8b1483..ffb80f1af64bf8670956021027e5b685438b784f 100644 (file)
@@ -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)) )
         {
index b0d93db7af568972e499f9115b370fb8bc05686d..ba9d1c0d9bcacef1be9259a1fb6e3392076c4acc 100644 (file)
@@ -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();
     }
 
     //
index 72169f2735aa64c1ee31a06f431fc199a968d43e..9bf20f536b4b61fe20d6b3701950b4b8b83bf495 100644 (file)
@@ -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);
index 9167848b89dd361e28d6f873da7f39347baedb91..9f867b4c25980e85b528e7df4ed6c7fbdf3e5c8e 100644 (file)
@@ -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();
     }
 }
 
index 0289fc2ec6d58db54a23d7c5a9f47024fef4464a..6b4d7e2ae9ca6c4d59bbee88f74ee166aa2f0223 100644 (file)
@@ -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