Skip to content

Commit

Permalink
Add missing std pointer-like impls for DataProvider, DynamicDataProvi…
Browse files Browse the repository at this point in the history
  • Loading branch information
sffc committed May 8, 2024
1 parent 51bd08e commit 31e085a
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 8 deletions.
4 changes: 4 additions & 0 deletions provider/core/src/any.rs
Original file line number Diff line number Diff line change
Expand Up @@ -350,25 +350,29 @@ pub trait AnyProvider {
}

impl<'a, T: AnyProvider + ?Sized> AnyProvider for &'a T {
#[inline]
fn load_any(&self, key: DataKey, req: DataRequest) -> Result<AnyResponse, DataError> {
(**self).load_any(key, req)
}
}

impl<T: AnyProvider + ?Sized> AnyProvider for alloc::boxed::Box<T> {
#[inline]
fn load_any(&self, key: DataKey, req: DataRequest) -> Result<AnyResponse, DataError> {
(**self).load_any(key, req)
}
}

impl<T: AnyProvider + ?Sized> AnyProvider for alloc::rc::Rc<T> {
#[inline]
fn load_any(&self, key: DataKey, req: DataRequest) -> Result<AnyResponse, DataError> {
(**self).load_any(key, req)
}
}

#[cfg(target_has_atomic = "ptr")]
impl<T: AnyProvider + ?Sized> AnyProvider for alloc::sync::Arc<T> {
#[inline]
fn load_any(&self, key: DataKey, req: DataRequest) -> Result<AnyResponse, DataError> {
(**self).load_any(key, req)
}
Expand Down
4 changes: 4 additions & 0 deletions provider/core/src/buf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ pub trait BufferProvider {
}

impl<'a, T: BufferProvider + ?Sized> BufferProvider for &'a T {
#[inline]
fn load_buffer(
&self,
key: DataKey,
Expand All @@ -104,6 +105,7 @@ impl<'a, T: BufferProvider + ?Sized> BufferProvider for &'a T {
}

impl<T: BufferProvider + ?Sized> BufferProvider for alloc::boxed::Box<T> {
#[inline]
fn load_buffer(
&self,
key: DataKey,
Expand All @@ -114,6 +116,7 @@ impl<T: BufferProvider + ?Sized> BufferProvider for alloc::boxed::Box<T> {
}

impl<T: BufferProvider + ?Sized> BufferProvider for alloc::rc::Rc<T> {
#[inline]
fn load_buffer(
&self,
key: DataKey,
Expand All @@ -125,6 +128,7 @@ impl<T: BufferProvider + ?Sized> BufferProvider for alloc::rc::Rc<T> {

#[cfg(target_has_atomic = "ptr")]
impl<T: BufferProvider + ?Sized> BufferProvider for alloc::sync::Arc<T> {
#[inline]
fn load_buffer(
&self,
key: DataKey,
Expand Down
96 changes: 88 additions & 8 deletions provider/core/src/data_provider.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,63 @@ use crate::marker::{DataMarker, KeyedDataMarker};
use crate::request::DataRequest;
use crate::response::DataResponse;

/// A data provider that loads data for a specific [`DataKey`].
pub trait DataProvider<M>
where
M: KeyedDataMarker,
{
/// Query the provider for data, returning the result.
///
/// Returns [`Ok`] if the request successfully loaded data. If data failed to load, returns an
/// Error with more information.
fn load(&self, req: DataRequest) -> Result<DataResponse<M>, DataError>;
}

impl<'a, M, P> DataProvider<M> for &'a P
where
M: KeyedDataMarker,
P: DataProvider<M> + ?Sized,
{
#[inline]
fn load(&self, req: DataRequest) -> Result<DataResponse<M>, DataError> {
(*self).load(req)
}
}

impl<M, P> DataProvider<M> for alloc::boxed::Box<P>
where
M: KeyedDataMarker,
P: DataProvider<M> + ?Sized,
{
#[inline]
fn load(&self, req: DataRequest) -> Result<DataResponse<M>, DataError> {
(**self).load(req)
}
}

impl<M, P> DataProvider<M> for alloc::rc::Rc<P>
where
M: KeyedDataMarker,
P: DataProvider<M> + ?Sized,
{
#[inline]
fn load(&self, req: DataRequest) -> Result<DataResponse<M>, DataError> {
(**self).load(req)
}
}

#[cfg(target_has_atomic = "ptr")]
impl<M, P> DataProvider<M> for alloc::sync::Arc<P>
where
M: KeyedDataMarker,
P: DataProvider<M> + ?Sized,
{
#[inline]
fn load(&self, req: DataRequest) -> Result<DataResponse<M>, DataError> {
(**self).load(req)
}
}

/// A data provider that loads data for a specific data type.
///
/// Unlike [`DataProvider`], there may be multiple keys corresponding to the same data type.
Expand All @@ -25,23 +82,46 @@ where
fn load_data(&self, key: DataKey, req: DataRequest) -> Result<DataResponse<M>, DataError>;
}

/// A data provider that loads data for a specific [`DataKey`].
pub trait DataProvider<M>
impl<'a, M, P> DynamicDataProvider<M> for &'a P
where
M: KeyedDataMarker,
M: DataMarker,
P: DynamicDataProvider<M> + ?Sized,
{
/// Query the provider for data, returning the result.
///
/// Returns [`Ok`] if the request successfully loaded data. If data failed to load, returns an
/// Error with more information.
fn load(&self, req: DataRequest) -> Result<DataResponse<M>, DataError>;
#[inline]
fn load_data(&self, key: DataKey, req: DataRequest) -> Result<DataResponse<M>, DataError> {
(*self).load_data(key, req)
}
}

impl<M, P> DynamicDataProvider<M> for alloc::boxed::Box<P>
where
M: DataMarker,
P: DynamicDataProvider<M> + ?Sized,
{
#[inline]
fn load_data(&self, key: DataKey, req: DataRequest) -> Result<DataResponse<M>, DataError> {
(**self).load_data(key, req)
}
}

impl<M, P> DynamicDataProvider<M> for alloc::rc::Rc<P>
where
M: DataMarker,
P: DynamicDataProvider<M> + ?Sized,
{
#[inline]
fn load_data(&self, key: DataKey, req: DataRequest) -> Result<DataResponse<M>, DataError> {
(**self).load_data(key, req)
}
}

#[cfg(target_has_atomic = "ptr")]
impl<M, P> DynamicDataProvider<M> for alloc::sync::Arc<P>
where
M: DataMarker,
P: DynamicDataProvider<M> + ?Sized,
{
#[inline]
fn load_data(&self, key: DataKey, req: DataRequest) -> Result<DataResponse<M>, DataError> {
(**self).load_data(key, req)
}
Expand Down

0 comments on commit 31e085a

Please sign in to comment.