diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:41 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:41 +0000 |
commit | 4f9fe856a25ab29345b90e7725509e9ee38a37be (patch) | |
tree | e4ffd8a9374cae7b21f7cbfb352927e0e074aff6 /vendor/icu_provider/src/any.rs | |
parent | Adding upstream version 1.68.2+dfsg1. (diff) | |
download | rustc-5cd5bd4daf55da04d2c8e7c06c3067a027cfbfc2.tar.xz rustc-5cd5bd4daf55da04d2c8e7c06c3067a027cfbfc2.zip |
Adding upstream version 1.69.0+dfsg1.upstream/1.69.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | vendor/icu_provider/src/any.rs | 60 |
1 files changed, 56 insertions, 4 deletions
diff --git a/vendor/icu_provider/src/any.rs b/vendor/icu_provider/src/any.rs index 1c7a60435..989438c6b 100644 --- a/vendor/icu_provider/src/any.rs +++ b/vendor/icu_provider/src/any.rs @@ -18,7 +18,7 @@ use alloc::rc::Rc as SelectedRc; use alloc::sync::Arc as SelectedRc; /// A trait that allows to specify `Send + Sync` bounds that are only required when -/// the `sync` feature is enabled. Without the feature, this is an empty bound. +/// the `sync` Cargo feature is enabled. Without the Cargo feature, this is an empty bound. #[cfg(feature = "sync")] pub trait MaybeSendSync: Send + Sync {} #[cfg(feature = "sync")] @@ -115,6 +115,19 @@ impl AnyPayload { } } + /// Clones and then transforms a type-erased `AnyPayload` into a concrete `DataPayload<M>`. + pub fn downcast_cloned<M>(&self) -> Result<DataPayload<M>, DataError> + where + M: DataMarker + 'static, + // For the StructRef case: + M::Yokeable: ZeroFrom<'static, M::Yokeable>, + // For the PayloadRc case: + M::Yokeable: MaybeSendSync, + for<'a> YokeTraitHack<<M::Yokeable as Yokeable<'a>>::Output>: Clone, + { + self.clone().downcast() + } + /// Creates an `AnyPayload` from a static reference to a data struct. /// /// # Examples @@ -230,7 +243,7 @@ impl From<AnyResponse> for DataResponse<AnyMarker> { } impl AnyResponse { - /// Transforms a type-erased `DataResponse<AnyMarker>` into a concrete `DataResponse<M>`. + /// Transforms a type-erased `AnyResponse` into a concrete `DataResponse<M>`. #[inline] pub fn downcast<M>(self) -> Result<DataResponse<M>, DataError> where @@ -244,6 +257,39 @@ impl AnyResponse { payload: self.payload.map(|p| p.downcast()).transpose()?, }) } + + /// Clones and then transforms a type-erased `AnyResponse` into a concrete `DataResponse<M>`. + pub fn downcast_cloned<M>(&self) -> Result<DataResponse<M>, DataError> + where + M: DataMarker + 'static, + M::Yokeable: ZeroFrom<'static, M::Yokeable>, + M::Yokeable: MaybeSendSync, + for<'a> YokeTraitHack<<M::Yokeable as Yokeable<'a>>::Output>: Clone, + { + Ok(DataResponse { + metadata: self.metadata.clone(), + payload: self + .payload + .as_ref() + .map(|p| p.downcast_cloned()) + .transpose()?, + }) + } +} + +impl<M> DataResponse<M> +where + M: DataMarker + 'static, + M::Yokeable: MaybeSendSync, +{ + /// Moves the inner DataPayload to the heap (requiring an allocation) and returns it as an + /// erased `AnyResponse`. + pub fn wrap_into_any_response(self) -> AnyResponse { + AnyResponse { + metadata: self.metadata, + payload: self.payload.map(|p| p.wrap_into_any_payload()), + } + } } /// An object-safe data provider that returns data structs cast to `dyn Any` trait objects. @@ -345,7 +391,10 @@ where { #[inline] fn load(&self, req: DataRequest) -> Result<DataResponse<M>, DataError> { - self.0.load_any(M::KEY, req)?.downcast() + self.0 + .load_any(M::KEY, req)? + .downcast() + .map_err(|e| e.with_req(M::KEY, req)) } } @@ -359,7 +408,10 @@ where { #[inline] fn load_data(&self, key: DataKey, req: DataRequest) -> Result<DataResponse<M>, DataError> { - self.0.load_any(key, req)?.downcast() + self.0 + .load_any(key, req)? + .downcast() + .map_err(|e| e.with_req(key, req)) } } |