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 /**