1.1 --- a/core/HalfLife2.cpp Sun Aug 25 11:59:48 2013 -0700
1.2 +++ b/core/HalfLife2.cpp Sun Aug 25 11:59:48 2013 -0700
1.3 @@ -1,5 +1,5 @@
1.4 /**
1.5 - * vim: set ts=4 :
1.6 + * vim: set ts=4 sw=4 tw=99 noet :
1.7 * =============================================================================
1.8 * SourceMod
1.9 * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
1.10 @@ -76,51 +76,17 @@
1.11 static void *g_EntList = NULL;
1.12 static int entInfoOffset = -1;
1.13
1.14 -namespace SourceHook
1.15 -{
1.16 - template<>
1.17 - int HashFunction<datamap_t *>(datamap_t * const &k)
1.18 - {
1.19 - return reinterpret_cast<int>(k);
1.20 - }
1.21 -
1.22 - template<>
1.23 - int Compare<datamap_t *>(datamap_t * const &k1, datamap_t * const &k2)
1.24 - {
1.25 - return (k1-k2);
1.26 - }
1.27 -}
1.28 -
1.29 CHalfLife2::CHalfLife2()
1.30 {
1.31 - m_pClasses = sm_trie_create();
1.32 }
1.33
1.34 CHalfLife2::~CHalfLife2()
1.35 {
1.36 - sm_trie_destroy(m_pClasses);
1.37 -
1.38 - List<DataTableInfo *>::iterator iter;
1.39 - DataTableInfo *pInfo;
1.40 - for (iter=m_Tables.begin(); iter!=m_Tables.end(); iter++)
1.41 - {
1.42 - pInfo = (*iter);
1.43 - delete pInfo;
1.44 - }
1.45 -
1.46 - m_Tables.clear();
1.47 + for (NameHashSet<DataTableInfo *>::iterator iter = m_Classes.iter(); !iter.empty(); iter.next())
1.48 + delete *iter;
1.49
1.50 - THash<datamap_t *, DataMapTrie>::iterator h_iter;
1.51 - for (h_iter=m_Maps.begin(); h_iter!=m_Maps.end(); h_iter++)
1.52 - {
1.53 - if (h_iter->val.trie)
1.54 - {
1.55 - delete h_iter->val.trie;
1.56 - h_iter->val.trie = NULL;
1.57 - }
1.58 - }
1.59 -
1.60 - m_Maps.clear();
1.61 + for (DataTableMap::iterator iter = m_Maps.iter(); !iter.empty(); iter.next())
1.62 + delete iter->value;
1.63 }
1.64
1.65 #if SOURCE_ENGINE != SE_DARKMESSIAH
1.66 @@ -379,36 +345,29 @@
1.67 DataTableInfo *pInfo = _FindServerClass(classname);
1.68
1.69 if (!pInfo)
1.70 - {
1.71 return NULL;
1.72 - }
1.73
1.74 return pInfo->sc;
1.75 }
1.76
1.77 DataTableInfo *CHalfLife2::_FindServerClass(const char *classname)
1.78 {
1.79 - DataTableInfo *pInfo = NULL;
1.80 -
1.81 - if (!sm_trie_retrieve(m_pClasses, classname, (void **)&pInfo))
1.82 + DataTableInfo *pInfo;
1.83 + if (!m_Classes.retrieve(classname, &pInfo))
1.84 {
1.85 ServerClass *sc = gamedll->GetAllServerClasses();
1.86 while (sc)
1.87 {
1.88 if (strcmp(classname, sc->GetName()) == 0)
1.89 {
1.90 - pInfo = new DataTableInfo;
1.91 - pInfo->sc = sc;
1.92 - sm_trie_insert(m_pClasses, classname, pInfo);
1.93 - m_Tables.push_back(pInfo);
1.94 + pInfo = new DataTableInfo(sc);
1.95 + m_Classes.insert(classname, pInfo);
1.96 break;
1.97 }
1.98 sc = sc->m_pNext;
1.99 }
1.100 if (!pInfo)
1.101 - {
1.102 return NULL;
1.103 - }
1.104 }
1.105
1.106 return pInfo;
1.107 @@ -424,7 +383,7 @@
1.108 return false;
1.109 }
1.110
1.111 - if ((prop = pInfo->lookup.retrieve(offset)) == NULL)
1.112 + if (!pInfo->lookup.retrieve(offset, info))
1.113 {
1.114 sm_sendprop_info_t temp_info;
1.115
1.116 @@ -436,10 +395,6 @@
1.117 pInfo->lookup.insert(offset, temp_info);
1.118 *info = temp_info;
1.119 }
1.120 - else
1.121 - {
1.122 - *info = *prop;
1.123 - }
1.124
1.125 return true;
1.126 }
1.127 @@ -470,32 +425,21 @@
1.128
1.129 bool CHalfLife2::FindDataMapInfo(datamap_t *pMap, const char *offset, sm_datatable_info_t *pDataTable)
1.130 {
1.131 - DataMapTrie &val = m_Maps[pMap];
1.132 + DataTableMap::Insert i = m_Maps.findForAdd(pMap);
1.133 + if (!i.found())
1.134 + m_Maps.add(i, pMap, new DataMapCache());
1.135
1.136 - if (!val.trie)
1.137 - {
1.138 - val.trie = new KTrie<sm_datatable_info_t>;
1.139 - }
1.140 -
1.141 - sm_datatable_info_t * pNewTable = val.trie->retrieve(offset);
1.142 -
1.143 - if (!pNewTable)
1.144 + DataMapCache *cache = i->value;
1.145 +
1.146 + sm_datatable_info_t *pNewTable;
1.147 + if (!cache->retrieve(offset, pDataTable))
1.148 {
1.149 - if (UTIL_FindDataMapInfo(pMap, offset, pDataTable))
1.150 - {
1.151 - val.trie->insert(offset, *pDataTable);
1.152 - }
1.153 - else
1.154 - {
1.155 - pDataTable->prop = NULL;
1.156 - }
1.157 - }
1.158 - else
1.159 - {
1.160 - *pDataTable = *pNewTable;
1.161 + if (!UTIL_FindDataMapInfo(pMap, offset, pDataTable))
1.162 + return false;
1.163 + cache->insert(offset, *pDataTable);
1.164 }
1.165
1.166 - return (pDataTable->prop != NULL);
1.167 + return true;
1.168 }
1.169
1.170 void CHalfLife2::SetEdictStateChanged(edict_t *pEdict, unsigned short offset)