Equality across different embedded types
This commit is contained in:
parent
0387cbc7eb
commit
d1be46de49
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue