Skip to content

Commit 57d027d

Browse files
committed
Modify the signature of the request_* methods so that trait_upcasting is not required
Signed-off-by: Nick Cameron <[email protected]>
1 parent bb5db85 commit 57d027d

File tree

2 files changed

+19
-12
lines changed

2 files changed

+19
-12
lines changed

library/core/src/any.rs

+16-9
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,7 @@
110110
//! ## Examples
111111
//!
112112
//! ```
113-
//! # #![allow(incomplete_features)]
114113
//! # #![feature(provide_any)]
115-
//! # #![feature(trait_upcasting)]
116114
//! use std::any::{Provider, Demand, request_ref};
117115
//!
118116
//! // Definition of MyTrait
@@ -122,9 +120,9 @@
122120
//!
123121
//! // Methods on `MyTrait` trait objects.
124122
//! impl dyn MyTrait + '_ {
125-
//! /// Common case: get a reference to a field of the error.
123+
//! /// Common case: get a reference to a field of the struct.
126124
//! pub fn get_context_ref<T: ?Sized + 'static>(&self) -> Option<&T> {
127-
//! request_ref::<T>(self)
125+
//! request_ref::<T, _>(self)
128126
//! }
129127
//! }
130128
//!
@@ -785,20 +783,29 @@ pub trait Provider {
785783

786784
/// Request a value from the `Provider`.
787785
#[unstable(feature = "provide_any", issue = "none")]
788-
pub fn request_value<'a, T: 'static>(provider: &'a dyn Provider) -> Option<T> {
789-
request_by_type_tag::<'a, tags::Value<T>>(provider)
786+
pub fn request_value<'a, T, P>(provider: &'a P) -> Option<T>
787+
where
788+
T: 'static,
789+
P: Provider + ?Sized,
790+
{
791+
request_by_type_tag::<'a, tags::Value<T>, P>(provider)
790792
}
791793

792794
/// Request a reference from the `Provider`.
793795
#[unstable(feature = "provide_any", issue = "none")]
794-
pub fn request_ref<'a, T: ?Sized + 'static>(provider: &'a dyn Provider) -> Option<&'a T> {
795-
request_by_type_tag::<'a, tags::Ref<tags::MaybeSizedValue<T>>>(provider)
796+
pub fn request_ref<'a, T, P>(provider: &'a P) -> Option<&'a T>
797+
where
798+
T: 'static + ?Sized,
799+
P: Provider + ?Sized,
800+
{
801+
request_by_type_tag::<'a, tags::Ref<tags::MaybeSizedValue<T>>, P>(provider)
796802
}
797803

798804
/// Request a specific value by tag from the `Provider`.
799-
fn request_by_type_tag<'a, I>(provider: &'a dyn Provider) -> Option<I::Reified>
805+
fn request_by_type_tag<'a, I, P>(provider: &'a P) -> Option<I::Reified>
800806
where
801807
I: tags::Type<'a>,
808+
P: Provider + ?Sized,
802809
{
803810
let mut tagged = TaggedOption::<'a, I>(None);
804811
provider.provide(tagged.as_demand());

library/core/tests/any.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ impl Provider for SomeConcreteType {
148148
fn test_provider() {
149149
let obj: &dyn Provider = &SomeConcreteType { some_string: "hello".to_owned() };
150150

151-
assert_eq!(&**request_ref::<String>(obj).unwrap(), "hello");
152-
assert_eq!(&*request_value::<String>(obj).unwrap(), "bye");
153-
assert_eq!(request_value::<u8>(obj), None);
151+
assert_eq!(&**request_ref::<String, _>(obj).unwrap(), "hello");
152+
assert_eq!(&*request_value::<String, _>(obj).unwrap(), "bye");
153+
assert_eq!(request_value::<u8, _>(obj), None);
154154
}

0 commit comments

Comments
 (0)