From b9313605a141da7416d6c60c640aa0b9ab26e4f4 Mon Sep 17 00:00:00 2001 From: Jaremy Creechley Date: Tue, 19 Sep 2023 19:24:56 -0700 Subject: [PATCH] setup simple table --- datastore/memoryds.nim | 64 ++++++++++++++++++++++++++- tests/datastore/testthreadproxyds.nim | 2 +- 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/datastore/memoryds.nim b/datastore/memoryds.nim index f928960..7884478 100644 --- a/datastore/memoryds.nim +++ b/datastore/memoryds.nim @@ -19,10 +19,72 @@ push: {.upraises: [].} import std/locks +type + SimpleTable*[N: static int] = object + data*: array[N, tuple[used: bool, key: KeyBuffer, val: ValueBuffer]] + curr*: int + +proc hasKey*[N](table: var SimpleTable[N], key: KeyBuffer): bool = + for (u, k, _) in table.data: + if u and key == k: + return true + +proc `[]`*[N](table: var SimpleTable[N], key: KeyBuffer): ValueBuffer {.raises: [KeyError].} = + for item in table.data: + if item.used and item.key == key: + return item.val + raise newException(KeyError, "no such key") + +proc `[]=`*[N](table: var SimpleTable[N], key: KeyBuffer, value: ValueBuffer) = + for item in table.data.mitems(): + if item.used == false: + item = (true, key, value) + return + +proc clear*[N](table: var SimpleTable[N]) = + for item in table.data.mitems(): + item.used = false + +proc pop*[N](table: var SimpleTable[N], key: KeyBuffer, value: var ValueBuffer): bool = + for item in table.data.mitems(): + if item.used and item.key == key: + value = item.val + item.used = false + return true + +iterator keys*[N](table: var SimpleTable[N]): KeyBuffer = + for (u, k, _) in table.data: + if u: + yield k + +when isMainModule: + import unittest2 + + suite "simple table": + + var table: SimpleTable[10] + let k1 = KeyBuffer.new("test") + let v1 = ValueBuffer.new("hello world!") + + test "put": + table[k1] = v1 + test "hasKey": + check table.hasKey(k1) + test "get": + let res = table[k1] + check res.toString == "hello world!" + test "delete": + var res: ValueBuffer + check table.pop(k1, res) + check res.toString == "hello world!" + expect KeyError: + let res = table[k1] + check res.toString == "hello world!" + type MemoryDatastore* = ref object of Datastore lock*: Lock - store*: Table[KeyBuffer, ValueBuffer] + store*: SimpleTable[10_000] method has*( self: MemoryDatastore, diff --git a/tests/datastore/testthreadproxyds.nim b/tests/datastore/testthreadproxyds.nim index 2290639..8946a93 100644 --- a/tests/datastore/testthreadproxyds.nim +++ b/tests/datastore/testthreadproxyds.nim @@ -103,7 +103,7 @@ proc testThreadProxyQuery() = check res.len() > 0 when isMainModule: - for i in 1..100: + for i in 1..1: testThreadProxy() testThreadProxyBasics() # testThreadProxyQuery()