diff --git a/core/ConsoleDetours.cpp b/core/ConsoleDetours.cpp index da559f57..27932b63 100644 --- a/core/ConsoleDetours.cpp +++ b/core/ConsoleDetours.cpp @@ -50,6 +50,7 @@ #include "HalfLife2.h" #include "ConCommandBaseIterator.h" #include "logic_bridge.h" +#include #if defined PLATFORM_POSIX # include @@ -585,13 +586,11 @@ void ConsoleDetours::OnSourceModAllInitialized() void ConsoleDetours::OnSourceModShutdown() { - List::iterator iter = m_Listeners.begin(); - while (iter != m_Listeners.end()) + for (StringHashMap::iterator iter = m_Listeners.iter(); + !iter.empty(); + iter.next()) { - Listener *listener = (*iter); - g_Forwards.ReleaseForward(listener->forward); - delete listener; - iter = m_Listeners.erase(iter); + g_Forwards.ReleaseForward(iter->value); } g_Forwards.ReleaseForward(m_pForward); @@ -623,22 +622,15 @@ bool ConsoleDetours::AddListener(IPluginFunction *fun, const char *command) } else { - const char *str = UTIL_ToLowerCase(command); - Listener *listener; - Listener **plistener = m_CmdLookup.retrieve(str); - if (plistener == NULL) + ke::AutoArray str(UTIL_ToLowerCase(command)); + IChangeableForward *forward; + if (!m_Listeners.retrieve(str, &forward)) { - listener = new Listener; - listener->forward = g_Forwards.CreateForwardEx(NULL, ET_Hook, 3, NULL, Param_Cell, - Param_String, Param_Cell); - m_CmdLookup.insert(str, listener); + forward = g_Forwards.CreateForwardEx(NULL, ET_Hook, 3, NULL, Param_Cell, + Param_String, Param_Cell); + m_Listeners.insert(str, forward); } - else - { - listener = *plistener; - } - listener->forward->AddFunction(fun); - delete [] str; + forward->AddFunction(fun); } return true; @@ -652,14 +644,11 @@ bool ConsoleDetours::RemoveListener(IPluginFunction *fun, const char *command) } else { - const char *str = UTIL_ToLowerCase(command); - Listener *listener; - Listener **plistener = m_CmdLookup.retrieve(str); - delete [] str; - if (plistener == NULL) + ke::AutoArray str(UTIL_ToLowerCase(command)); + IChangeableForward *forward; + if (!m_Listeners.retrieve(str, &forward)) return false; - listener = *plistener; - return listener->forward->RemoveFunction(fun); + return forward->RemoveFunction(fun); } } @@ -695,18 +684,17 @@ cell_t ConsoleDetours::InternalDispatch(int client, const CCommand& args) if (result >= Pl_Handled) return result; - Listener **plistener = m_CmdLookup.retrieve(name); - if (plistener == NULL) + IChangeableForward *forward; + if (!m_Listeners.retrieve(name, &forward)) return result; - Listener *listener = *plistener; - if (listener->forward->GetFunctionCount() == 0) + if (forward->GetFunctionCount() == 0) return result; cell_t result2 = Pl_Continue; - listener->forward->PushCell(client); - listener->forward->PushString(name); - listener->forward->PushCell(args.ArgC() - 1); - listener->forward->Execute(&result2, NULL); + forward->PushCell(client); + forward->PushString(name); + forward->PushCell(args.ArgC() - 1); + forward->Execute(&result2, NULL); if (result2 > result) result = result2; diff --git a/core/ConsoleDetours.h b/core/ConsoleDetours.h index d376f9b5..349041d7 100644 --- a/core/ConsoleDetours.h +++ b/core/ConsoleDetours.h @@ -34,7 +34,7 @@ #include "sm_globals.h" #include "sourcemm_api.h" #include "ForwardSys.h" -#include +#include class ConsoleDetours : public SMGlobalClass, @@ -43,10 +43,6 @@ class ConsoleDetours : friend class PlayerManager; friend class GenericCommandHooker; - struct Listener - { - IChangeableForward *forward; - }; public: ConsoleDetours(); public: //SMGlobalClass @@ -73,8 +69,7 @@ public: private: FeatureStatus status; IChangeableForward *m_pForward; - KTrie m_CmdLookup; - List m_Listeners; + StringHashMap m_Listeners; }; extern ConsoleDetours g_ConsoleDetours; diff --git a/public/sm_stringhashmap.h b/public/sm_stringhashmap.h index 2ff68b3d..093bec0f 100644 --- a/public/sm_stringhashmap.h +++ b/public/sm_stringhashmap.h @@ -115,6 +115,7 @@ public: } typedef typename Internal::Result Result; + typedef typename Internal::iterator iterator; // Some KTrie-like helper functions. bool retrieve(const char *aKey, T *aResult = NULL) @@ -191,6 +192,10 @@ public: internal_.clear(); } + iterator iter() { + return internal_.iter(); + } + size_t mem_usage() const { return internal_.estimateMemoryUse() + memory_used_; }