Equality across different embedded types

This commit is contained in:
Emery Hemingway 2021-10-25 21:30:55 +02:00
parent 0387cbc7eb
commit d1be46de49
1 changed files with 17 additions and 12 deletions

View File

@ -81,15 +81,26 @@ proc `==`*[A, B](x: Preserve[A]; y: Preserve[B]): bool =
of pkSymbol:
result = x.symbol == y.symbol
of pkRecord:
result = x.record == y.record
result = x.record.len == y.record.len
for i in 0..x.record.high:
if not result: break
result = result and (x.record[i] == y.record[i])
of pkSequence:
for i, val in x.sequence:
if y.sequence[i] != val: return false
result = true
of pkSet:
result = x.set == y.set
result = x.set.len == y.set.len
for i in 0..x.set.high:
if not result: break
result = result and (x.set[i] == y.set[i])
of pkDictionary:
result = x.dict == y.dict
result = x.dict.len == y.dict.len
for i in 0..x.dict.high:
if not result: break
result = result and
(x.dict[i].key == y.dict[i].key) and
(x.dict[i].val == y.dict[i].val)
of pkEmbedded:
when A is B:
when A is void:
@ -689,11 +700,8 @@ proc toPreserve*[T](x: T; E = void): Preserve[E] =
when x.dot(key).hasCustomPragma(preservesSymbol):
toSymbol(val, E)
elif x.dot(key).hasCustomPragma(preservesLiteral):
when E is void:
const lit = parsePreserves(x.dot(key).getCustomPragmaVal(preservesLiteral))
else:
let lit = parsePreserves(x.dot(key).getCustomPragmaVal(preservesLiteral), E)
lit
const lit = parsePreserves(x.dot(key).getCustomPragmaVal(preservesLiteral))
cast[Preserve[E]](lit)
else:
toPreserve(val, E)
when T.hasCustomPragma(unpreservable): {.fatal: "unpreservable type".}
@ -879,10 +887,7 @@ proc fromPreserve*[T, E](v: var T; pr: Preserve[E]): bool =
else:
false
elif v.dot(key).hasCustomPragma(preservesLiteral):
when E is void:
const lit = parsePreserves(v.dot(key).getCustomPragmaVal(preservesLiteral))
else:
let lit = parsePreserves(v.dot(key).getCustomPragmaVal(preservesLiteral), E)
const lit = parsePreserves(v.dot(key).getCustomPragmaVal(preservesLiteral))
pr == lit
else:
fromPreserve(val, pr)