Implement set with HashSet rather than CountTable
I didn't know HashSet was a thing.
This commit is contained in:
parent
db3e302067
commit
32ce6a71fe
|
@ -1,6 +1,6 @@
|
||||||
# SPDX-License-Identifier: ISC
|
# SPDX-License-Identifier: ISC
|
||||||
|
|
||||||
import base64, endians, json, hashes, tables, streams
|
import base64, endians, json, hashes, sets, streams, tables
|
||||||
import bigints
|
import bigints
|
||||||
|
|
||||||
type
|
type
|
||||||
|
@ -33,7 +33,7 @@ type
|
||||||
of pkSequence:
|
of pkSequence:
|
||||||
seq*: seq[Preserve[T]]
|
seq*: seq[Preserve[T]]
|
||||||
of pkSet:
|
of pkSet:
|
||||||
set*: CountTable[Preserve[T]]
|
set*: HashSet[Preserve[T]]
|
||||||
of pkDictionary:
|
of pkDictionary:
|
||||||
dict*: Table[Preserve[T], Preserve[T]]
|
dict*: Table[Preserve[T], Preserve[T]]
|
||||||
of pkEmbedded:
|
of pkEmbedded:
|
||||||
|
@ -76,7 +76,7 @@ proc `$`*[T](prs: Preserve[T]): string =
|
||||||
result.add(']')
|
result.add(']')
|
||||||
of pkSet:
|
of pkSet:
|
||||||
result.add("#{")
|
result.add("#{")
|
||||||
for val in prs.set.keys:
|
for val in prs.set:
|
||||||
result.add($val)
|
result.add($val)
|
||||||
result.add(' ')
|
result.add(' ')
|
||||||
if result.len > 1:
|
if result.len > 1:
|
||||||
|
@ -208,10 +208,10 @@ proc `==`*[T](x, y: Preserve[T]): bool =
|
||||||
if y.seq[i] != val: return false
|
if y.seq[i] != val: return false
|
||||||
result = true
|
result = true
|
||||||
of pkSet:
|
of pkSet:
|
||||||
for val in x.set.keys:
|
for val in x.set:
|
||||||
if not y.set.hasKey(val): return false
|
if not y.set.contains(val): return false
|
||||||
for val in y.set.keys:
|
for val in y.set:
|
||||||
if not x.set.hasKey(val): return false
|
if not x.set.contains(val): return false
|
||||||
result = true
|
result = true
|
||||||
of pkDictionary:
|
of pkDictionary:
|
||||||
for (key, val) in x.dict.pairs:
|
for (key, val) in x.dict.pairs:
|
||||||
|
@ -248,7 +248,7 @@ proc hash*[T](prs: Preserve[T]): Hash =
|
||||||
for val in prs.seq:
|
for val in prs.seq:
|
||||||
h = h !& hash(val)
|
h = h !& hash(val)
|
||||||
of pkSet:
|
of pkSet:
|
||||||
for val in prs.set.keys:
|
for val in prs.set:
|
||||||
h = h !& hash(val)
|
h = h !& hash(val)
|
||||||
of pkDictionary:
|
of pkDictionary:
|
||||||
for (key, val) in prs.dict.pairs:
|
for (key, val) in prs.dict.pairs:
|
||||||
|
@ -359,8 +359,8 @@ proc write*[T](str: Stream; prs: Preserve[T]) =
|
||||||
str.write(0x84'u8)
|
str.write(0x84'u8)
|
||||||
of pkSet:
|
of pkSet:
|
||||||
str.write(0xb6'u8)
|
str.write(0xb6'u8)
|
||||||
for key in prs.set.keys:
|
for val in prs.set.items:
|
||||||
str.write(key)
|
str.write(val)
|
||||||
str.write(0x84'u8)
|
str.write(0x84'u8)
|
||||||
of pkDictionary:
|
of pkDictionary:
|
||||||
str.write(0xb7'u8)
|
str.write(0xb7'u8)
|
||||||
|
@ -423,8 +423,8 @@ proc parsePreserve*(s: Stream): Preserve[void] =
|
||||||
of 0xb6:
|
of 0xb6:
|
||||||
result = Preserve[void](kind: pkSet)
|
result = Preserve[void](kind: pkSet)
|
||||||
while s.peekUint8() != endMarker:
|
while s.peekUint8() != endMarker:
|
||||||
let key = s.parsePreserve()
|
let val = s.parsePreserve()
|
||||||
result.set[key] = 0
|
result.set.incl(val)
|
||||||
discard s.readUint8()
|
discard s.readUint8()
|
||||||
of 0xb7:
|
of 0xb7:
|
||||||
result = Preserve[void](kind: pkDictionary)
|
result = Preserve[void](kind: pkDictionary)
|
||||||
|
|
Loading…
Reference in New Issue