added amb1336 - GetTrieSize()
authorDavid Anderson <dvander@alliedmods.net>
Thu Jan 03 06:11:26 2008 +0000 (2008-01-03)
changeset 182997cd42e800e8
parent 1828 0df571678652
child 1830 1effda144231
added amb1336 - GetTrieSize()
core/smn_adt_trie.cpp
plugins/include/adt_trie.inc
public/sm_trie_tpl.h
     1.1 --- a/core/smn_adt_trie.cpp	Mon Dec 31 01:47:33 2007 +0000
     1.2 +++ b/core/smn_adt_trie.cpp	Thu Jan 03 06:11:26 2008 +0000
     1.3 @@ -498,6 +498,24 @@
     1.4  	return 1;
     1.5  }
     1.6  
     1.7 +static cell_t GetTrieSize(IPluginContext *pContext, const cell_t *params)
     1.8 +{
     1.9 +	Handle_t hndl;
    1.10 +	CellTrie *pTrie;
    1.11 +	HandleError err;
    1.12 +	HandleSecurity sec = HandleSecurity(pContext->GetIdentity(), g_pCoreIdent);
    1.13 +
    1.14 +	hndl = params[1];
    1.15 +
    1.16 +	if ((err = g_HandleSys.ReadHandle(hndl, htCellTrie, &sec, (void **)&pTrie))
    1.17 +		!= HandleError_None)
    1.18 +	{
    1.19 +		return pContext->ThrowNativeError("Invalid Handle %x (error %d)", hndl, err);
    1.20 +	}
    1.21 +
    1.22 +	return pTrie->trie.size();
    1.23 +}
    1.24 +
    1.25  REGISTER_NATIVES(trieNatives)
    1.26  {
    1.27  	{"ClearTrie",				ClearTrie},
    1.28 @@ -509,5 +527,6 @@
    1.29  	{"SetTrieArray",			SetTrieArray},
    1.30  	{"SetTrieString",			SetTrieString},
    1.31  	{"SetTrieValue",			SetTrieValue},
    1.32 +	{"GetTrieSize",				GetTrieSize},
    1.33  	{NULL,						NULL},
    1.34  };
     2.1 --- a/plugins/include/adt_trie.inc	Mon Dec 31 01:47:33 2007 +0000
     2.2 +++ b/plugins/include/adt_trie.inc	Thu Jan 03 06:11:26 2008 +0000
     2.3 @@ -144,3 +144,15 @@
     2.4   * @error			Invalid Handle.
     2.5   */
     2.6  native ClearTrie(Handle:trie);
     2.7 +
     2.8 +/**
     2.9 + * Retrieves the number of elements in a trie.
    2.10 + *
    2.11 + * Note that trie items are not enumerable/iteratable.  If you need to 
    2.12 + * retrieve the elements in a trie, store its keys in an ADT Array. 
    2.13 + *
    2.14 + * @param trie		Trie Handle.
    2.15 + * @return			Number of elements in the trie.
    2.16 + * @error			Invalid Handle.
    2.17 + */
    2.18 +native GetTrieSize(Handle:trie);
     3.1 --- a/public/sm_trie_tpl.h	Mon Dec 31 01:47:33 2007 +0000
     3.2 +++ b/public/sm_trie_tpl.h	Thu Jan 03 06:11:26 2008 +0000
     3.3 @@ -83,6 +83,8 @@
     3.4  		node->value.~K();
     3.5  		node->valset = false;
     3.6  
     3.7 +		m_numElements--;
     3.8 +
     3.9  		return true;
    3.10  	}
    3.11  
    3.12 @@ -164,6 +166,8 @@
    3.13  			m_empty->valset = true;
    3.14  			new (&m_empty->value) K(obj);
    3.15  
    3.16 +			m_numElements++;
    3.17 +
    3.18  			return true;
    3.19  		}
    3.20  
    3.21 @@ -204,6 +208,8 @@
    3.22  				node->valset = true;
    3.23  				new (&node->value) K(obj);
    3.24  
    3.25 +				m_numElements++;
    3.26 +
    3.27  				return true;
    3.28  			}
    3.29  			else if (node->parent != lastidx)
    3.30 @@ -403,6 +409,8 @@
    3.31  				node->valset = true;
    3.32  				new (&node->value) K(obj);
    3.33  
    3.34 +				m_numElements++;
    3.35 +
    3.36  				return true;
    3.37  			}
    3.38  			else
    3.39 @@ -421,6 +429,7 @@
    3.40  						{
    3.41  							node->valset = true;
    3.42  							new (&node->value) K(obj);
    3.43 +							m_numElements++;
    3.44  							return true;
    3.45  						}
    3.46  						/* Same string.  We can't insert. */
    3.47 @@ -605,6 +614,8 @@
    3.48  						}
    3.49  					}
    3.50  
    3.51 +					m_numElements++;
    3.52 +
    3.53  					/* Phew! */
    3.54  					return true;
    3.55  				}
    3.56 @@ -631,6 +642,7 @@
    3.57  		{
    3.58  			node->valset = true;
    3.59  			new (&node->value) K(obj);
    3.60 +			m_numElements++;
    3.61  			return true;
    3.62  		}
    3.63  
    3.64 @@ -644,6 +656,7 @@
    3.65  		m_baseSize = 256;
    3.66  		m_stSize = 256;
    3.67  		m_empty = NULL;
    3.68 +		m_numElements = 0;
    3.69  
    3.70  		internal_clear();
    3.71  	}
    3.72 @@ -775,6 +788,7 @@
    3.73  	void internal_clear()
    3.74  	{
    3.75  		m_tail = 0;
    3.76 +		m_numElements = 0;
    3.77  
    3.78  		memset(m_base, 0, sizeof(KTrieNode) * (m_baseSize + 1));
    3.79  		memset(m_stringtab, 0, sizeof(char) * m_stSize);
    3.80 @@ -895,6 +909,10 @@
    3.81  			+ m_stSize
    3.82  			+ sizeof(KTrieNode);
    3.83  	}
    3.84 +	size_t size()
    3.85 +	{
    3.86 +		return m_numElements;
    3.87 +	}
    3.88  private:
    3.89  	KTrieNode *m_base;			/* Base array for the sparse tables */
    3.90  	KTrieNode *m_empty;			/* Special case for empty strings */
    3.91 @@ -902,6 +920,7 @@
    3.92  	unsigned int m_baseSize;	/* Size of the base array, in members */
    3.93  	unsigned int m_stSize;		/* Size of the string table, in bytes */
    3.94  	unsigned int m_tail;		/* Current unused offset into the string table */
    3.95 +	size_t m_numElements;		/* Number of elements in use */
    3.96  };
    3.97  
    3.98  /**