mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-04 19:29:07 +00:00
Modify the signature of the request_* methods so that trait_upcasting is not required
Signed-off-by: Nick Cameron <nrc@ncameron.org>
This commit is contained in:
parent
bb5db85f74
commit
57d027d23a
@ -110,9 +110,7 @@
|
|||||||
//! ## Examples
|
//! ## Examples
|
||||||
//!
|
//!
|
||||||
//! ```
|
//! ```
|
||||||
//! # #![allow(incomplete_features)]
|
|
||||||
//! # #![feature(provide_any)]
|
//! # #![feature(provide_any)]
|
||||||
//! # #![feature(trait_upcasting)]
|
|
||||||
//! use std::any::{Provider, Demand, request_ref};
|
//! use std::any::{Provider, Demand, request_ref};
|
||||||
//!
|
//!
|
||||||
//! // Definition of MyTrait
|
//! // Definition of MyTrait
|
||||||
@ -122,9 +120,9 @@
|
|||||||
//!
|
//!
|
||||||
//! // Methods on `MyTrait` trait objects.
|
//! // Methods on `MyTrait` trait objects.
|
||||||
//! impl dyn MyTrait + '_ {
|
//! impl dyn MyTrait + '_ {
|
||||||
//! /// Common case: get a reference to a field of the error.
|
//! /// Common case: get a reference to a field of the struct.
|
||||||
//! pub fn get_context_ref<T: ?Sized + 'static>(&self) -> Option<&T> {
|
//! pub fn get_context_ref<T: ?Sized + 'static>(&self) -> Option<&T> {
|
||||||
//! request_ref::<T>(self)
|
//! request_ref::<T, _>(self)
|
||||||
//! }
|
//! }
|
||||||
//! }
|
//! }
|
||||||
//!
|
//!
|
||||||
@ -785,20 +783,29 @@ pub trait Provider {
|
|||||||
|
|
||||||
/// Request a value from the `Provider`.
|
/// Request a value from the `Provider`.
|
||||||
#[unstable(feature = "provide_any", issue = "none")]
|
#[unstable(feature = "provide_any", issue = "none")]
|
||||||
pub fn request_value<'a, T: 'static>(provider: &'a dyn Provider) -> Option<T> {
|
pub fn request_value<'a, T, P>(provider: &'a P) -> Option<T>
|
||||||
request_by_type_tag::<'a, tags::Value<T>>(provider)
|
where
|
||||||
|
T: 'static,
|
||||||
|
P: Provider + ?Sized,
|
||||||
|
{
|
||||||
|
request_by_type_tag::<'a, tags::Value<T>, P>(provider)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Request a reference from the `Provider`.
|
/// Request a reference from the `Provider`.
|
||||||
#[unstable(feature = "provide_any", issue = "none")]
|
#[unstable(feature = "provide_any", issue = "none")]
|
||||||
pub fn request_ref<'a, T: ?Sized + 'static>(provider: &'a dyn Provider) -> Option<&'a T> {
|
pub fn request_ref<'a, T, P>(provider: &'a P) -> Option<&'a T>
|
||||||
request_by_type_tag::<'a, tags::Ref<tags::MaybeSizedValue<T>>>(provider)
|
where
|
||||||
|
T: 'static + ?Sized,
|
||||||
|
P: Provider + ?Sized,
|
||||||
|
{
|
||||||
|
request_by_type_tag::<'a, tags::Ref<tags::MaybeSizedValue<T>>, P>(provider)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Request a specific value by tag from the `Provider`.
|
/// Request a specific value by tag from the `Provider`.
|
||||||
fn request_by_type_tag<'a, I>(provider: &'a dyn Provider) -> Option<I::Reified>
|
fn request_by_type_tag<'a, I, P>(provider: &'a P) -> Option<I::Reified>
|
||||||
where
|
where
|
||||||
I: tags::Type<'a>,
|
I: tags::Type<'a>,
|
||||||
|
P: Provider + ?Sized,
|
||||||
{
|
{
|
||||||
let mut tagged = TaggedOption::<'a, I>(None);
|
let mut tagged = TaggedOption::<'a, I>(None);
|
||||||
provider.provide(tagged.as_demand());
|
provider.provide(tagged.as_demand());
|
||||||
|
@ -148,7 +148,7 @@ impl Provider for SomeConcreteType {
|
|||||||
fn test_provider() {
|
fn test_provider() {
|
||||||
let obj: &dyn Provider = &SomeConcreteType { some_string: "hello".to_owned() };
|
let obj: &dyn Provider = &SomeConcreteType { some_string: "hello".to_owned() };
|
||||||
|
|
||||||
assert_eq!(&**request_ref::<String>(obj).unwrap(), "hello");
|
assert_eq!(&**request_ref::<String, _>(obj).unwrap(), "hello");
|
||||||
assert_eq!(&*request_value::<String>(obj).unwrap(), "bye");
|
assert_eq!(&*request_value::<String, _>(obj).unwrap(), "bye");
|
||||||
assert_eq!(request_value::<u8>(obj), None);
|
assert_eq!(request_value::<u8, _>(obj), None);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user