cluExtIO/write/union/
write.rs

1
2use crate::write::ext_write::ExtWrite;
3
4use std::fmt::Debug;
5use std::io::Write;
6use std::io;
7use std::fmt;
8
9pub struct UnionWrite<W: Write, W2: Write>(W, W2);
10
11impl<W: Write, W2: Write> UnionWrite<W, W2> {
12	#[inline]
13	pub fn new(out: W, out2: W2) -> Self {
14		UnionWrite(out, out2)
15	}
16}
17/* << conflict
18impl<W: Write, W2: Write> From<(W, W2)> for UnionWrite<W, W2> {
19     #[inline]
20     fn from((a, b): (W, W2)) -> Self {
21          Self::new(a, b)
22     }
23}*/
24
25
26impl<W: Write, W2: Write> Debug for UnionWrite<W, W2> {
27	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
28		f.pad("UnionWrite { .. }")
29	}
30}
31
32impl<W: Write, W2: Write> Write for UnionWrite<W, W2> {
33     #[inline(always)]
34     fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
35          let e = self.0.write(buf);
36          let e2 = self.1.write(buf);
37          
38          match e {
39               Ok(ref size_0) => {
40                    match e2 {
41                         Ok(ref size_2) if size_0 >= size_2 => return Ok(*size_0),
42                         Ok(ref size_2) if size_0 < size_2 => return Ok(*size_2),
43                         err => return err,
44                    }
45               },
46               err => return err,
47          }
48     }
49     #[inline(always)]
50     fn flush(&mut self) -> io::Result<()> {
51          let e = self.0.flush();
52          let e2 = self.1.flush();
53
54		if let Err(_) = e {
55               return e;
56          }
57          e2
58     }
59
60	#[inline(always)]
61	fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
62		let e = self.0.write_all(buf);
63          let e2 = self.1.write_all(buf);
64
65		if let Err(_) = e {
66               return e;
67          }
68          e2
69	}
70
71	#[inline(always)]
72	fn write_fmt(&mut self, fmt: fmt::Arguments) -> io::Result<()> {
73          let e = self.0.write_fmt(fmt);
74          let e2 = self.1.write_fmt(fmt);
75
76		if let Err(_) = e {
77               return e;
78          }
79          e2
80	}
81}
82
83impl<W: Write + Clone, W2: Write + Clone> Clone for UnionWrite<W, W2> {
84     fn clone(&self) -> Self {
85          Self::new(self.0.clone(), self.1.clone())
86     }
87}
88
89impl<'a, W: ExtWrite<'a>, W2: ExtWrite<'a>> ExtWrite<'a> for UnionWrite<W, W2> {
90     type LockWrite = UnionWrite<W::LockWrite, W2::LockWrite>;
91
92     fn lock(&'a self) -> Self::LockWrite {
93          Self::LockWrite::new(self.0.lock(), self.1.lock())
94     }
95}
96
97impl<'a, W: 'static + 'a + ExtWrite<'a>, W2: 'static + 'a + ExtWrite<'a>> Into<Box<Write + 'a>> for UnionWrite<W, W2> {
98     fn into(self) -> Box<Write> {
99          Box::new(self)
100     }
101}
102