1 /**
2 	Multicasts an input stream to multiple output streams.
3 
4 	Copyright: © 2014-2016 RejectedSoftware e.K.
5 	License: Subject to the terms of the MIT license, as written in the included LICENSE.txt file.
6 	Authors: Eric Cornelius
7 */
8 module vibe.stream.multicast;
9 
10 import vibe.core.core;
11 import vibe.core.stream;
12 
13 import std.exception;
14 
15 MulticastStream createMulticastStream(scope OutputStream[] outputs...)
16 {
17 	return new MulticastStream(outputs, true);
18 }
19 
20 
21 class MulticastStream : OutputStream {
22 	private {
23 		OutputStream[] m_outputs;
24 	}
25 
26 	deprecated("Use createMulticastStream instead.")
27 	this(OutputStream[] outputs ...)
28 	{
29 		this(outputs, true);
30 	}
31 
32 	/// private
33 	this(scope OutputStream[] outputs, bool dummy)
34 	{
35 		// NOTE: investigate .dup dmd workaround
36 		m_outputs = outputs.dup;
37 	}
38 
39 	void finalize()
40 	{
41 		flush();
42 	}
43 
44 	void flush()
45 	{
46 		foreach (output; m_outputs)
47 			output.flush();
48 	}
49 
50 	size_t write(in ubyte[] bytes, IOMode mode)
51 	{
52 		if (!m_outputs.length) return bytes.length;
53 
54 		auto ret = m_outputs[0].write(bytes, mode);
55 
56 		foreach (output; m_outputs[1 .. $])
57 			output.write(bytes[0 .. ret]);
58 
59 		return ret;
60 	}
61 
62 	alias write = OutputStream.write;
63 }