Skip to content

Commit 8bd12e8

Browse files
committed
Auto merge of rust-lang#98912 - nrc:provider-it, r=yaahc
core::any: replace some generic types with impl Trait This gives a cleaner API since the caller only specifies the concrete type they usually want to. r? `@yaahc`
2 parents 4603ac3 + 0c72be3 commit 8bd12e8

File tree

2 files changed

+26
-31
lines changed

2 files changed

+26
-31
lines changed

library/core/src/any.rs

+15-20
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@
125125
//! impl dyn MyTrait + '_ {
126126
//! /// Get a reference to a field of the implementing struct.
127127
//! pub fn get_context_by_ref<T: ?Sized + 'static>(&self) -> Option<&T> {
128-
//! request_ref::<T, _>(self)
128+
//! request_ref::<T>(self)
129129
//! }
130130
//! }
131131
//!
@@ -799,7 +799,7 @@ pub trait Provider {
799799
/// impl Provider for SomeConcreteType {
800800
/// fn provide<'a>(&'a self, demand: &mut Demand<'a>) {
801801
/// demand.provide_ref::<str>(&self.field)
802-
/// .provide_value::<i32, _>(|| self.num_field);
802+
/// .provide_value::<i32>(|| self.num_field);
803803
/// }
804804
/// }
805805
/// ```
@@ -817,17 +817,16 @@ pub trait Provider {
817817
/// # #![feature(provide_any)]
818818
/// use std::any::{Provider, request_value};
819819
///
820-
/// fn get_string<P: Provider>(provider: &P) -> String {
821-
/// request_value::<String, _>(provider).unwrap()
820+
/// fn get_string(provider: &impl Provider) -> String {
821+
/// request_value::<String>(provider).unwrap()
822822
/// }
823823
/// ```
824824
#[unstable(feature = "provide_any", issue = "96024")]
825-
pub fn request_value<'a, T, P>(provider: &'a P) -> Option<T>
825+
pub fn request_value<'a, T>(provider: &'a (impl Provider + ?Sized)) -> Option<T>
826826
where
827827
T: 'static,
828-
P: Provider + ?Sized,
829828
{
830-
request_by_type_tag::<'a, tags::Value<T>, P>(provider)
829+
request_by_type_tag::<'a, tags::Value<T>>(provider)
831830
}
832831

833832
/// Request a reference from the `Provider`.
@@ -840,24 +839,22 @@ where
840839
/// # #![feature(provide_any)]
841840
/// use std::any::{Provider, request_ref};
842841
///
843-
/// fn get_str<P: Provider>(provider: &P) -> &str {
844-
/// request_ref::<str, _>(provider).unwrap()
842+
/// fn get_str(provider: &impl Provider) -> &str {
843+
/// request_ref::<str>(provider).unwrap()
845844
/// }
846845
/// ```
847846
#[unstable(feature = "provide_any", issue = "96024")]
848-
pub fn request_ref<'a, T, P>(provider: &'a P) -> Option<&'a T>
847+
pub fn request_ref<'a, T>(provider: &'a (impl Provider + ?Sized)) -> Option<&'a T>
849848
where
850849
T: 'static + ?Sized,
851-
P: Provider + ?Sized,
852850
{
853-
request_by_type_tag::<'a, tags::Ref<tags::MaybeSizedValue<T>>, P>(provider)
851+
request_by_type_tag::<'a, tags::Ref<tags::MaybeSizedValue<T>>>(provider)
854852
}
855853

