123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332 |
- discard """
- matrix: "--mm:refc; --mm:orc"
- """
- import tables, hashes
- import std/assertions
- type
- Person = object
- firstName, lastName: string
- proc hash(x: Person): Hash =
- ## Piggyback on the already available string hash proc.
- ##
- ## Without this proc nothing works!
- result = x.firstName.hash !& x.lastName.hash
- result = !$result
- var
- salaries = initTable[Person, int]()
- p1, p2: Person
- p1.firstName = "Jon"
- p1.lastName = "Ross"
- salaries[p1] = 30_000
- p2.firstName = "소진"
- p2.lastName = "박"
- salaries[p2] = 45_000
- var
- s2 = initOrderedTable[Person, int]()
- s3 = initCountTable[Person]()
- s2[p1] = 30_000
- s2[p2] = 45_000
- s3[p1] = 30_000
- s3[p2] = 45_000
- block: # Ordered table should preserve order after deletion
- var
- s4 = initOrderedTable[int, int]()
- s4[1] = 1
- s4[2] = 2
- s4[3] = 3
- var prev = 0
- for i in s4.values:
- doAssert(prev < i)
- prev = i
- s4.del(2)
- doAssert(2 notin s4)
- doAssert(s4.len == 2)
- prev = 0
- for i in s4.values:
- doAssert(prev < i)
- prev = i
- block: # Deletion from OrderedTable should account for collision groups. See issue #5057.
- # The bug is reproducible only with exact keys
- const key1 = "boy_jackpot.inGamma"
- const key2 = "boy_jackpot.outBlack"
- var t = {
- key1: 0,
- key2: 0
- }.toOrderedTable()
- t.del(key1)
- doAssert(t.len == 1)
- doAssert(key2 in t)
- var
- t1 = initCountTable[string]()
- t2 = initCountTable[string]()
- t1.inc("foo")
- t1.inc("bar", 2)
- t1.inc("baz", 3)
- t2.inc("foo", 4)
- t2.inc("bar")
- t2.inc("baz", 11)
- merge(t1, t2)
- doAssert(t1["foo"] == 5)
- doAssert(t1["bar"] == 3)
- doAssert(t1["baz"] == 14)
- let
- t1r = newCountTable[string]()
- t2r = newCountTable[string]()
- t1r.inc("foo")
- t1r.inc("bar", 2)
- t1r.inc("baz", 3)
- t2r.inc("foo", 4)
- t2r.inc("bar")
- t2r.inc("baz", 11)
- merge(t1r, t2r)
- doAssert(t1r["foo"] == 5)
- doAssert(t1r["bar"] == 3)
- doAssert(t1r["baz"] == 14)
- var
- t1l = initCountTable[string]()
- t2l = initCountTable[string]()
- t1l.inc("foo")
- t1l.inc("bar", 2)
- t1l.inc("baz", 3)
- t2l.inc("foo", 4)
- t2l.inc("bar")
- t2l.inc("baz", 11)
- block:
- const testKey = "TESTKEY"
- let t: CountTableRef[string] = newCountTable[string]()
- # Before, does not compile with error message:
- #test_counttable.nim(7, 43) template/generic instantiation from here
- #lib/pure/collections/tables.nim(117, 21) template/generic instantiation from here
- #lib/pure/collections/tableimpl.nim(32, 27) Error: undeclared field: 'hcode
- doAssert 0 == t[testKey]
- t.inc(testKey, 3)
- doAssert 3 == t[testKey]
- block:
- # Clear tests
- var clearTable = newTable[int, string]()
- clearTable[42] = "asd"
- clearTable[123123] = "piuyqwb "
- doAssert clearTable[42] == "asd"
- clearTable.clear()
- doAssert(not clearTable.hasKey(123123))
- doAssert clearTable.getOrDefault(42) == ""
- block: #5482
- var a = [("wrong?", "foo"), ("wrong?", "foo2")].newOrderedTable()
- var b = newOrderedTable[string, string](initialSize = 2)
- b["wrong?"] = "foo"
- b["wrong?"] = "foo2"
- doAssert a == b
- block: #5482
- var a = {"wrong?": "foo", "wrong?": "foo2"}.newOrderedTable()
- var b = newOrderedTable[string, string](initialSize = 2)
- b["wrong?"] = "foo"
- b["wrong?"] = "foo2"
- doAssert a == b
- block: #5487
- var a = {"wrong?": "foo", "wrong?": "foo2"}.newOrderedTable()
- var b = newOrderedTable[string, string]() # notice, default size!
- b["wrong?"] = "foo"
- b["wrong?"] = "foo2"
- doAssert a == b
- block: #5487
- var a = [("wrong?", "foo"), ("wrong?", "foo2")].newOrderedTable()
- var b = newOrderedTable[string, string]() # notice, default size!
- b["wrong?"] = "foo"
- b["wrong?"] = "foo2"
- doAssert a == b
- block:
- var a = {"wrong?": "foo", "wrong?": "foo2"}.newOrderedTable()
- var b = [("wrong?", "foo"), ("wrong?", "foo2")].newOrderedTable()
- var c = newOrderedTable[string, string]() # notice, default size!
- c["wrong?"] = "foo"
- c["wrong?"] = "foo2"
- doAssert a == b
- doAssert a == c
- block: #6250
- let
- a = {3: 1}.toOrderedTable
- b = {3: 2}.toOrderedTable
- doAssert((a == b) == false)
- doAssert((b == a) == false)
- block: #6250
- let
- a = {3: 2}.toOrderedTable
- b = {3: 2}.toOrderedTable
- doAssert((a == b) == true)
- doAssert((b == a) == true)
- block: # CountTable.smallest
- let t = toCountTable([0, 0, 5, 5, 5])
- doAssert t.smallest == (0, 2)
- block: #10065
- let t = toCountTable("abracadabra")
- doAssert t['z'] == 0
- var t_mut = toCountTable("abracadabra")
- doAssert t_mut['z'] == 0
- # the previous read may not have modified the table.
- doAssert t_mut.hasKey('z') == false
- t_mut['z'] = 1
- doAssert t_mut['z'] == 1
- doAssert t_mut.hasKey('z') == true
- block: #12813 #13079
- var t = toCountTable("abracadabra")
- doAssert len(t) == 5
- t['a'] = 0 # remove a key
- doAssert len(t) == 4
- block:
- var tp: Table[string, string] = initTable[string, string]()
- doAssert "test1" == tp.getOrDefault("test1", "test1")
- tp["test2"] = "test2"
- doAssert "test2" == tp.getOrDefault("test2", "test1")
- var tr: TableRef[string, string] = newTable[string, string]()
- doAssert "test1" == tr.getOrDefault("test1", "test1")
- tr["test2"] = "test2"
- doAssert "test2" == tr.getOrDefault("test2", "test1")
- var op: OrderedTable[string, string] = initOrderedTable[string, string]()
- doAssert "test1" == op.getOrDefault("test1", "test1")
- op["test2"] = "test2"
- doAssert "test2" == op.getOrDefault("test2", "test1")
- var orf: OrderedTableRef[string, string] = newOrderedTable[string, string]()
- doAssert "test1" == orf.getOrDefault("test1", "test1")
- orf["test2"] = "test2"
- doAssert "test2" == orf.getOrDefault("test2", "test1")
- block tableWithoutInit:
- var
- a: Table[string, int]
- b: Table[string, int]
- c: Table[string, int]
- d: Table[string, int]
- e: Table[string, int]
- a["a"] = 7
- doAssert a.hasKey("a")
- doAssert a.len == 1
- doAssert a["a"] == 7
- a["a"] = 9
- doAssert a.len == 1
- doAssert a["a"] == 9
- doAssert b.hasKeyOrPut("b", 5) == false
- doAssert b.hasKey("b")
- doAssert b.hasKeyOrPut("b", 8)
- doAssert b["b"] == 5
- doAssert c.getOrDefault("a") == 0
- doAssert c.getOrDefault("a", 3) == 3
- c["a"] = 6
- doAssert c.getOrDefault("a", 3) == 6
- doAssert d.mgetOrPut("a", 3) == 3
- doAssert d.mgetOrPut("a", 6) == 3
- var x = 99
- doAssert e.pop("a", x) == false
- doAssert x == 99
- e["a"] = 77
- doAssert e.pop("a", x)
- doAssert x == 77
- block orderedTableWithoutInit:
- var
- a: OrderedTable[string, int]
- b: OrderedTable[string, int]
- c: OrderedTable[string, int]
- d: OrderedTable[string, int]
- a["a"] = 7
- doAssert a.hasKey("a")
- doAssert a.len == 1
- doAssert a["a"] == 7
- a["a"] = 9
- doAssert a.len == 1
- doAssert a["a"] == 9
- doAssert b.hasKeyOrPut("b", 5) == false
- doAssert b.hasKey("b")
- doAssert b.hasKeyOrPut("b", 8)
- doAssert b["b"] == 5
- doAssert c.getOrDefault("a") == 0
- doAssert c.getOrDefault("a", 3) == 3
- c["a"] = 6
- doAssert c.getOrDefault("a", 3) == 6
- doAssert d.mgetOrPut("a", 3) == 3
- doAssert d.mgetOrPut("a", 6) == 3
- block countTableWithoutInit:
- var
- a: CountTable[string]
- b: CountTable[string]
- c: CountTable[string]
- d: CountTable[string]
- e: CountTable[string]
- a["a"] = 7
- doAssert a.hasKey("a")
- doAssert a.len == 1
- doAssert a["a"] == 7
- a["a"] = 9
- doAssert a.len == 1
- doAssert a["a"] == 9
- doAssert b["b"] == 0
- b.inc("b")
- doAssert b["b"] == 1
- doAssert c.getOrDefault("a") == 0
- doAssert c.getOrDefault("a", 3) == 3
- c["a"] = 6
- doAssert c.getOrDefault("a", 3) == 6
- e["f"] = 3
- merge(d, e)
- doAssert d.hasKey("f")
- d.inc("f")
- merge(d, e)
- doAssert d["f"] == 7
- block: # issue #23587
- type
- A = proc ()
- proc main =
- let repo = initTable[uint32, A]()
- let c1 = repo.getOrDefault(uint32(1), nil)
- doAssert c1.isNil
- let c2 = repo.getOrDefault(uint32(1), A(nil))
- doAssert c2.isNil
- main()
|