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:
|
of pkSymbol:
|
||||||
result = x.symbol == y.symbol
|
result = x.symbol == y.symbol
|
||||||
of pkRecord:
|
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:
|
of pkSequence:
|
||||||
for i, val in x.sequence:
|
for i, val in x.sequence:
|
||||||
if y.sequence[i] != val: return false
|
if y.sequence[i] != val: return false
|
||||||
result = true
|
result = true
|
||||||
of pkSet:
|
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:
|
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:
|
of pkEmbedded:
|
||||||
when A is B:
|
when A is B:
|
||||||
when A is void:
|
when A is void:
|
||||||
|
@ -689,11 +700,8 @@ proc toPreserve*[T](x: T; E = void): Preserve[E] =
|
||||||
when x.dot(key).hasCustomPragma(preservesSymbol):
|
when x.dot(key).hasCustomPragma(preservesSymbol):
|
||||||
toSymbol(val, E)
|
toSymbol(val, E)
|
||||||
elif x.dot(key).hasCustomPragma(preservesLiteral):
|
elif x.dot(key).hasCustomPragma(preservesLiteral):
|
||||||
when E is void:
|
const lit = parsePreserves(x.dot(key).getCustomPragmaVal(preservesLiteral))
|
||||||
const lit = parsePreserves(x.dot(key).getCustomPragmaVal(preservesLiteral))
|
cast[Preserve[E]](lit)
|
||||||
else:
|
|
||||||
let lit = parsePreserves(x.dot(key).getCustomPragmaVal(preservesLiteral), E)
|
|
||||||
lit
|
|
||||||
else:
|
else:
|
||||||
toPreserve(val, E)
|
toPreserve(val, E)
|
||||||
when T.hasCustomPragma(unpreservable): {.fatal: "unpreservable type".}
|
when T.hasCustomPragma(unpreservable): {.fatal: "unpreservable type".}
|
||||||
|
@ -879,10 +887,7 @@ proc fromPreserve*[T, E](v: var T; pr: Preserve[E]): bool =
|
||||||
else:
|
else:
|
||||||
false
|
false
|
||||||
elif v.dot(key).hasCustomPragma(preservesLiteral):
|
elif v.dot(key).hasCustomPragma(preservesLiteral):
|
||||||
when E is void:
|
const lit = parsePreserves(v.dot(key).getCustomPragmaVal(preservesLiteral))
|
||||||
const lit = parsePreserves(v.dot(key).getCustomPragmaVal(preservesLiteral))
|
|
||||||
else:
|
|
||||||
let lit = parsePreserves(v.dot(key).getCustomPragmaVal(preservesLiteral), E)
|
|
||||||
pr == lit
|
pr == lit
|
||||||
else:
|
else:
|
||||||
fromPreserve(val, pr)
|
fromPreserve(val, pr)
|
||||||
|
|
Loading…
Reference in New Issue