core/HalfLife2.cpp
changeset 4069 336e32fe098f
parent 3997 59bcfc51eb79
child 4084 672615211475
     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)