Skip to content

Commit 2bbc343

Browse files
authored
Merge pull request #225 from DaniPopes/as-locked-write-impls
feat: Implement AsLockedWrite generically too
2 parents f4a1f98 + 8639e08 commit 2bbc343

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

crates/anstream/src/stream.rs

+72
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,30 @@ pub trait AsLockedWrite: private::Sealed {
142142
fn as_locked_write(&mut self) -> Self::Write<'_>;
143143
}
144144

145+
impl<T: AsLockedWrite + ?Sized> AsLockedWrite for &mut T {
146+
type Write<'w>
147+
= T::Write<'w>
148+
where
149+
Self: 'w;
150+
151+
#[inline]
152+
fn as_locked_write(&mut self) -> Self::Write<'_> {
153+
(**self).as_locked_write()
154+
}
155+
}
156+
157+
impl<T: AsLockedWrite + ?Sized> AsLockedWrite for Box<T> {
158+
type Write<'w>
159+
= T::Write<'w>
160+
where
161+
Self: 'w;
162+
163+
#[inline]
164+
fn as_locked_write(&mut self) -> Self::Write<'_> {
165+
(**self).as_locked_write()
166+
}
167+
}
168+
145169
impl AsLockedWrite for std::io::Stdout {
146170
type Write<'w> = std::io::StdoutLock<'w>;
147171

@@ -187,6 +211,24 @@ impl AsLockedWrite for dyn std::io::Write {
187211
}
188212
}
189213

214+
impl AsLockedWrite for dyn std::io::Write + Send {
215+
type Write<'w> = &'w mut Self;
216+
217+
#[inline]
218+
fn as_locked_write(&mut self) -> Self::Write<'_> {
219+
self
220+
}
221+
}
222+
223+
impl AsLockedWrite for dyn std::io::Write + Send + Sync {
224+
type Write<'w> = &'w mut Self;
225+
226+
#[inline]
227+
fn as_locked_write(&mut self) -> Self::Write<'_> {
228+
self
229+
}
230+
}
231+
190232
impl AsLockedWrite for Vec<u8> {
191233
type Write<'w> = &'w mut Self;
192234

@@ -241,3 +283,33 @@ mod private {
241283
#[allow(deprecated)]
242284
impl Sealed for crate::Buffer {}
243285
}
286+
287+
#[cfg(test)]
288+
mod tests {
289+
use super::*;
290+
291+
fn assert_raw_stream<T: RawStream>()
292+
where
293+
crate::AutoStream<T>: std::io::Write,
294+
{
295+
}
296+
297+
#[test]
298+
fn test() {
299+
assert_raw_stream::<Box<dyn std::io::Write>>();
300+
assert_raw_stream::<Box<dyn std::io::Write + 'static>>();
301+
assert_raw_stream::<Box<dyn std::io::Write + Send>>();
302+
assert_raw_stream::<Box<dyn std::io::Write + Send + Sync>>();
303+
304+
assert_raw_stream::<&mut (dyn std::io::Write)>();
305+
assert_raw_stream::<&mut (dyn std::io::Write + 'static)>();
306+
assert_raw_stream::<&mut (dyn std::io::Write + Send)>();
307+
assert_raw_stream::<&mut (dyn std::io::Write + Send + Sync)>();
308+
309+
assert_raw_stream::<Vec<u8>>();
310+
assert_raw_stream::<&mut Vec<u8>>();
311+
312+
assert_raw_stream::<std::fs::File>();
313+
assert_raw_stream::<&mut std::fs::File>();
314+
}
315+
}

0 commit comments

Comments
 (0)