cluExtIO/write/mutex/
mod.rs

1
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///Combining multiple `Trait Write` into one common.
16#[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}