|
110 | 110 | //! ## Examples
|
111 | 111 | //!
|
112 | 112 | //! ```
|
113 |
| -//! # #![allow(incomplete_features)] |
114 | 113 | //! # #![feature(provide_any)]
|
115 |
| -//! # #![feature(trait_upcasting)] |
116 | 114 | //! use std::any::{Provider, Demand, request_ref};
|
117 | 115 | //!
|
118 | 116 | //! // Definition of MyTrait
|
|
122 | 120 | //!
|
123 | 121 | //! // Methods on `MyTrait` trait objects.
|
124 | 122 | //! 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. |
126 | 124 | //! pub fn get_context_ref<T: ?Sized + 'static>(&self) -> Option<&T> {
|
127 |
| -//! request_ref::<T>(self) |
| 125 | +//! request_ref::<T, _>(self) |
128 | 126 | //! }
|
129 | 127 | //! }
|
130 | 128 | //!
|
@@ -785,20 +783,29 @@ pub trait Provider {
|
785 | 783 |
|
786 | 784 | /// Request a value from the `Provider`.
|
787 | 785 | #[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) |
790 | 792 | }
|
791 | 793 |
|
792 | 794 | /// Request a reference from the `Provider`.
|
793 | 795 | #[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) |
796 | 802 | }
|
797 | 803 |
|
798 | 804 | /// 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> |
800 | 806 | where
|
801 | 807 | I: tags::Type<'a>,
|
| 808 | + P: Provider + ?Sized, |
802 | 809 | {
|
803 | 810 | let mut tagged = TaggedOption::<'a, I>(None);
|
804 | 811 | provider.provide(tagged.as_demand());
|
|
0 commit comments