Skip to content

Commit 6db0085

Browse files
committed
lifetime for future
1 parent d2c61b6 commit 6db0085

File tree

1 file changed

+20
-17
lines changed

1 file changed

+20
-17
lines changed

src/net/addr.rs

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,19 @@ use crate::future::Future;
99
use crate::io;
1010
use crate::task::blocking;
1111
use crate::task::{Context, Poll};
12+
use std::marker::PhantomData;
1213

1314
cfg_if! {
1415
if #[cfg(feature = "docs")] {
1516
#[doc(hidden)]
16-
pub struct ImplFuture<T>(std::marker::PhantomData<T>);
17+
pub struct ImplFuture<'a, T>(std::marker::PhantomData<&'a T>);
1718

1819
macro_rules! ret {
19-
($f:tt, $i:ty) => (ImplFuture<io::Result<$i>>);
20+
($a:lifetime, $f:tt, $i:ty) => (ImplFuture<$a, io::Result<$i>>);
2021
}
2122
} else {
2223
macro_rules! ret {
23-
($f:tt, $i:ty) => ($f<$i>);
24+
($a:lifetime, $f:tt, $i:ty) => ($f<$a, $i>);
2425
}
2526
}
2627
}
@@ -41,79 +42,81 @@ pub trait ToSocketAddrs {
4142
/// resolution performed.
4243
///
4344
/// Note that this function may block a backend thread while resolution is performed.
44-
fn to_socket_addrs(&self) -> ret!(ToSocketAddrsFuture, Self::Iter);
45+
fn to_socket_addrs(&self) -> ret!('_, ToSocketAddrsFuture, Self::Iter);
4546
}
4647

4748
#[doc(hidden)]
4849
#[allow(missing_debug_implementations)]
49-
pub enum ToSocketAddrsFuture<I: Iterator<Item = SocketAddr>> {
50+
pub enum ToSocketAddrsFuture<'a, I: Iterator<Item = SocketAddr>> {
51+
Phantom(PhantomData<&'a ()>),
5052
Join(blocking::JoinHandle<io::Result<I>>),
5153
Ready(Ready<io::Result<I>>),
5254
}
5355

54-
impl<I: Iterator<Item = SocketAddr>> Future for ToSocketAddrsFuture<I> {
56+
impl<I: Iterator<Item = SocketAddr>> Future for ToSocketAddrsFuture<'_, I> {
5557
type Output = io::Result<I>;
5658

5759
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
5860
match self.get_mut() {
5961
ToSocketAddrsFuture::Join(f) => Pin::new(&mut *f).poll(cx),
6062
ToSocketAddrsFuture::Ready(f) => Pin::new(&mut *f).poll(cx),
63+
_ => unreachable!(),
6164
}
6265
}
6366
}
6467

6568
impl ToSocketAddrs for SocketAddr {
6669
type Iter = std::option::IntoIter<SocketAddr>;
6770

68-
fn to_socket_addrs(&self) -> ret!(ToSocketAddrsFuture, Self::Iter) {
71+
fn to_socket_addrs(&self) -> ret!('_, ToSocketAddrsFuture, Self::Iter) {
6972
ToSocketAddrsFuture::Ready(ready(std::net::ToSocketAddrs::to_socket_addrs(self)))
7073
}
7174
}
7275

7376
impl ToSocketAddrs for SocketAddrV4 {
7477
type Iter = std::option::IntoIter<SocketAddr>;
7578

76-
fn to_socket_addrs(&self) -> ret!(ToSocketAddrsFuture, Self::Iter) {
79+
fn to_socket_addrs(&self) -> ret!('_, ToSocketAddrsFuture, Self::Iter) {
7780
ToSocketAddrsFuture::Ready(ready(std::net::ToSocketAddrs::to_socket_addrs(self)))
7881
}
7982
}
8083

8184
impl ToSocketAddrs for SocketAddrV6 {
8285
type Iter = std::option::IntoIter<SocketAddr>;
8386

84-
fn to_socket_addrs(&self) -> ret!(ToSocketAddrsFuture, Self::Iter) {
87+
fn to_socket_addrs(&self) -> ret!('_, ToSocketAddrsFuture, Self::Iter) {
8588
ToSocketAddrsFuture::Ready(ready(std::net::ToSocketAddrs::to_socket_addrs(self)))
8689
}
8790
}
8891

8992
impl ToSocketAddrs for (IpAddr, u16) {
9093
type Iter = std::option::IntoIter<SocketAddr>;
9194

92-
fn to_socket_addrs(&self) -> ret!(ToSocketAddrsFuture, Self::Iter) {
95+
fn to_socket_addrs(&self) -> ret!('_, ToSocketAddrsFuture, Self::Iter) {
9396
ToSocketAddrsFuture::Ready(ready(std::net::ToSocketAddrs::to_socket_addrs(self)))
9497
}
9598
}
9699

97100
impl ToSocketAddrs for (Ipv4Addr, u16) {
98101
type Iter = std::option::IntoIter<SocketAddr>;
99102

100-
fn to_socket_addrs(&self) -> ret!(ToSocketAddrsFuture, Self::Iter) {
103+
fn to_socket_addrs(&self) -> ret!('_, ToSocketAddrsFuture, Self::Iter) {
101104
ToSocketAddrsFuture::Ready(ready(std::net::ToSocketAddrs::to_socket_addrs(self)))
102105
}
103106
}
104107

105108
impl ToSocketAddrs for (Ipv6Addr, u16) {
106109
type Iter = std::option::IntoIter<SocketAddr>;
107110

108-
fn to_socket_addrs(&self) -> ret!(ToSocketAddrsFuture, Self::Iter) {
111+
fn to_socket_addrs(&self) -> ret!('_, ToSocketAddrsFuture, Self::Iter) {
109112
ToSocketAddrsFuture::Ready(ready(std::net::ToSocketAddrs::to_socket_addrs(self)))
110113
}
111114
}
112115

113116
impl ToSocketAddrs for (&str, u16) {
114117
type Iter = std::vec::IntoIter<SocketAddr>;
115118

116-
fn to_socket_addrs(&self) -> ret!(ToSocketAddrsFuture, Self::Iter) {
119+
fn to_socket_addrs(&self) -> ret!('_, ToSocketAddrsFuture, Self::Iter) {
117120
let host = self.0.to_string();
118121
let port = self.1;
119122
let join = blocking::spawn(async move {
@@ -126,7 +129,7 @@ impl ToSocketAddrs for (&str, u16) {
126129
impl ToSocketAddrs for str {
127130
type Iter = std::vec::IntoIter<SocketAddr>;
128131

129-
fn to_socket_addrs(&self) -> ret!(ToSocketAddrsFuture, Self::Iter) {
132+
fn to_socket_addrs(&self) -> ret!('_, ToSocketAddrsFuture, Self::Iter) {
130133
let socket_addrs = self.to_string();
131134
let join =
132135
blocking::spawn(async move { std::net::ToSocketAddrs::to_socket_addrs(&socket_addrs) });
@@ -137,23 +140,23 @@ impl ToSocketAddrs for str {
137140
impl<'a> ToSocketAddrs for &'a [SocketAddr] {
138141
type Iter = std::iter::Cloned<std::slice::Iter<'a, SocketAddr>>;
139142

140-
fn to_socket_addrs(&self) -> ret!(ToSocketAddrsFuture, Self::Iter) {
143+
fn to_socket_addrs(&self) -> ret!('_, ToSocketAddrsFuture, Self::Iter) {
141144
ToSocketAddrsFuture::Ready(ready(std::net::ToSocketAddrs::to_socket_addrs(self)))
142145
}
143146
}
144147

145148
impl<T: ToSocketAddrs + ?Sized> ToSocketAddrs for &T {
146149
type Iter = T::Iter;
147150

148-
fn to_socket_addrs(&self) -> ret!(ToSocketAddrsFuture, Self::Iter) {
151+
fn to_socket_addrs(&self) -> ret!('_, ToSocketAddrsFuture, Self::Iter) {
149152
(**self).to_socket_addrs()
150153
}
151154
}
152155

153156
impl ToSocketAddrs for String {
154157
type Iter = std::vec::IntoIter<SocketAddr>;
155158

156-
fn to_socket_addrs(&self) -> ret!(ToSocketAddrsFuture, Self::Iter) {
159+
fn to_socket_addrs(&self) -> ret!('_, ToSocketAddrsFuture, Self::Iter) {
157160
ToSocketAddrs::to_socket_addrs(self.as_str())
158161
}
159162
}

0 commit comments

Comments
 (0)