add auto implementation of Pod::equals (#327)

This commit is contained in:
Daniel Gulotta 2025-07-01 11:09:35 -07:00 committed by GitHub
parent e0d2fce060
commit 335100d1d7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 21 additions and 75 deletions

View file

@ -1,5 +1,4 @@
use std::{
any::Any,
collections::HashMap,
sync::{LazyLock, Mutex},
};
@ -193,17 +192,6 @@ impl Pod for EmptyPod {
})
.expect("serialization to json")
}
fn as_any(&self) -> &dyn Any {
self
}
fn equals(&self, other: &dyn Pod) -> bool {
if let Some(other) = other.as_any().downcast_ref::<EmptyPod>() {
self == other
} else {
false
}
}
}
impl RecursivePod for EmptyPod {

View file

@ -676,17 +676,6 @@ impl Pod for MainPod {
})
.expect("serialization to json")
}
fn as_any(&self) -> &dyn Any {
self
}
fn equals(&self, other: &dyn Pod) -> bool {
if let Some(other) = other.as_any().downcast_ref::<MainPod>() {
self == other
} else {
false
}
}
}
impl RecursivePod for MainPod {

View file

@ -1,5 +1,3 @@
use std::any::Any;
use itertools::Itertools;
use crate::{
@ -69,17 +67,6 @@ impl Pod for MockEmptyPod {
fn serialize_data(&self) -> serde_json::Value {
serde_json::Value::Null
}
fn as_any(&self) -> &dyn Any {
self
}
fn equals(&self, other: &dyn Pod) -> bool {
if let Some(other) = other.as_any().downcast_ref::<MockEmptyPod>() {
self == other
} else {
false
}
}
}
impl RecursivePod for MockEmptyPod {

View file

@ -2,7 +2,7 @@
// MainPod
//
use std::{any::Any, fmt, iter};
use std::{fmt, iter};
use itertools::Itertools;
use serde::{Deserialize, Serialize};
@ -367,17 +367,6 @@ impl Pod for MockMainPod {
})
.expect("serialization to json")
}
fn as_any(&self) -> &dyn Any {
self
}
fn equals(&self, other: &dyn Pod) -> bool {
if let Some(other) = other.as_any().downcast_ref::<MockMainPod>() {
self == other
} else {
false
}
}
}
impl RecursivePod for MockMainPod {

View file

@ -1,4 +1,4 @@
use std::{any::Any, collections::HashMap};
use std::collections::HashMap;
use itertools::Itertools;
use serde::{Deserialize, Serialize};
@ -166,17 +166,6 @@ impl Pod for MockSignedPod {
})
.expect("serialization to json")
}
fn as_any(&self) -> &dyn Any {
self
}
fn equals(&self, other: &dyn Pod) -> bool {
if let Some(other) = other.as_any().downcast_ref::<MockSignedPod>() {
self == other
} else {
false
}
}
}
#[cfg(test)]

View file

@ -1,4 +1,4 @@
use std::{any::Any, collections::HashMap, sync::LazyLock};
use std::{collections::HashMap, sync::LazyLock};
use itertools::Itertools;
use num_bigint::{BigUint, RandBigInt};
@ -203,17 +203,6 @@ impl Pod for SignedPod {
})
.expect("serialization to json")
}
fn as_any(&self) -> &dyn Any {
self
}
fn equals(&self, other: &dyn Pod) -> bool {
if let Some(other) = other.as_any().downcast_ref::<SignedPod>() {
self == other
} else {
false
}
}
}
#[cfg(test)]

View file

@ -776,7 +776,21 @@ pub fn normalize_statement(statement: &Statement, self_id: PodId) -> Statement {
Statement::from_args(predicate, args).expect("statement was valid before normalization")
}
pub trait Pod: fmt::Debug + DynClone + Sync + Send + Any {
pub trait EqualsAny {
fn equals_any(&self, other: &dyn Any) -> bool;
}
impl<T: Any + Eq> EqualsAny for T {
fn equals_any(&self, other: &dyn Any) -> bool {
if let Some(o) = other.downcast_ref::<T>() {
self == o
} else {
false
}
}
}
pub trait Pod: fmt::Debug + DynClone + Sync + Send + Any + EqualsAny {
fn params(&self) -> &Params;
fn verify(&self) -> Result<(), BackendError>;
fn id(&self) -> PodId;
@ -808,8 +822,9 @@ pub trait Pod: fmt::Debug + DynClone + Sync + Send + Any {
.collect()
}
fn as_any(&self) -> &dyn Any;
fn equals(&self, other: &dyn Pod) -> bool;
fn equals(&self, other: &dyn Pod) -> bool {
self.equals_any(other as &dyn Any)
}
}
impl PartialEq for Box<dyn Pod> {
fn eq(&self, other: &Self) -> bool {