@@ -9,18 +9,19 @@ use crate::future::Future;
9
9
use crate :: io;
10
10
use crate :: task:: blocking;
11
11
use crate :: task:: { Context , Poll } ;
12
+ use std:: marker:: PhantomData ;
12
13
13
14
cfg_if ! {
14
15
if #[ cfg( feature = "docs" ) ] {
15
16
#[ doc( hidden) ]
16
- pub struct ImplFuture <T >( std:: marker:: PhantomData <T >) ;
17
+ pub struct ImplFuture <' a , T >( std:: marker:: PhantomData <& ' a T >) ;
17
18
18
19
macro_rules! ret {
19
- ( $f: tt, $i: ty) => ( ImplFuture <io:: Result <$i>>) ;
20
+ ( $a : lifetime , $ f: tt, $i: ty) => ( ImplFuture <$a , io:: Result <$i>>) ;
20
21
}
21
22
} else {
22
23
macro_rules! ret {
23
- ( $f: tt, $i: ty) => ( $f<$i>) ;
24
+ ( $a : lifetime , $ f: tt, $i: ty) => ( $f<$a , $i>) ;
24
25
}
25
26
}
26
27
}
@@ -41,79 +42,81 @@ pub trait ToSocketAddrs {
41
42
/// resolution performed.
42
43
///
43
44
/// 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 ) ;
45
46
}
46
47
47
48
#[ doc( hidden) ]
48
49
#[ 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 ( ) > ) ,
50
52
Join ( blocking:: JoinHandle < io:: Result < I > > ) ,
51
53
Ready ( Ready < io:: Result < I > > ) ,
52
54
}
53
55
54
- impl < I : Iterator < Item = SocketAddr > > Future for ToSocketAddrsFuture < I > {
56
+ impl < I : Iterator < Item = SocketAddr > > Future for ToSocketAddrsFuture < ' _ , I > {
55
57
type Output = io:: Result < I > ;
56
58
57
59
fn poll ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Self :: Output > {
58
60
match self . get_mut ( ) {
59
61
ToSocketAddrsFuture :: Join ( f) => Pin :: new ( & mut * f) . poll ( cx) ,
60
62
ToSocketAddrsFuture :: Ready ( f) => Pin :: new ( & mut * f) . poll ( cx) ,
63
+ _ => unreachable ! ( ) ,
61
64
}
62
65
}
63
66
}
64
67
65
68
impl ToSocketAddrs for SocketAddr {
66
69
type Iter = std:: option:: IntoIter < SocketAddr > ;
67
70
68
- fn to_socket_addrs ( & self ) -> ret ! ( ToSocketAddrsFuture , Self :: Iter ) {
71
+ fn to_socket_addrs ( & self ) -> ret ! ( ' _ , ToSocketAddrsFuture , Self :: Iter ) {
69
72
ToSocketAddrsFuture :: Ready ( ready ( std:: net:: ToSocketAddrs :: to_socket_addrs ( self ) ) )
70
73
}
71
74
}
72
75
73
76
impl ToSocketAddrs for SocketAddrV4 {
74
77
type Iter = std:: option:: IntoIter < SocketAddr > ;
75
78
76
- fn to_socket_addrs ( & self ) -> ret ! ( ToSocketAddrsFuture , Self :: Iter ) {
79
+ fn to_socket_addrs ( & self ) -> ret ! ( ' _ , ToSocketAddrsFuture , Self :: Iter ) {
77
80
ToSocketAddrsFuture :: Ready ( ready ( std:: net:: ToSocketAddrs :: to_socket_addrs ( self ) ) )
78
81
}
79
82
}
80
83
81
84
impl ToSocketAddrs for SocketAddrV6 {
82
85
type Iter = std:: option:: IntoIter < SocketAddr > ;
83
86
84
- fn to_socket_addrs ( & self ) -> ret ! ( ToSocketAddrsFuture , Self :: Iter ) {
87
+ fn to_socket_addrs ( & self ) -> ret ! ( ' _ , ToSocketAddrsFuture , Self :: Iter ) {
85
88
ToSocketAddrsFuture :: Ready ( ready ( std:: net:: ToSocketAddrs :: to_socket_addrs ( self ) ) )
86
89
}
87
90
}
88
91
89
92
impl ToSocketAddrs for ( IpAddr , u16 ) {
90
93
type Iter = std:: option:: IntoIter < SocketAddr > ;
91
94
92
- fn to_socket_addrs ( & self ) -> ret ! ( ToSocketAddrsFuture , Self :: Iter ) {
95
+ fn to_socket_addrs ( & self ) -> ret ! ( ' _ , ToSocketAddrsFuture , Self :: Iter ) {
93
96
ToSocketAddrsFuture :: Ready ( ready ( std:: net:: ToSocketAddrs :: to_socket_addrs ( self ) ) )
94
97
}
95
98
}
96
99
97
100
impl ToSocketAddrs for ( Ipv4Addr , u16 ) {
98
101
type Iter = std:: option:: IntoIter < SocketAddr > ;
99
102
100
- fn to_socket_addrs ( & self ) -> ret ! ( ToSocketAddrsFuture , Self :: Iter ) {
103
+ fn to_socket_addrs ( & self ) -> ret ! ( ' _ , ToSocketAddrsFuture , Self :: Iter ) {
101
104
ToSocketAddrsFuture :: Ready ( ready ( std:: net:: ToSocketAddrs :: to_socket_addrs ( self ) ) )
102
105
}
103
106
}
104
107
105
108
impl ToSocketAddrs for ( Ipv6Addr , u16 ) {
106
109
type Iter = std:: option:: IntoIter < SocketAddr > ;
107
110
108
- fn to_socket_addrs ( & self ) -> ret ! ( ToSocketAddrsFuture , Self :: Iter ) {
111
+ fn to_socket_addrs ( & self ) -> ret ! ( ' _ , ToSocketAddrsFuture , Self :: Iter ) {
109
112
ToSocketAddrsFuture :: Ready ( ready ( std:: net:: ToSocketAddrs :: to_socket_addrs ( self ) ) )
110
113
}
111
114
}
112
115
113
116
impl ToSocketAddrs for ( & str , u16 ) {
114
117
type Iter = std:: vec:: IntoIter < SocketAddr > ;
115
118
116
- fn to_socket_addrs ( & self ) -> ret ! ( ToSocketAddrsFuture , Self :: Iter ) {
119
+ fn to_socket_addrs ( & self ) -> ret ! ( ' _ , ToSocketAddrsFuture , Self :: Iter ) {
117
120
let host = self . 0 . to_string ( ) ;
118
121
let port = self . 1 ;
119
122
let join = blocking:: spawn ( async move {
@@ -126,7 +129,7 @@ impl ToSocketAddrs for (&str, u16) {
126
129
impl ToSocketAddrs for str {
127
130
type Iter = std:: vec:: IntoIter < SocketAddr > ;
128
131
129
- fn to_socket_addrs ( & self ) -> ret ! ( ToSocketAddrsFuture , Self :: Iter ) {
132
+ fn to_socket_addrs ( & self ) -> ret ! ( ' _ , ToSocketAddrsFuture , Self :: Iter ) {
130
133
let socket_addrs = self . to_string ( ) ;
131
134
let join =
132
135
blocking:: spawn ( async move { std:: net:: ToSocketAddrs :: to_socket_addrs ( & socket_addrs) } ) ;
@@ -137,23 +140,23 @@ impl ToSocketAddrs for str {
137
140
impl < ' a > ToSocketAddrs for & ' a [ SocketAddr ] {
138
141
type Iter = std:: iter:: Cloned < std:: slice:: Iter < ' a , SocketAddr > > ;
139
142
140
- fn to_socket_addrs ( & self ) -> ret ! ( ToSocketAddrsFuture , Self :: Iter ) {
143
+ fn to_socket_addrs ( & self ) -> ret ! ( ' _ , ToSocketAddrsFuture , Self :: Iter ) {
141
144
ToSocketAddrsFuture :: Ready ( ready ( std:: net:: ToSocketAddrs :: to_socket_addrs ( self ) ) )
142
145
}
143
146
}
144
147
145
148
impl < T : ToSocketAddrs + ?Sized > ToSocketAddrs for & T {
146
149
type Iter = T :: Iter ;
147
150
148
- fn to_socket_addrs ( & self ) -> ret ! ( ToSocketAddrsFuture , Self :: Iter ) {
151
+ fn to_socket_addrs ( & self ) -> ret ! ( ' _ , ToSocketAddrsFuture , Self :: Iter ) {
149
152
( * * self ) . to_socket_addrs ( )
150
153
}
151
154
}
152
155
153
156
impl ToSocketAddrs for String {
154
157
type Iter = std:: vec:: IntoIter < SocketAddr > ;
155
158
156
- fn to_socket_addrs ( & self ) -> ret ! ( ToSocketAddrsFuture , Self :: Iter ) {
159
+ fn to_socket_addrs ( & self ) -> ret ! ( ' _ , ToSocketAddrsFuture , Self :: Iter ) {
157
160
ToSocketAddrs :: to_socket_addrs ( self . as_str ( ) )
158
161
}
159
162
}
0 commit comments