Implement set with HashSet rather than CountTable

I didn't know HashSet was a thing.
This commit is contained in:
Emery Hemingway 2021-06-15 16:02:14 +02:00
parent db3e302067
commit 32ce6a71fe
1 changed files with 12 additions and 12 deletions

View File

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