#[macro_export]
macro_rules! impl_stable_hash {
($T:ident$(<$lt:lifetime>)? {$($field:ident$(:$e:path)?),*}) => {
impl $crate::StableHash for $T$(<$lt>)? {
#[allow(unused_assignments)]
fn stable_hash<H: $crate::StableHasher>(&self, field_address: H::Addr, state: &mut H) {
let $T { $($field,)* } = self;
let mut index = 0;
$(
$(let $field = $e($field);)?
$crate::StableHash::stable_hash(&$field, $crate::FieldAddress::child(&field_address, index), state);
index += 1;
)*
}
}
};
($T:ident$(<$lt:lifetime>)? (transparent$(:$e:path)?)) => {
impl $crate::StableHash for $T$(<$lt>)? {
#[allow(unused_assignments)]
fn stable_hash<H: $crate::StableHasher>(&self, field_address: H::Addr, state: &mut H) {
let Self(transparent) = self;
$(let transparent = $e(transparent);)?
$crate::StableHash::stable_hash(&transparent, field_address, state);
}
}
};
}