Add contains proc for tables to allow usage of in

This commit is contained in:
Jonathan 2015-05-05 23:26:58 +01:00
commit 8e4af5ace0
3 changed files with 43 additions and 15 deletions

View file

@ -215,6 +215,10 @@ proc hasKey*[A, B](t: Table[A, B], key: A): bool =
var hc: THash var hc: THash
result = rawGet(t, key, hc) >= 0 result = rawGet(t, key, hc) >= 0
proc contains*[A, B](t: Table[A, B], key: A): bool =
## alias of `hasKey` for use with the `in` operator.
return hasKey[A, B](t, key)
proc rawInsert[A, B](t: var Table[A, B], data: var KeyValuePairSeq[A, B], proc rawInsert[A, B](t: var Table[A, B], data: var KeyValuePairSeq[A, B],
key: A, val: B, hc: THash, h: THash) = key: A, val: B, hc: THash, h: THash) =
rawInsertImpl() rawInsertImpl()
@ -411,6 +415,10 @@ proc hasKey*[A, B](t: TableRef[A, B], key: A): bool =
## returns true iff `key` is in the table `t`. ## returns true iff `key` is in the table `t`.
result = t[].hasKey(key) result = t[].hasKey(key)
proc contains*[A, B](t: TableRef[A, B], key: A): bool =
## alias of `hasKey` for use with the `in` operator.
return hasKey[A, B](t, key)
proc `[]=`*[A, B](t: TableRef[A, B], key: A, val: B) = proc `[]=`*[A, B](t: TableRef[A, B], key: A, val: B) =
## puts a (key, value)-pair into `t`. ## puts a (key, value)-pair into `t`.
t[][key] = val t[][key] = val
@ -532,6 +540,10 @@ proc hasKey*[A, B](t: OrderedTable[A, B], key: A): bool =
var hc: THash var hc: THash
result = rawGet(t, key, hc) >= 0 result = rawGet(t, key, hc) >= 0
proc contains*[A, B](t: OrderedTable[A, B], key: A): bool =
## alias of `hasKey` for use with the `in` operator.
return hasKey[A, B](t, key)
proc rawInsert[A, B](t: var OrderedTable[A, B], proc rawInsert[A, B](t: var OrderedTable[A, B],
data: var OrderedKeyValuePairSeq[A, B], data: var OrderedKeyValuePairSeq[A, B],
key: A, val: B, hc: THash, h: THash) = key: A, val: B, hc: THash, h: THash) =
@ -704,6 +716,10 @@ proc hasKey*[A, B](t: OrderedTableRef[A, B], key: A): bool =
## returns true iff `key` is in the table `t`. ## returns true iff `key` is in the table `t`.
result = t[].hasKey(key) result = t[].hasKey(key)
proc contains*[A, B](t: OrderedTableRef[A, B], key: A): bool =
## alias of `hasKey` for use with the `in` operator.
return hasKey[A, B](t, key)
proc `[]=`*[A, B](t: OrderedTableRef[A, B], key: A, val: B) = proc `[]=`*[A, B](t: OrderedTableRef[A, B], key: A, val: B) =
## puts a (key, value)-pair into `t`. ## puts a (key, value)-pair into `t`.
t[][key] = val t[][key] = val
@ -804,6 +820,10 @@ proc hasKey*[A](t: CountTable[A], key: A): bool =
## returns true iff `key` is in the table `t`. ## returns true iff `key` is in the table `t`.
result = rawGet(t, key) >= 0 result = rawGet(t, key) >= 0
proc contains*[A](t: CountTable[A], key: A): bool =
## alias of `hasKey` for use with the `in` operator.
return hasKey[A](t, key)
proc rawInsert[A](t: CountTable[A], data: var seq[tuple[key: A, val: int]], proc rawInsert[A](t: CountTable[A], data: var seq[tuple[key: A, val: int]],
key: A, val: int) = key: A, val: int) =
var h: THash = hash(key) and high(data) var h: THash = hash(key) and high(data)
@ -945,6 +965,10 @@ proc hasKey*[A](t: CountTableRef[A], key: A): bool =
## returns true iff `key` is in the table `t`. ## returns true iff `key` is in the table `t`.
result = t[].hasKey(key) result = t[].hasKey(key)
proc contains*[A](t: CountTableRef[A], key: A): bool =
## alias of `hasKey` for use with the `in` operator.
return hasKey[A](t, key)
proc `[]=`*[A](t: CountTableRef[A], key: A, val: int) = proc `[]=`*[A](t: CountTableRef[A], key: A, val: int) =
## puts a (key, value)-pair into `t`. `val` has to be positive. ## puts a (key, value)-pair into `t`. `val` has to be positive.
assert val > 0 assert val > 0

View file

@ -62,6 +62,8 @@ block tableTest2:
assert t["123"] == 1.5 assert t["123"] == 1.5
assert t["111"] == 0.0 # deleted assert t["111"] == 0.0 # deleted
assert(not hasKey(t, "111")) assert(not hasKey(t, "111"))
assert "123" in t
assert("111" notin t)
for key, val in items(data): t[key] = val.toFloat for key, val in items(data): t[key] = val.toFloat
for key, val in items(data): assert t[key] == val.toFloat for key, val in items(data): assert t[key] == val.toFloat

View file

@ -61,7 +61,9 @@ block tableTest2:
assert t["123"] == 1.5 assert t["123"] == 1.5
assert t["111"] == 0.0 # deleted assert t["111"] == 0.0 # deleted
assert "123" in t
assert(not hasKey(t, "111")) assert(not hasKey(t, "111"))
assert "111" notin t
for key, val in items(data): t[key] = val.toFloat for key, val in items(data): t[key] = val.toFloat
for key, val in items(data): assert t[key] == val.toFloat for key, val in items(data): assert t[key] == val.toFloat