856854
/// Request a specific value by tag from the `Provider`.
857-
fn request_by_type_tag<'a, I, P>(provider: &'a P) -> Option<I::Reified>
855+
fn request_by_type_tag<'a, I>(provider: &'a (impl Provider + ?Sized)) -> Option<I::Reified>
858856
where
859857
I: tags::Type<'a>,
860-
P: Provider + ?Sized,
861858
{
862859
let mut tagged = TaggedOption::<'a, I>(None);
863860
provider.provide(tagged.as_demand());
@@ -896,17 +893,16 @@ impl<'a> Demand<'a> {
896893
///
897894
/// impl Provider for SomeConcreteType {
898895
/// fn provide<'a>(&'a self, demand: &mut Demand<'a>) {
899-
/// demand.provide_value::<String, _>(|| self.field.clone());
896+
/// demand.provide_value::<String>(|| self.field.clone());
900897
/// }
901898
/// }
902899
/// ```
903900
#[unstable(feature = "provide_any", issue = "96024")]
904-
pub fn provide_value<T, F>(&mut self, fulfil: F) -> &mut Self
901+
pub fn provide_value<T>(&mut self, fulfil: impl FnOnce() -> T) -> &mut Self
905902
where
906903
T: 'static,
907-
F: FnOnce() -> T,
908904
{
909-
self.provide_with::<tags::Value<T>, F>(fulfil)
905+
self.provide_with::<tags::Value<T>>(fulfil)
910906
}
911907

912908
/// Provide a reference, note that the referee type must be bounded by `'static`,
@@ -944,10 +940,9 @@ impl<'a> Demand<'a> {
944940
}
945941

946942
/// Provide a value with the given `Type` tag, using a closure to prevent unnecessary work.
947-
fn provide_with<I, F>(&mut self, fulfil: F) -> &mut Self
943+
fn provide_with<I>(&mut self, fulfil: impl FnOnce() -> I::Reified) -> &mut Self
948944
where
949945
I: tags::Type<'a>,
950-
F: FnOnce() -> I::Reified,
951946
{
952947
if let Some(res @ TaggedOption(None)) = self.0.downcast_mut::<I>() {
953948
res.0 = Some(fulfil());

library/core/tests/any.rs

+11-11
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ impl Provider for SomeConcreteType {
142142
demand
143143
.provide_ref::<String>(&self.some_string)
144144
.provide_ref::<str>(&self.some_string)
145-
.provide_value::<String, _>(|| "bye".to_owned());
145+
.provide_value::<String>(|| "bye".to_owned());
146146
}
147147
}
148148

@@ -151,29 +151,29 @@ impl Provider for SomeConcreteType {
151151
fn test_provider() {
152152
let obj: &dyn Provider = &SomeConcreteType { some_string: "hello".to_owned() };
153153

154-
assert_eq!(&**request_ref::<String, _>(obj).unwrap(), "hello");
155-
assert_eq!(&*request_value::<String, _>(obj).unwrap(), "bye");
156-
assert_eq!(request_value::<u8, _>(obj), None);
154+
assert_eq!(&**request_ref::<String>(obj).unwrap(), "hello");
155+
assert_eq!(&*request_value::<String>(obj).unwrap(), "bye");
156+
assert_eq!(request_value::<u8>(obj), None);
157157
}
158158

159159
// Test the provide and request mechanisms with a boxed trait object.
160160
#[test]
161161
fn test_provider_boxed() {
162162
let obj: Box<dyn Provider> = Box::new(SomeConcreteType { some_string: "hello".to_owned() });
163163

164-
assert_eq!(&**request_ref::<String, _>(&*obj).unwrap(), "hello");
165-
assert_eq!(&*request_value::<String, _>(&*obj).unwrap(), "bye");
166-
assert_eq!(request_value::<u8, _>(&*obj), None);
164+
assert_eq!(&**request_ref::<String>(&*obj).unwrap(), "hello");
165+
assert_eq!(&*request_value::<String>(&*obj).unwrap(), "bye");
166+
assert_eq!(request_value::<u8>(&*obj), None);
167167
}
168168

169169
// Test the provide and request mechanisms with a concrete object.
170170
#[test]
171171
fn test_provider_concrete() {
172172
let obj = SomeConcreteType { some_string: "hello".to_owned() };
173173

174-
assert_eq!(&**request_ref::<String, _>(&obj).unwrap(), "hello");
175-
assert_eq!(&*request_value::<String, _>(&obj).unwrap(), "bye");
176-
assert_eq!(request_value::<u8, _>(&obj), None);
174+
assert_eq!(&**request_ref::<String>(&obj).unwrap(), "hello");
175+
assert_eq!(&*request_value::<String>(&obj).unwrap(), "bye");
176+
assert_eq!(request_value::<u8>(&obj), None);
177177
}
178178

179179
trait OtherTrait: Provider {}
@@ -182,7 +182,7 @@ impl OtherTrait for SomeConcreteType {}
182182

183183
impl dyn OtherTrait {
184184
fn get_ref<T: 'static + ?Sized>(&self) -> Option<&T> {
185-
request_ref::<T, _>(self)
185+
request_ref::<T>(self)
186186
}
187187
}
188188

0 commit comments

Comments
 (0)