]> git.saurik.com Git - wxWidgets.git/commitdiff
small optimizations: m_isWindow and m_isCommandEvent flags introduced
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 23 Feb 1999 22:41:37 +0000 (22:41 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 23 Feb 1999 22:41:37 +0000 (22:41 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1762 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/event.h
src/common/event.cpp

index 80f227490191bd1ec4bf977f2975aa96db835b39..c74f328aae0ecb96f655dc7beccaa506c9c9df05 100644 (file)
@@ -283,6 +283,10 @@ public:
     void Skip(bool skip = TRUE) { m_skipped = skip; }
     bool GetSkipped() const { return m_skipped; };
 
+    // implementation only: this test is explicitlty anti OO and this functions
+    // exists only for optimization purposes
+    bool IsCommandEvent() const { return m_isCommandEvent; }
+
 public:
     bool              m_skipped;
     wxObject*         m_eventObject;
@@ -291,6 +295,10 @@ public:
     long              m_timeStamp;
     int               m_id;
     wxObject*         m_callbackUserData;
+
+    // optimization: instead of using costly IsKindOf() we keep a flag telling
+    // whether we're a command event (by far the most common case)
+    bool              m_isCommandEvent;
 };
 
 // Item or menu event class
@@ -1182,13 +1190,19 @@ private:
     static const wxEventTableEntry         sm_eventTableEntries[];
 
 protected:
-    static const wxEventTable        sm_eventTable;
-    virtual const wxEventTable*        GetEventTable() const;
+    static const wxEventTable sm_eventTable;
+
+    virtual const wxEventTable *GetEventTable() const;
+
 protected:
     wxEvtHandler*     m_nextHandler;
     wxEvtHandler*     m_previousHandler;
-    bool              m_enabled;                      // Is event handler enabled?
+    bool              m_enabled;           // Is event handler enabled?
     wxList*           m_dynamicEvents;
+
+    // optimization: instead of using costly IsKindOf() to decide whether we're
+    // a window (which is true in 99% of cases), use this flag
+    bool              m_isWindow;
 };
 
 typedef void (wxEvtHandler::*wxEventFunction)(wxEvent&);
index fb469f58e1978f3e73584a48cc44091e3e0dc6d3..2b596a135e091b0ddedbb025c0600843eb5c1180 100644 (file)
@@ -96,6 +96,7 @@ wxEvent::wxEvent(int theId)
     m_id = theId;
     m_skipped = FALSE;
     m_callbackUserData = (wxObject *) NULL;
+    m_isCommandEvent = FALSE;
 }
 
 /*
@@ -112,6 +113,7 @@ wxCommandEvent::wxCommandEvent(wxEventType commandType, int theId)
     m_commandInt = 0;
     m_id = theId;
     m_commandString = (char *) NULL;
+    m_isCommandEvent = TRUE;
 }
 
 /*
@@ -280,6 +282,7 @@ wxEvtHandler::wxEvtHandler()
     m_previousHandler = (wxEvtHandler *) NULL;
     m_enabled = TRUE;
     m_dynamicEvents = (wxList *) NULL;
+    m_isWindow = FALSE;
 }
 
 wxEvtHandler::~wxEvtHandler()
@@ -311,14 +314,15 @@ wxEvtHandler::~wxEvtHandler()
 
 bool wxEvtHandler::ProcessEvent(wxEvent& event)
 {
-    bool isWindow = IsKindOf(CLASSINFO(wxWindow));
+    // check that our flag corresponds to reality
+    wxASSERT( m_isWindow == IsKindOf(CLASSINFO(wxWindow)) );
 
     // An event handler can be enabled or disabled
     if ( GetEvtHandlerEnabled() )
     {
         // Handle per-instance dynamic event tables first
 
-        if (SearchDynamicEventTable( event ))
+        if ( m_dynamicEvents && SearchDynamicEventTable(event) )
             return TRUE;
 
         // Then static per-class event tables
@@ -333,24 +337,26 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event)
         // THIS CAN BE CURED if PushEventHandler is used instead of
         // SetEventHandler, and then processing will be passed down the
         // chain of event handlers.
-        if ( isWindow )
+        if ( m_isWindow )
         {
             wxWindow *win = (wxWindow *)this;
 
             // Can only use the validator of the window which
             // is receiving the event
-            if ( (win == event.GetEventObject()) &&
-                    win->GetValidator() &&
-                    win->GetValidator()->ProcessEvent(event))
+            if ( win == event.GetEventObject() )
             {
-                return TRUE;
+                wxValidator *validator = win->GetValidator();
+                if ( validator && validator->ProcessEvent(event) )
+                {
+                    return TRUE;
+                }
             }
         }
 
         // Search upwards through the inheritance hierarchy
-        while (table)
+        while ( table )
         {
-            if (SearchEventTable((wxEventTable&)*table, event))
+            if ( SearchEventTable((wxEventTable&)*table, event) )
                 return TRUE;
             table = table->baseTable;
         }
@@ -366,23 +372,25 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event)
     // Carry on up the parent-child hierarchy,
     // but only if event is a command event: it wouldn't
     // make sense for a parent to receive a child's size event, for example
-    if ( isWindow && event.IsKindOf(CLASSINFO(wxCommandEvent)) )
+    if ( m_isWindow && event.IsCommandEvent() )
     {
         wxWindow *win = (wxWindow *)this;
         wxWindow *parent = win->GetParent();
         if (parent && !parent->IsBeingDeleted())
-            return win->GetParent()->GetEventHandler()->ProcessEvent(event);
+            return parent->GetEventHandler()->ProcessEvent(event);
     }
 
     // Last try - application object.
-    // Special case: don't pass wxEVT_IDLE to wxApp, since it'll always swallow
-    // it. wxEVT_IDLE is sent explicitly to wxApp so it will be processed
-    // appropriately via SearchEventTable.
-    if ( wxTheApp && (this != wxTheApp) && (event.GetEventType() != wxEVT_IDLE)
-       )
+    if ( wxTheApp && (this != wxTheApp) )
     {
-        if ( wxTheApp->ProcessEvent(event) )
-            return TRUE;
+        // Special case: don't pass wxEVT_IDLE to wxApp, since it'll always
+        // swallow it. wxEVT_IDLE is sent explicitly to wxApp so it will be
+        // processed appropriately via SearchEventTable.
+        if ( event.GetEventType() != wxEVT_IDLE )
+        {
+            if ( wxTheApp->ProcessEvent(event) )
+                return TRUE;
+        }
     }
 
     return FALSE;
@@ -442,7 +450,8 @@ void wxEvtHandler::Connect( int id, int lastId,
 
 bool wxEvtHandler::SearchDynamicEventTable( wxEvent& event )
 {
-    if (!m_dynamicEvents) return FALSE;
+    wxCHECK_MSG( m_dynamicEvents, FALSE,
+                 "caller should check that we have dynamic events" );
 
     int commandId = event.GetId();
 
@@ -484,5 +493,5 @@ bool wxEvtHandler::OnClose()
     else
         return FALSE;
 }
-#endif
+#endif // WXWIN_COMPATIBILITY