about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNick Cameron <nrc@ncameron.org>2022-04-07 15:34:36 +0100
committerNick Cameron <nrc@ncameron.org>2022-06-06 12:10:13 +0100
commit57d027d23a12a956520063625072440ca74b171d (patch)
tree22181fdf092b90839e8070852048a713758ae8cd
parentbb5db85f745614a1929b6a60125953170cab7462 (diff)
downloadrust-57d027d23a12a956520063625072440ca74b171d.tar.gz
rust-57d027d23a12a956520063625072440ca74b171d.zip
Modify the signature of the request_* methods so that trait_upcasting is not required
Signed-off-by: Nick Cameron <nrc@ncameron.org>
-rw-r--r--library/core/src/any.rs25
-rw-r--r--library/core/tests/any.rs6
2 files changed, 19 insertions, 12 deletions
diff --git a/library/core/src/any.rs b/library/core/src/any.rs
index 1ca4e813443..295ca00d0b4 100644
--- a/library/core/src/any.rs
+++ b/library/core/src/any.rs
@@ -110,9 +110,7 @@
 //! ## Examples
 //!
 //! ```
-//! # #![allow(incomplete_features)]
 //! # #![feature(provide_any)]
-//! # #![feature(trait_upcasting)]
 //! use std::any::{Provider, Demand, request_ref};
 //!
 //! // Definition of MyTrait
@@ -122,9 +120,9 @@
 //!
 //! // Methods on `MyTrait` trait objects.
 //! 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> {
-//!         request_ref::<T>(self)
+//!         request_ref::<T, _>(self)
 //!     }
 //! }
 //!
@@ -785,20 +783,29 @@ pub trait Provider {
 
 /// Request a value from the `Provider`.
 #[unstable(feature = "provide_any", issue = "none")]
-pub fn request_value<'a, T: 'static>(provider: &'a dyn Provider) -> Option<T> {
-    request_by_type_tag::<'a, tags::Value<T>>(provider)
+pub fn request_value<'a, T, P>(provider: &'a P) -> Option<T>
+where
+    T: 'static,
+    P: Provider + ?Sized,
+{
+    request_by_type_tag::<'a, tags::Value<T>, P>(provider)
 }
 
 /// Request a reference from the `Provider`.
 #[unstable(feature = "provide_any", issue = "none")]
-pub fn request_ref<'a, T: ?Sized + 'static>(provider: &'a dyn Provider) -> Option<&'a T> {
-    request_by_type_tag::<'a, tags::Ref<tags::MaybeSizedValue<T>>>(provider)
+pub fn request_ref<'a, T, P>(provider: &'a P) -> Option<&'a T>
+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`.
-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
     I: tags::Type<'a>,
+    P: Provider + ?Sized,
 {
     let mut tagged = TaggedOption::<'a, I>(None);
     provider.provide(tagged.as_demand());
diff --git a/library/core/tests/any.rs b/library/core/tests/any.rs
index bf38207065f..14a2b09c95e 100644
--- a/library/core/tests/any.rs
+++ b/library/core/tests/any.rs
@@ -148,7 +148,7 @@ impl Provider for SomeConcreteType {
 fn test_provider() {
     let obj: &dyn Provider = &SomeConcreteType { some_string: "hello".to_owned() };
 
-    assert_eq!(&**request_ref::<String>(obj).unwrap(), "hello");
-    assert_eq!(&*request_value::<String>(obj).unwrap(), "bye");
-    assert_eq!(request_value::<u8>(obj), None);
+    assert_eq!(&**request_ref::<String, _>(obj).unwrap(), "hello");
+    assert_eq!(&*request_value::<String, _>(obj).unwrap(), "bye");
+    assert_eq!(request_value::<u8, _>(obj), None);
 }