diff --git a/core/HalfLife2.cpp b/core/HalfLife2.cpp index 2e58b4b1..5e116f20 100644 --- a/core/HalfLife2.cpp +++ b/core/HalfLife2.cpp @@ -1,5 +1,5 @@ /** - * vim: set ts=4 : + * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= * SourceMod * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. @@ -76,51 +76,17 @@ ConVar *sv_lan = NULL; static void *g_EntList = NULL; static int entInfoOffset = -1; -namespace SourceHook -{ - template<> - int HashFunction(datamap_t * const &k) - { - return reinterpret_cast(k); - } - - template<> - int Compare(datamap_t * const &k1, datamap_t * const &k2) - { - return (k1-k2); - } -} - CHalfLife2::CHalfLife2() { - m_pClasses = sm_trie_create(); } CHalfLife2::~CHalfLife2() { - sm_trie_destroy(m_pClasses); + for (NameHashSet::iterator iter = m_Classes.iter(); !iter.empty(); iter.next()) + delete *iter; - List::iterator iter; - DataTableInfo *pInfo; - for (iter=m_Tables.begin(); iter!=m_Tables.end(); iter++) - { - pInfo = (*iter); - delete pInfo; - } - - m_Tables.clear(); - - THash::iterator h_iter; - for (h_iter=m_Maps.begin(); h_iter!=m_Maps.end(); h_iter++) - { - if (h_iter->val.trie) - { - delete h_iter->val.trie; - h_iter->val.trie = NULL; - } - } - - m_Maps.clear(); + for (DataTableMap::iterator iter = m_Maps.iter(); !iter.empty(); iter.next()) + delete iter->value; } #if SOURCE_ENGINE != SE_DARKMESSIAH @@ -379,36 +345,29 @@ ServerClass *CHalfLife2::FindServerClass(const char *classname) DataTableInfo *pInfo = _FindServerClass(classname); if (!pInfo) - { return NULL; - } return pInfo->sc; } DataTableInfo *CHalfLife2::_FindServerClass(const char *classname) { - DataTableInfo *pInfo = NULL; - - if (!sm_trie_retrieve(m_pClasses, classname, (void **)&pInfo)) + DataTableInfo *pInfo; + if (!m_Classes.retrieve(classname, &pInfo)) { ServerClass *sc = gamedll->GetAllServerClasses(); while (sc) { if (strcmp(classname, sc->GetName()) == 0) { - pInfo = new DataTableInfo; - pInfo->sc = sc; - sm_trie_insert(m_pClasses, classname, pInfo); - m_Tables.push_back(pInfo); + pInfo = new DataTableInfo(sc); + m_Classes.insert(classname, pInfo); break; } sc = sc->m_pNext; } if (!pInfo) - { return NULL; - } } return pInfo; @@ -424,7 +383,7 @@ bool CHalfLife2::FindSendPropInfo(const char *classname, const char *offset, sm_ return false; } - if ((prop = pInfo->lookup.retrieve(offset)) == NULL) + if (!pInfo->lookup.retrieve(offset, info)) { sm_sendprop_info_t temp_info; @@ -436,10 +395,6 @@ bool CHalfLife2::FindSendPropInfo(const char *classname, const char *offset, sm_ pInfo->lookup.insert(offset, temp_info); *info = temp_info; } - else - { - *info = *prop; - } return true; } @@ -470,32 +425,21 @@ typedescription_t *CHalfLife2::FindInDataMap(datamap_t *pMap, const char *offset bool CHalfLife2::FindDataMapInfo(datamap_t *pMap, const char *offset, sm_datatable_info_t *pDataTable) { - DataMapTrie &val = m_Maps[pMap]; + DataTableMap::Insert i = m_Maps.findForAdd(pMap); + if (!i.found()) + m_Maps.add(i, pMap, new DataMapCache()); - if (!val.trie) + DataMapCache *cache = i->value; + + sm_datatable_info_t *pNewTable; + if (!cache->retrieve(offset, pDataTable)) { - val.trie = new KTrie; - } - - sm_datatable_info_t * pNewTable = val.trie->retrieve(offset); - - if (!pNewTable) - { - if (UTIL_FindDataMapInfo(pMap, offset, pDataTable)) - { - val.trie->insert(offset, *pDataTable); - } - else - { - pDataTable->prop = NULL; - } - } - else - { - *pDataTable = *pNewTable; + if (!UTIL_FindDataMapInfo(pMap, offset, pDataTable)) + return false; + cache->insert(offset, *pDataTable); } - return (pDataTable->prop != NULL); + return true; } void CHalfLife2::SetEdictStateChanged(edict_t *pEdict, unsigned short offset) diff --git a/core/HalfLife2.h b/core/HalfLife2.h index be4fc4ec..2529f76b 100644 --- a/core/HalfLife2.h +++ b/core/HalfLife2.h @@ -1,5 +1,5 @@ /** - * vim: set ts=4 : + * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= * SourceMod * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. @@ -35,8 +35,10 @@ #include #include #include -#include -#include "sm_trie.h" +#include +#include +#include +#include #include "sm_globals.h" #include "sm_queue.h" #include @@ -59,16 +61,38 @@ using namespace SourceMod; struct DataTableInfo { + struct SendPropPolicy + { + static inline bool matches(const char *name, const sm_sendprop_info_t &info) + { + return strcmp(name, info.prop->GetName()) == 0; + } + }; + + static inline bool matches(const char *name, const DataTableInfo *info) + { + return strcmp(name, info->sc->GetName()) == 0; + } + + DataTableInfo(ServerClass *sc) + : sc(sc) + { + } + ServerClass *sc; - KTrie lookup; + NameHashSet lookup; }; -struct DataMapTrie +struct DataMapCachePolicy { - DataMapTrie() : trie(NULL) {} - KTrie *trie; + static inline bool matches(const char *name, const sm_datatable_info_t &info) + { + return strcmp(name, info.prop->fieldName) == 0; + } }; +typedef NameHashSet DataMapCache; + struct DelayedFakeCliCmd { String cmd; @@ -169,9 +193,10 @@ private: void InitLogicalEntData(); void InitCommandLine(); private: - Trie *m_pClasses; - List m_Tables; - THash m_Maps; + typedef ke::HashMap > DataTableMap; + + NameHashSet m_Classes; + DataTableMap m_Maps; int m_MsgTextMsg; int m_HinTextMsg; int m_SayTextMsg; diff --git a/core/logic/ExtensionSys.h b/core/logic/ExtensionSys.h index 151d7327..76dab140 100644 --- a/core/logic/ExtensionSys.h +++ b/core/logic/ExtensionSys.h @@ -36,7 +36,6 @@ #include #include #include -#include #include "common_logic.h" #include #include diff --git a/core/logic/smn_fakenatives.cpp b/core/logic/smn_fakenatives.cpp index 35597d31..3c084bff 100644 --- a/core/logic/smn_fakenatives.cpp +++ b/core/logic/smn_fakenatives.cpp @@ -31,7 +31,6 @@ #include #include -#include #include #include "common_logic.h" #include "ShareSys.h" diff --git a/public/amtl/am-hashmap.h b/public/amtl/am-hashmap.h index c4653096..bc913cdb 100644 --- a/public/amtl/am-hashmap.h +++ b/public/amtl/am-hashmap.h @@ -98,6 +98,7 @@ class HashMap : public AllocPolicy typedef typename Internal::Result Result; typedef typename Internal::Insert Insert; + typedef typename Internal::iterator iterator; template Result find(const Lookup &key) { @@ -131,6 +132,10 @@ class HashMap : public AllocPolicy return table_.add(i); } + iterator iter() { + return iterator(&table_); + } + void clear() { table_.clear(); } @@ -143,6 +148,17 @@ class HashMap : public AllocPolicy Internal table_; }; +template +struct PointerPolicy +{ + static inline uint32_t hash(T *p) { + return HashPointer(p); + } + static inline bool matches(T *p1, T *p2) { + return p1 == p2; + } +}; + } #endif // _include_amtl_hashmap_h_ diff --git a/public/amtl/am-hashtable.h b/public/amtl/am-hashtable.h index bcbe6584..3fbb0acd 100644 --- a/public/amtl/am-hashtable.h +++ b/public/amtl/am-hashtable.h @@ -472,7 +472,10 @@ class HashTable : public AllocPolicy table_->removeEntry(*i_); } - const Payload &operator *() const { + Payload *operator ->() const { + return &i_->payload(); + } + Payload &operator *() const { return i_->payload(); } diff --git a/public/sm_namehashset.h b/public/sm_namehashset.h index 5ce2d4dc..1c40d94b 100644 --- a/public/sm_namehashset.h +++ b/public/sm_namehashset.h @@ -105,6 +105,7 @@ public: typedef typename Internal::Result Result; typedef typename Internal::Insert Insert; + typedef typename Internal::iterator iterator; bool retrieve(const char *aKey, T *value) { @@ -147,6 +148,11 @@ public: table_.clear(); } + iterator iter() + { + return iterator(&table_); + } + private: Internal table_; };