From 77b4c05148bf2394b81bf701a184022501b8b92a Mon Sep 17 00:00:00 2001 From: James Date: Wed, 16 Oct 2024 11:19:11 -0400 Subject: [PATCH 1/3] feat: expand Seal api --- crates/primitives/src/sealed.rs | 53 +++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/crates/primitives/src/sealed.rs b/crates/primitives/src/sealed.rs index 232bc6baa1..6bdea7f4f3 100644 --- a/crates/primitives/src/sealed.rs +++ b/crates/primitives/src/sealed.rs @@ -1,6 +1,5 @@ -use derive_more::Deref; - use crate::B256; +use derive_more::Deref; /// A consensus hashable item, with its memoized hash. /// @@ -10,14 +9,54 @@ use crate::B256; #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "arbitrary", derive(proptest_derive::Arbitrary))] pub struct Sealed { - /// The inner item + /// The inner item. #[deref] + #[cfg_attr(feature = "serde", serde(flatten))] inner: T, + #[cfg_attr(feature = "serde", serde(flatten, alias = "hash"))] /// Its hash. seal: B256, } impl Sealed { + /// Seal the inner item. + pub fn new(inner: T) -> Self + where + T: Sealable, + { + let seal = inner.hash_slow(); + Self { inner, seal } + } + + /// Seal the inner item, by reference. + pub fn new_ref(inner: &T) -> Sealed<&T> + where + T: Sealable, + { + let seal = inner.hash_slow(); + Sealed { inner, seal } + } + + /// Seal the inner item with some function. + pub fn new_with(inner: T, f: F) -> Self + where + T: Sized, + F: FnOnce(&T) -> B256, + { + let seal = f(&inner); + Sealed::new_unchecked(inner, seal) + } + + /// Seal a reference to the inner item with some function. + pub fn new_ref_with(inner: &T, f: F) -> Sealed<&T> + where + T: Sized, + F: FnOnce(&T) -> B256, + { + let seal = f(inner); + Sealed::new_unchecked(inner, seal) + } + /// Instantiate without performing the hash. This should be used carefully. pub const fn new_unchecked(inner: T, seal: B256) -> Self { Self { inner, seal } @@ -89,8 +128,12 @@ pub trait Sealable: Sized { /// Seal the object by calculating the hash. This may be slow. fn seal_slow(self) -> Sealed { - let seal = self.hash_slow(); - Sealed::new_unchecked(self, seal) + Sealed::new(self) + } + + /// Seal the object by calculating the hash. This may be slow. + fn seal_ref(&self) -> Sealed<&Self> { + Sealed::new_ref(self) } /// Instantiate an unchecked seal. This should be used with caution. From e7686864b6a50ab7bfd88cc27beb487d5d8cdbf9 Mon Sep 17 00:00:00 2001 From: James Date: Wed, 16 Oct 2024 11:22:12 -0400 Subject: [PATCH 2/3] feat: seal_ref_unchecked --- crates/primitives/src/sealed.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/primitives/src/sealed.rs b/crates/primitives/src/sealed.rs index 6bdea7f4f3..65751e37dc 100644 --- a/crates/primitives/src/sealed.rs +++ b/crates/primitives/src/sealed.rs @@ -131,8 +131,8 @@ pub trait Sealable: Sized { Sealed::new(self) } - /// Seal the object by calculating the hash. This may be slow. - fn seal_ref(&self) -> Sealed<&Self> { + /// Seal a borrowed object by calculating the hash. This may be slow. + fn seal_ref_slow(&self) -> Sealed<&Self> { Sealed::new_ref(self) } @@ -140,4 +140,9 @@ pub trait Sealable: Sized { fn seal_unchecked(self, seal: B256) -> Sealed { Sealed::new_unchecked(self, seal) } + + /// Instantiate an unchecked seal. This should be used with caution. + fn seal_ref_unchecked(&self, seal: B256) -> Sealed<&Self> { + Sealed::new_unchecked(self, seal) + } } From 6dd983891e9ea93803b2778c823b7bfda145ddc0 Mon Sep 17 00:00:00 2001 From: James Date: Wed, 16 Oct 2024 11:39:55 -0400 Subject: [PATCH 3/3] lint: clippy --- crates/primitives/src/sealed.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/primitives/src/sealed.rs b/crates/primitives/src/sealed.rs index 65751e37dc..22859ac2b8 100644 --- a/crates/primitives/src/sealed.rs +++ b/crates/primitives/src/sealed.rs @@ -44,7 +44,7 @@ impl Sealed { F: FnOnce(&T) -> B256, { let seal = f(&inner); - Sealed::new_unchecked(inner, seal) + Self::new_unchecked(inner, seal) } /// Seal a reference to the inner item with some function.