cluExtIO/write/mutex/
mod.rs1
2use crate::write::ext_write::ExtWrite;
3
4mod guard;
5mod write;
6pub use self::guard::*;
7pub use self::write::*;
8
9use std::sync::MutexGuard;
10use std::io::Write;
11use std::sync::Mutex;
12use std::io;
13use std::fmt;
14
15#[derive(Debug)]
17pub struct MutexWrite<T: Write>(Mutex<T>);
18
19impl<T: Write> MutexWrite<T> {
20 #[inline]
21 pub fn new(t: T) -> Self {
22 Self::mutex(Mutex::new(t))
23 }
24 #[inline]
25 pub fn mutex(m: Mutex<T>) -> Self {
26 MutexWrite(m)
27 }
28
29 #[inline(always)]
30 fn _lock<'a>(&'a self) -> MutexGuard<'a, T> {
31 match self.0.lock() {
32 Ok(a) => a,
33 Err(e) => e.into_inner(),
34 }
35 }
36}
37
38impl<T: Write> From<T> for MutexWrite<T> {
39 #[inline(always)]
40 fn from(a: T) -> Self {
41 Self::new(a)
42 }
43}
44
45impl<T: Write> From<Mutex<T>> for MutexWrite<T> {
46 #[inline(always)]
47 fn from(a: Mutex<T>) -> Self {
48 Self::mutex(a)
49 }
50}
51
52impl<T: Write> Write for MutexWrite<T> {
53 #[inline(always)]
54 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
55 self._lock().write(buf)
56 }
57
58 #[inline(always)]
59 fn flush(&mut self) -> io::Result<()> {
60 self._lock().flush()
61 }
62
63 #[inline(always)]
64 fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
65 self._lock().write_all(buf)
66 }
67
68 #[inline(always)]
69 fn write_fmt(&mut self, fmt: fmt::Arguments) -> io::Result<()> {
70 self._lock().write_fmt(fmt)
71 }
72}
73
74impl<T: Write + Clone> Clone for MutexWrite<T> {
75 #[inline]
76 fn clone(&self) -> Self {
77 Self::new(self._lock().clone())
78 }
79}
80
81
82
83impl<'a, T: 'a + Write> ExtWrite<'a> for MutexWrite<T> {
84 type LockWrite = GuardWrite<'a, T>;
85
86 #[inline]
87 fn lock(&'a self) -> Self::LockWrite {
88 GuardWrite::guard(self._lock())
89 }
90}
91
92
93impl<T: 'static + Write> Into<Box<Write>> for MutexWrite<T> {
94 #[inline]
95 fn into(self) -> Box<Write> {
96 Box::new(self) as Box<Write>
97 }
98}