1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
discard """
output: '''true'''
cmd: "nimrod cc --gc:none --hints:on $# $#"
"""
import hashes
type
TSlotEnum = enum seEmpty, seFilled, seDeleted
TKeyValuePair[A, B] = tuple[slot: TSlotEnum, key: A, val: B]
TKeyValuePairSeq[A, B] = seq[TKeyValuePair[A, B]]
TTable* {.final.}[A, B] = object
data: TKeyValuePairSeq[A, B]
counter: int
iterator mycountup(a, b: int): int =
var res = a
while res <= b:
yield res
inc(res)
iterator pairs*[A, B](t: TTable[A, B]): tuple[key: A, val: B] =
## iterates over any (key, value) pair in the table `t`.
var h = 0
while h <= high(t.data):
var k = t.data[h].key
if t.data[h].slot == seFilled: yield (k, t.data[h].val)
inc(h)
when false:
for h in mycountup(0, high(t.data)):
var k = t.data[h].key
if t.data[h].slot == seFilled: yield (k, t.data[h].val)
proc initTable*[A, B](initialSize=64): TTable[A, B] =
## creates a new hash table that is empty. `initialSize` needs to be
## a power of two.
result.counter = 0
newSeq(result.data, initialSize)
block Test1:
# generic cache does not instantiate the same iterator[types] twice. This
# means we have only one instantiation of 'h'. However, this is the same for
# a non-generic iterator!
var t = initTable[int, string]()
for k, v in t.pairs: nil
for k, v in t.pairs: nil
echo "true"
|