Skip to content

Commit 27b7841

Browse files
committed
Add blanket impls for references to the Fn traits.
1 parent cdb10b8 commit 27b7841

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed

src/libcore/ops.rs

+49
Original file line numberDiff line numberDiff line change
@@ -1142,3 +1142,52 @@ pub trait FnOnce<Args> {
11421142
/// This is called when the call operator is used.
11431143
extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
11441144
}
1145+
1146+
#[cfg(not(stage0))]
1147+
mod impls {
1148+
use marker::Sized;
1149+
use super::{Fn, FnMut, FnOnce};
1150+
1151+
impl<'a,A,F:?Sized> Fn<A> for &'a F
1152+
where F : Fn<A>
1153+
{
1154+
extern "rust-call" fn call(&self, args: A) -> F::Output {
1155+
(**self).call(args)
1156+
}
1157+
}
1158+
1159+
impl<'a,A,F:?Sized> FnMut<A> for &'a F
1160+
where F : Fn<A>
1161+
{
1162+
extern "rust-call" fn call_mut(&mut self, args: A) -> F::Output {
1163+
(**self).call(args)
1164+
}
1165+
}
1166+
1167+
impl<'a,A,F:?Sized> FnOnce<A> for &'a F
1168+
where F : Fn<A>
1169+
{
1170+
type Output = F::Output;
1171+
1172+
extern "rust-call" fn call_once(self, args: A) -> F::Output {
1173+
(*self).call(args)
1174+
}
1175+
}
1176+
1177+
impl<'a,A,F:?Sized> FnMut<A> for &'a mut F
1178+
where F : FnMut<A>
1179+
{
1180+
extern "rust-call" fn call_mut(&mut self, args: A) -> F::Output {
1181+
(*self).call_mut(args)
1182+
}
1183+
}
1184+
1185+
impl<'a,A,F:?Sized> FnOnce<A> for &'a mut F
1186+
where F : FnMut<A>
1187+
{
1188+
type Output = F::Output;
1189+
extern "rust-call" fn call_once(mut self, args: A) -> F::Output {
1190+
(*self).call_mut(args)
1191+
}
1192+
}
1193+
}

0 commit comments

Comments
 (0)