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"