Remove map snapshot API (was not yet ready).
This commit is contained in:
parent
49a643f411
commit
9f9f2baae2
@ -37,7 +37,6 @@
|
|||||||
#include "sm_memtable.h"
|
#include "sm_memtable.h"
|
||||||
|
|
||||||
HandleType_t htCellTrie;
|
HandleType_t htCellTrie;
|
||||||
HandleType_t htSnapshot;
|
|
||||||
|
|
||||||
enum EntryType
|
enum EntryType
|
||||||
{
|
{
|
||||||
@ -168,22 +167,6 @@ struct CellTrie : public ke::Refcounted<CellTrie>
|
|||||||
StringHashMap<Entry> map;
|
StringHashMap<Entry> map;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TrieSnapshot
|
|
||||||
{
|
|
||||||
TrieSnapshot()
|
|
||||||
: strings(128)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
size_t mem_usage()
|
|
||||||
{
|
|
||||||
return length * sizeof(int) + strings.GetMemTable()->GetMemUsage();
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t length;
|
|
||||||
ke::AutoArray<int> keys;
|
|
||||||
BaseStringTable strings;
|
|
||||||
};
|
|
||||||
|
|
||||||
class TrieHelpers :
|
class TrieHelpers :
|
||||||
public SMGlobalClass,
|
public SMGlobalClass,
|
||||||
public IHandleTypeDispatch
|
public IHandleTypeDispatch
|
||||||
@ -192,11 +175,9 @@ public: //SMGlobalClass
|
|||||||
void OnSourceModAllInitialized()
|
void OnSourceModAllInitialized()
|
||||||
{
|
{
|
||||||
htCellTrie = handlesys->CreateType("Trie", this, 0, NULL, NULL, g_pCoreIdent, NULL);
|
htCellTrie = handlesys->CreateType("Trie", this, 0, NULL, NULL, g_pCoreIdent, NULL);
|
||||||
htSnapshot = handlesys->CreateType("TrieSnapshot", this, 0, NULL, NULL, g_pCoreIdent, NULL);
|
|
||||||
}
|
}
|
||||||
void OnSourceModShutdown()
|
void OnSourceModShutdown()
|
||||||
{
|
{
|
||||||
handlesys->RemoveType(htSnapshot, g_pCoreIdent);
|
|
||||||
handlesys->RemoveType(htCellTrie, g_pCoreIdent);
|
handlesys->RemoveType(htCellTrie, g_pCoreIdent);
|
||||||
}
|
}
|
||||||
public: //IHandleTypeDispatch
|
public: //IHandleTypeDispatch
|
||||||
@ -206,9 +187,6 @@ public: //IHandleTypeDispatch
|
|||||||
{
|
{
|
||||||
CellTrie *pTrie = (CellTrie *)object;
|
CellTrie *pTrie = (CellTrie *)object;
|
||||||
pTrie->Release();
|
pTrie->Release();
|
||||||
} else {
|
|
||||||
TrieSnapshot *snapshot = (TrieSnapshot *)object;
|
|
||||||
delete snapshot;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool GetHandleApproxSize(HandleType_t type, void *object, unsigned int *pSize)
|
bool GetHandleApproxSize(HandleType_t type, void *object, unsigned int *pSize)
|
||||||
@ -217,9 +195,6 @@ public: //IHandleTypeDispatch
|
|||||||
{
|
{
|
||||||
CellTrie *pArray = (CellTrie *)object;
|
CellTrie *pArray = (CellTrie *)object;
|
||||||
*pSize = sizeof(CellTrie) + pArray->map.mem_usage();
|
*pSize = sizeof(CellTrie) + pArray->map.mem_usage();
|
||||||
} else {
|
|
||||||
TrieSnapshot *snapshot = (TrieSnapshot *)object;
|
|
||||||
*pSize = sizeof(TrieSnapshot) + snapshot->mem_usage();
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -540,100 +515,6 @@ static cell_t GetTrieSize(IPluginContext *pContext, const cell_t *params)
|
|||||||
return pTrie->map.elements();
|
return pTrie->map.elements();
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell_t CreateTrieSnapshot(IPluginContext *pContext, const cell_t *params)
|
|
||||||
{
|
|
||||||
HandleError err;
|
|
||||||
HandleSecurity sec = HandleSecurity(pContext->GetIdentity(), g_pCoreIdent);
|
|
||||||
|
|
||||||
Handle_t hndl = params[1];
|
|
||||||
|
|
||||||
CellTrie *pTrie;
|
|
||||||
if ((err = handlesys->ReadHandle(hndl, htCellTrie, &sec, (void **)&pTrie))
|
|
||||||
!= HandleError_None)
|
|
||||||
{
|
|
||||||
return pContext->ThrowNativeError("Invalid Handle %x (error %d)", hndl, err);
|
|
||||||
}
|
|
||||||
|
|
||||||
TrieSnapshot *snapshot = new TrieSnapshot;
|
|
||||||
snapshot->length = pTrie->map.elements();
|
|
||||||
snapshot->keys = new int[snapshot->length];
|
|
||||||
size_t i = 0;
|
|
||||||
for (StringHashMap<Entry>::iterator iter = pTrie->map.iter(); !iter.empty(); iter.next(), i++)
|
|
||||||
snapshot->keys[i] = snapshot->strings.AddString(iter->key.chars(), iter->key.length());
|
|
||||||
assert(i == snapshot->length);
|
|
||||||
|
|
||||||
if ((hndl = handlesys->CreateHandle(htSnapshot, snapshot, pContext->GetIdentity(), g_pCoreIdent, NULL))
|
|
||||||
== BAD_HANDLE)
|
|
||||||
{
|
|
||||||
delete snapshot;
|
|
||||||
return BAD_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return hndl;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell_t TrieSnapshotLength(IPluginContext *pContext, const cell_t *params)
|
|
||||||
{
|
|
||||||
HandleError err;
|
|
||||||
HandleSecurity sec = HandleSecurity(pContext->GetIdentity(), g_pCoreIdent);
|
|
||||||
|
|
||||||
Handle_t hndl = params[1];
|
|
||||||
|
|
||||||
TrieSnapshot *snapshot;
|
|
||||||
if ((err = handlesys->ReadHandle(hndl, htSnapshot, &sec, (void **)&snapshot))
|
|
||||||
!= HandleError_None)
|
|
||||||
{
|
|
||||||
return pContext->ThrowNativeError("Invalid Handle %x (error %d)", hndl, err);
|
|
||||||
}
|
|
||||||
|
|
||||||
return snapshot->length;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell_t TrieSnapshotKeyBufferSize(IPluginContext *pContext, const cell_t *params)
|
|
||||||
{
|
|
||||||
HandleError err;
|
|
||||||
HandleSecurity sec = HandleSecurity(pContext->GetIdentity(), g_pCoreIdent);
|
|
||||||
|
|
||||||
Handle_t hndl = params[1];
|
|
||||||
|
|
||||||
TrieSnapshot *snapshot;
|
|
||||||
if ((err = handlesys->ReadHandle(hndl, htSnapshot, &sec, (void **)&snapshot))
|
|
||||||
!= HandleError_None)
|
|
||||||
{
|
|
||||||
return pContext->ThrowNativeError("Invalid Handle %x (error %d)", hndl, err);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned index = params[2];
|
|
||||||
if (index >= snapshot->length)
|
|
||||||
return pContext->ThrowNativeError("Invalid index %d", index);
|
|
||||||
|
|
||||||
return strlen(snapshot->strings.GetString(snapshot->keys[index])) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cell_t GetTrieSnapshotKey(IPluginContext *pContext, const cell_t *params)
|
|
||||||
{
|
|
||||||
HandleError err;
|
|
||||||
HandleSecurity sec = HandleSecurity(pContext->GetIdentity(), g_pCoreIdent);
|
|
||||||
|
|
||||||
Handle_t hndl = params[1];
|
|
||||||
|
|
||||||
TrieSnapshot *snapshot;
|
|
||||||
if ((err = handlesys->ReadHandle(hndl, htSnapshot, &sec, (void **)&snapshot))
|
|
||||||
!= HandleError_None)
|
|
||||||
{
|
|
||||||
return pContext->ThrowNativeError("Invalid Handle %x (error %d)", hndl, err);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned index = params[2];
|
|
||||||
if (index >= snapshot->length)
|
|
||||||
return pContext->ThrowNativeError("Invalid index %d", index);
|
|
||||||
|
|
||||||
size_t written;
|
|
||||||
const char *str = snapshot->strings.GetString(snapshot->keys[index]);
|
|
||||||
pContext->StringToLocalUTF8(params[3], params[4], str, &written);
|
|
||||||
return written;
|
|
||||||
}
|
|
||||||
|
|
||||||
REGISTER_NATIVES(trieNatives)
|
REGISTER_NATIVES(trieNatives)
|
||||||
{
|
{
|
||||||
{"ClearTrie", ClearTrie},
|
{"ClearTrie", ClearTrie},
|
||||||
@ -646,9 +527,5 @@ REGISTER_NATIVES(trieNatives)
|
|||||||
{"SetTrieString", SetTrieString},
|
{"SetTrieString", SetTrieString},
|
||||||
{"SetTrieValue", SetTrieValue},
|
{"SetTrieValue", SetTrieValue},
|
||||||
{"GetTrieSize", GetTrieSize},
|
{"GetTrieSize", GetTrieSize},
|
||||||
{"CreateTrieSnapshot", CreateTrieSnapshot},
|
|
||||||
{"TrieSnapshotLength", TrieSnapshotLength},
|
|
||||||
{"TrieSnapshotKeyBufferSize", TrieSnapshotKeyBufferSize},
|
|
||||||
{"GetTrieSnapshotKey", GetTrieSnapshotKey},
|
|
||||||
{NULL, NULL},
|
{NULL, NULL},
|
||||||
};
|
};
|
||||||
|
@ -154,47 +154,3 @@ native ClearTrie(Handle:map);
|
|||||||
* @error Invalid Handle.
|
* @error Invalid Handle.
|
||||||
*/
|
*/
|
||||||
native GetTrieSize(Handle:map);
|
native GetTrieSize(Handle:map);
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a snapshot of all keys in the map. If the map is changed after this
|
|
||||||
* call, the changes are not reflected in the snapshot. Keys are not sorted.
|
|
||||||
*
|
|
||||||
* @param map Map Handle.
|
|
||||||
* @return New Map Snapshot Handle, which must be closed via CloseHandle().
|
|
||||||
* @error Invalid Handle.
|
|
||||||
*/
|
|
||||||
native Handle:CreateTrieSnapshot(Handle:map);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the number of keys in a map snapshot. Note that this may be
|
|
||||||
* different from the size of the map, since the map can change after the
|
|
||||||
* snapshot of its keys was taken.
|
|
||||||
*
|
|
||||||
* @param snapshot Map snapshot.
|
|
||||||
* @return Number of keys.
|
|
||||||
* @error Invalid Handle.
|
|
||||||
*/
|
|
||||||
native TrieSnapshotLength(Handle:snapshot);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the buffer size required to store a given key. That is, it returns
|
|
||||||
* the length of the key plus one.
|
|
||||||
*
|
|
||||||
* @param snapshot Map snapshot.
|
|
||||||
* @param index Key index (starting from 0).
|
|
||||||
* @return Buffer size required to store the key string.
|
|
||||||
* @error Invalid Handle or index out of range.
|
|
||||||
*/
|
|
||||||
native TrieSnapshotKeyBufferSize(Handle:snapshot, index);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the key string of a given key in a map snapshot.
|
|
||||||
*
|
|
||||||
* @param snapshot Map snapshot.
|
|
||||||
* @param index Key index (starting from 0).
|
|
||||||
* @param buffer String buffer.
|
|
||||||
* @param maxlength Maximum buffer length.
|
|
||||||
* @return Number of bytes written to the buffer.
|
|
||||||
* @error Invalid Handle or index out of range.
|
|
||||||
*/
|
|
||||||
native GetTrieSnapshotKey(Handle:snapshot, index, String:buffer[], maxlength);
|
|
||||||
|
@ -125,36 +125,6 @@ public Action:RunTests(argc)
|
|||||||
if (GetTrieSize(trie))
|
if (GetTrieSize(trie))
|
||||||
ThrowError("size should be 0");
|
ThrowError("size should be 0");
|
||||||
|
|
||||||
SetTrieString(trie, "adventure", "time!");
|
|
||||||
SetTrieString(trie, "butterflies", "bees");
|
|
||||||
SetTrieString(trie, "egg", "egg");
|
|
||||||
|
|
||||||
new Handle:keys = CreateTrieSnapshot(trie);
|
|
||||||
{
|
|
||||||
if (TrieSnapshotLength(keys) != 3)
|
|
||||||
ThrowError("trie snapshot length should be 3");
|
|
||||||
|
|
||||||
new bool:found[3];
|
|
||||||
for (new i = 0; i < TrieSnapshotLength(keys); i++) {
|
|
||||||
new size = TrieSnapshotKeyBufferSize(keys, i);
|
|
||||||
new String:buffer[size];
|
|
||||||
GetTrieSnapshotKey(keys, i, buffer, size);
|
|
||||||
|
|
||||||
if (strcmp(buffer, "adventure") == 0)
|
|
||||||
found[0] = true;
|
|
||||||
else if (strcmp(buffer, "butterflies") == 0)
|
|
||||||
found[1] = true;
|
|
||||||
else if (strcmp(buffer, "egg") == 0)
|
|
||||||
found[2] = true;
|
|
||||||
else
|
|
||||||
ThrowError("unexpected key: %s", buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found[0] || !found[1] || !found[2])
|
|
||||||
ThrowError("did not find all keys");
|
|
||||||
}
|
|
||||||
CloseHandle(keys);
|
|
||||||
|
|
||||||
PrintToServer("All tests passed!");
|
PrintToServer("All tests passed!");
|
||||||
CloseHandle(trie);
|
CloseHandle(trie);
|
||||||
return Plugin_Handled;
|
return Plugin_Handled;
|
||||||
|
Loading…
Reference in New Issue
Block a user