diff options
Diffstat (limited to 'tests/iter/titer2.nim')
-rw-r--r-- | tests/iter/titer2.nim | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/tests/iter/titer2.nim b/tests/iter/titer2.nim new file mode 100644 index 000000000..975cc786c --- /dev/null +++ b/tests/iter/titer2.nim @@ -0,0 +1,66 @@ +discard """ + output: '''true +3 +4 +5 +0 +1 +2 +3 +4''' + cmd: "nim $target --gc:none --hints:on --warnings:off $options $file" +""" + +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*[A, B] {.final.} = object + data: TKeyValuePairSeq[A, B] + counter: int + +iterator mycountup(a, b: int): int = + var res = a + while res <= b: + yield res + inc(res) + +when true: + iterator pairs*[A, B](t: TTable[A, B]): tuple[key: A, val: B] = + ## iterates over any (key, value) pair in the table `t`. + 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) +else: + iterator pairs*(t: TTable[int, string]): tuple[key: int, val: string] = + ## iterates over any (key, value) pair in the table `t`. + 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: discard + for k, v in t.pairs: discard + +echo "true" + +# bug #1560 +for i in @[3, 4, 5]: + echo($i) + +# bug #6992 +for i in 0 ..< 5u32: + echo i |