|
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