snarkvm_console_program/data/plaintext/
equal.rsuse super::*;
impl<N: Network> Eq for Plaintext<N> {}
impl<N: Network> PartialEq for Plaintext<N> {
fn eq(&self, other: &Self) -> bool {
*self.is_equal(other)
}
}
impl<N: Network> Equal<Self> for Plaintext<N> {
type Output = Boolean<N>;
fn is_equal(&self, other: &Self) -> Self::Output {
match (self, other) {
(Self::Literal(a, _), Self::Literal(b, _)) => a.is_equal(b),
(Self::Struct(a, _), Self::Struct(b, _)) => match a.len() == b.len() {
true => {
Boolean::new(a.iter().zip_eq(b.iter()).all(|((name_a, plaintext_a), (name_b, plaintext_b))| {
*name_a.is_equal(name_b) && *plaintext_a.is_equal(plaintext_b)
}))
}
false => Boolean::new(false),
},
(Self::Array(a, _), Self::Array(b, _)) => match a.len() == b.len() {
true => {
Boolean::new(
a.iter().zip_eq(b.iter()).all(|(plaintext_a, plaintext_b)| *plaintext_a.is_equal(plaintext_b)),
)
}
false => Boolean::new(false),
},
(Self::Literal(..), _) | (Self::Struct(..), _) | (Self::Array(..), _) => Boolean::new(false),
}
}
fn is_not_equal(&self, other: &Self) -> Self::Output {
match (self, other) {
(Self::Literal(a, _), Self::Literal(b, _)) => a.is_not_equal(b),
(Self::Struct(a, _), Self::Struct(b, _)) => match a.len() == b.len() {
true => {
Boolean::new(a.iter().zip_eq(b.iter()).any(|((name_a, plaintext_a), (name_b, plaintext_b))| {
*(name_a.is_not_equal(name_b) | plaintext_a.is_not_equal(plaintext_b))
}))
}
false => Boolean::new(true),
},
(Self::Array(a, _), Self::Array(b, _)) => match a.len() == b.len() {
true => {
Boolean::new(
a.iter()
.zip_eq(b.iter())
.any(|(plaintext_a, plaintext_b)| *plaintext_a.is_not_equal(plaintext_b)),
)
}
false => Boolean::new(true),
},
(Self::Literal(..), _) | (Self::Struct(..), _) | (Self::Array(..), _) => Boolean::new(true),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use snarkvm_console_network::MainnetV0;
type CurrentNetwork = MainnetV0;
fn sample_plaintext() -> Plaintext<CurrentNetwork> {
Plaintext::<CurrentNetwork>::from_str(
r"{
a: true,
b: 123456789field,
c: 0group,
d: {
e: true,
f: 123456789field,
g: 0group
}
}",
)
.unwrap()
}
fn sample_mismatched_plaintext() -> Plaintext<CurrentNetwork> {
Plaintext::<CurrentNetwork>::from_str(
r"{
a: false,
b: 123456789field,
c: 0group,
d: {
e: true,
f: 123456789field,
g: 0group
}
}",
)
.unwrap()
}
fn check_is_equal() {
let plaintext = sample_plaintext();
let mismatched_plaintext = sample_mismatched_plaintext();
let candidate = plaintext.is_equal(&plaintext);
assert!(*candidate);
let candidate = plaintext.is_equal(&mismatched_plaintext);
assert!(!*candidate);
}
fn check_is_not_equal() {
let plaintext = sample_plaintext();
let mismatched_plaintext = sample_mismatched_plaintext();
let candidate = plaintext.is_not_equal(&mismatched_plaintext);
assert!(*candidate);
let candidate = plaintext.is_not_equal(&plaintext);
assert!(!*candidate);
}
#[test]
fn test_is_equal() {
check_is_equal()
}
#[test]
fn test_is_not_equal() {
check_is_not_equal()
}
}