@@ -11,109 +11,78 @@ pub trait RawStream:
11
11
{
12
12
}
13
13
14
+ impl < T : RawStream + ?Sized > RawStream for & mut T { }
15
+ impl < T : RawStream + ?Sized > RawStream for Box < T > { }
16
+
17
+ impl RawStream for dyn std:: io:: Write { }
18
+ impl RawStream for dyn std:: io:: Write + Send { }
19
+ impl RawStream for dyn std:: io:: Write + Send + Sync { }
20
+
14
21
impl RawStream for std:: io:: Stdout { }
15
22
16
23
impl RawStream for std:: io:: StdoutLock < ' _ > { }
17
24
18
- impl RawStream for & ' _ mut std:: io:: StdoutLock < ' _ > { }
19
-
20
25
impl RawStream for std:: io:: Stderr { }
21
26
22
27
impl RawStream for std:: io:: StderrLock < ' _ > { }
23
28
24
- impl RawStream for & ' _ mut std:: io:: StderrLock < ' _ > { }
25
-
26
- impl RawStream for Box < dyn std:: io:: Write > { }
27
-
28
- impl RawStream for & ' _ mut Box < dyn std:: io:: Write > { }
29
-
30
29
impl RawStream for Vec < u8 > { }
31
30
32
- impl RawStream for & ' _ mut Vec < u8 > { }
33
-
34
31
impl RawStream for std:: fs:: File { }
35
32
36
- impl RawStream for & ' _ mut std:: fs:: File { }
37
-
38
33
#[ allow( deprecated) ]
39
34
impl RawStream for crate :: Buffer { }
40
35
41
- #[ allow( deprecated) ]
42
- impl RawStream for & ' _ mut crate :: Buffer { }
43
-
44
36
/// Trait to determine if a descriptor/handle refers to a terminal/tty.
45
37
pub trait IsTerminal : private:: Sealed {
46
38
/// Returns `true` if the descriptor/handle refers to a terminal/tty.
47
39
fn is_terminal ( & self ) -> bool ;
48
40
}
49
41
50
- impl IsTerminal for std :: io :: Stdout {
42
+ impl < T : IsTerminal + ? Sized > IsTerminal for & T {
51
43
#[ inline]
52
44
fn is_terminal ( & self ) -> bool {
53
- is_terminal_polyfill :: IsTerminal :: is_terminal ( self )
45
+ T :: is_terminal ( & * * self )
54
46
}
55
47
}
56
-
57
- impl IsTerminal for std:: io:: StdoutLock < ' _ > {
48
+ impl < T : IsTerminal + ?Sized > IsTerminal for & mut T {
58
49
#[ inline]
59
50
fn is_terminal ( & self ) -> bool {
60
- is_terminal_polyfill :: IsTerminal :: is_terminal ( self )
51
+ T :: is_terminal ( & * * self )
61
52
}
62
53
}
63
-
64
- impl IsTerminal for & ' _ mut std:: io:: StdoutLock < ' _ > {
54
+ impl < T : IsTerminal + ?Sized > IsTerminal for Box < T > {
65
55
#[ inline]
66
56
fn is_terminal ( & self ) -> bool {
67
- ( * * self ) . is_terminal ( )
57
+ T :: is_terminal ( & * * self )
68
58
}
69
59
}
70
60
71
- impl IsTerminal for std:: io:: Stderr {
61
+ impl IsTerminal for std:: io:: Stdout {
72
62
#[ inline]
73
63
fn is_terminal ( & self ) -> bool {
74
64
is_terminal_polyfill:: IsTerminal :: is_terminal ( self )
75
65
}
76
66
}
77
67
78
- impl IsTerminal for std:: io:: StderrLock < ' _ > {
68
+ impl IsTerminal for std:: io:: StdoutLock < ' _ > {
79
69
#[ inline]
80
70
fn is_terminal ( & self ) -> bool {
81
71
is_terminal_polyfill:: IsTerminal :: is_terminal ( self )
82
72
}
83
73
}
84
74
85
- impl IsTerminal for & ' _ mut std:: io:: StderrLock < ' _ > {
86
- #[ inline]
87
- fn is_terminal ( & self ) -> bool {
88
- ( * * self ) . is_terminal ( )
89
- }
90
- }
91
-
92
- impl IsTerminal for Box < dyn std:: io:: Write > {
93
- #[ inline]
94
- fn is_terminal ( & self ) -> bool {
95
- false
96
- }
97
- }
98
-
99
- impl IsTerminal for & ' _ mut Box < dyn std:: io:: Write > {
100
- #[ inline]
101
- fn is_terminal ( & self ) -> bool {
102
- false
103
- }
104
- }
105
-
106
- impl IsTerminal for Vec < u8 > {
75
+ impl IsTerminal for std:: io:: Stderr {
107
76
#[ inline]
108
77
fn is_terminal ( & self ) -> bool {
109
- false
78
+ is_terminal_polyfill :: IsTerminal :: is_terminal ( self )
110
79
}
111
80
}
112
81
113
- impl IsTerminal for & ' _ mut Vec < u8 > {
82
+ impl IsTerminal for std :: io :: StderrLock < ' _ > {
114
83
#[ inline]
115
84
fn is_terminal ( & self ) -> bool {
116
- false
85
+ is_terminal_polyfill :: IsTerminal :: is_terminal ( self )
117
86
}
118
87
}
119
88
@@ -124,28 +93,28 @@ impl IsTerminal for std::fs::File {
124
93
}
125
94
}
126
95
127
- impl IsTerminal for & ' _ mut std:: fs:: File {
128
- #[ inline]
129
- fn is_terminal ( & self ) -> bool {
130
- ( * * self ) . is_terminal ( )
131
- }
132
- }
133
-
134
- #[ allow( deprecated) ]
135
- impl IsTerminal for crate :: Buffer {
136
- #[ inline]
137
- fn is_terminal ( & self ) -> bool {
138
- false
139
- }
96
+ macro_rules! impl_default_is_terminal {
97
+ ( $( $( #[ $attr: meta] ) * $t: ty) ,* $( , ) ?) => {
98
+ $(
99
+ $( #[ $attr] ) *
100
+ impl IsTerminal for $t {
101
+ #[ inline]
102
+ fn is_terminal( & self ) -> bool {
103
+ false
104
+ }
105
+ }
106
+ ) *
107
+ } ;
140
108
}
141
109
142
- #[ allow( deprecated) ]
143
- impl IsTerminal for & ' _ mut crate :: Buffer {
144
- #[ inline]
145
- fn is_terminal ( & self ) -> bool {
146
- ( * * self ) . is_terminal ( )
147
- }
148
- }
110
+ impl_default_is_terminal ! (
111
+ dyn std:: io:: Write ,
112
+ dyn std:: io:: Write + Send ,
113
+ dyn std:: io:: Write + Send + Sync ,
114
+ Vec <u8 >,
115
+ #[ allow( deprecated) ]
116
+ crate :: Buffer ,
117
+ ) ;
149
118
150
119
/// Lock a stream
151
120
pub trait AsLockedWrite : private:: Sealed {
@@ -158,109 +127,124 @@ pub trait AsLockedWrite: private::Sealed {
158
127
fn as_locked_write ( & mut self ) -> Self :: Write < ' _ > ;
159
128
}
160
129
161
- impl AsLockedWrite for std:: io:: Stdout {
162
- type Write < ' w > = std:: io:: StdoutLock < ' w > ;
130
+ impl < T : AsLockedWrite + ?Sized > AsLockedWrite for & mut T {
131
+ type Write < ' w >
132
+ = <T as AsLockedWrite >:: Write < ' w >
133
+ where
134
+ Self : ' w ;
163
135
164
136
#[ inline]
165
137
fn as_locked_write ( & mut self ) -> Self :: Write < ' _ > {
166
- self . lock ( )
138
+ T :: as_locked_write ( & mut * * self )
167
139
}
168
140
}
169
-
170
- impl AsLockedWrite for std:: io:: StdoutLock < ' static > {
171
- type Write < ' w > = & ' w mut Self ;
141
+ impl < T : AsLockedWrite + ?Sized > AsLockedWrite for Box < T > {
142
+ type Write < ' w >
143
+ = <T as AsLockedWrite >:: Write < ' w >
144
+ where
145
+ Self : ' w ;
172
146
173
147
#[ inline]
174
148
fn as_locked_write ( & mut self ) -> Self :: Write < ' _ > {
175
- self
149
+ T :: as_locked_write ( & mut * * self )
176
150
}
177
151
}
178
152
179
- impl AsLockedWrite for std:: io:: Stderr {
180
- type Write < ' w > = std:: io:: StderrLock < ' w > ;
153
+ impl AsLockedWrite for std:: io:: Stdout {
154
+ type Write < ' w > = std:: io:: StdoutLock < ' w > ;
181
155
182
156
#[ inline]
183
157
fn as_locked_write ( & mut self ) -> Self :: Write < ' _ > {
184
158
self . lock ( )
185
159
}
186
160
}
187
161
188
- impl AsLockedWrite for std:: io:: StderrLock < ' static > {
189
- type Write < ' w > = & ' w mut Self ;
190
-
191
- #[ inline]
192
- fn as_locked_write ( & mut self ) -> Self :: Write < ' _ > {
193
- self
194
- }
195
- }
196
-
197
- impl AsLockedWrite for Box < dyn std:: io:: Write > {
198
- type Write < ' w > = & ' w mut Self ;
199
-
200
- #[ inline]
201
- fn as_locked_write ( & mut self ) -> Self :: Write < ' _ > {
202
- self
203
- }
204
- }
205
-
206
- impl AsLockedWrite for Vec < u8 > {
207
- type Write < ' w > = & ' w mut Self ;
162
+ impl AsLockedWrite for std:: io:: Stderr {
163
+ type Write < ' w > = std:: io:: StderrLock < ' w > ;
208
164
209
165
#[ inline]
210
166
fn as_locked_write ( & mut self ) -> Self :: Write < ' _ > {
211
- self
167
+ self . lock ( )
212
168
}
213
169
}
214
170
215
- impl AsLockedWrite for std:: fs:: File {
216
- type Write < ' w > = & ' w mut Self ;
171
+ macro_rules! impl_default_locked_write {
172
+ ( $( $( #[ $attr: meta] ) * $t: ty) ,* $( , ) ?) => {
173
+ $(
174
+ $( #[ $attr] ) *
175
+ impl AsLockedWrite for $t {
176
+ type Write <' w> = & ' w mut Self where Self : ' w;
217
177
218
- #[ inline]
219
- fn as_locked_write ( & mut self ) -> Self :: Write < ' _ > {
220
- self
221
- }
178
+ #[ inline]
179
+ fn as_locked_write( & mut self ) -> Self :: Write <' _> {
180
+ self
181
+ }
182
+ }
183
+ ) *
184
+ } ;
222
185
}
223
186
224
- #[ allow( deprecated) ]
225
- impl AsLockedWrite for crate :: Buffer {
226
- type Write < ' w > = & ' w mut Self ;
227
-
228
- #[ inline]
229
- fn as_locked_write ( & mut self ) -> Self :: Write < ' _ > {
230
- self
231
- }
232
- }
187
+ impl_default_locked_write ! (
188
+ dyn std:: io:: Write ,
189
+ dyn std:: io:: Write + Send ,
190
+ dyn std:: io:: Write + Send + Sync ,
191
+ std:: io:: StdoutLock <' _>,
192
+ std:: io:: StderrLock <' _>,
193
+ Vec <u8 >,
194
+ std:: fs:: File ,
195
+ #[ allow( deprecated) ]
196
+ crate :: Buffer ,
197
+ ) ;
233
198
234
199
mod private {
235
200
pub trait Sealed { }
236
201
202
+ impl < T : Sealed + ?Sized > Sealed for & T { }
203
+ impl < T : Sealed + ?Sized > Sealed for & mut T { }
204
+ impl < T : Sealed + ?Sized > Sealed for Box < T > { }
205
+
206
+ impl Sealed for dyn std:: io:: Write { }
207
+ impl Sealed for dyn std:: io:: Write + Send { }
208
+ impl Sealed for dyn std:: io:: Write + Send + Sync { }
209
+
237
210
impl Sealed for std:: io:: Stdout { }
238
211
239
212
impl Sealed for std:: io:: StdoutLock < ' _ > { }
240
213
241
- impl Sealed for & ' _ mut std:: io:: StdoutLock < ' _ > { }
242
-
243
214
impl Sealed for std:: io:: Stderr { }
244
215
245
216
impl Sealed for std:: io:: StderrLock < ' _ > { }
246
217
247
- impl Sealed for & ' _ mut std :: io :: StderrLock < ' _ > { }
218
+ impl Sealed for Vec < u8 > { }
248
219
249
- impl Sealed for Box < dyn std:: io :: Write > { }
220
+ impl Sealed for std:: fs :: File { }
250
221
251
- impl Sealed for & ' _ mut Box < dyn std:: io:: Write > { }
222
+ #[ allow( deprecated) ]
223
+ impl Sealed for crate :: Buffer { }
224
+ }
252
225
253
- impl Sealed for Vec < u8 > { }
226
+ #[ cfg( test) ]
227
+ mod tests {
228
+ use super :: * ;
254
229
255
- impl Sealed for & ' _ mut Vec < u8 > { }
230
+ fn assert_raw_stream < T : RawStream > ( ) { }
256
231
257
- impl Sealed for std:: fs:: File { }
232
+ #[ test]
233
+ fn raw_streams ( ) {
234
+ assert_raw_stream :: < Box < dyn std:: io:: Write > > ( ) ;
235
+ assert_raw_stream :: < Box < dyn std:: io:: Write + ' static > > ( ) ;
236
+ assert_raw_stream :: < Box < dyn std:: io:: Write + Send > > ( ) ;
237
+ assert_raw_stream :: < Box < dyn std:: io:: Write + Send + Sync > > ( ) ;
258
238
259
- impl Sealed for & ' _ mut std:: fs:: File { }
239
+ assert_raw_stream :: < & mut ( dyn std:: io:: Write ) > ( ) ;
240
+ assert_raw_stream :: < & mut ( dyn std:: io:: Write + ' static ) > ( ) ;
241
+ assert_raw_stream :: < & mut ( dyn std:: io:: Write + Send ) > ( ) ;
242
+ assert_raw_stream :: < & mut ( dyn std:: io:: Write + Send + Sync ) > ( ) ;
260
243
261
- # [ allow ( deprecated ) ]
262
- impl Sealed for crate :: Buffer { }
244
+ assert_raw_stream :: < Vec < u8 > > ( ) ;
245
+ assert_raw_stream :: < & mut Vec < u8 > > ( ) ;
263
246
264
- #[ allow( deprecated) ]
265
- impl Sealed for & ' _ mut crate :: Buffer { }
247
+ assert_raw_stream :: < std:: fs:: File > ( ) ;
248
+ assert_raw_stream :: < & mut std:: fs:: File > ( ) ;
249
+ }
266
250
}
0 commit comments