mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 20:11:17 +00:00
60 lines
1.3 KiB
Plaintext
60 lines
1.3 KiB
Plaintext
module std::io;
|
|
|
|
/* MultiWriter implements the OutStream interface and duplicates any write
|
|
* operation to all the wrapped writers.
|
|
*/
|
|
struct MultiWriter (OutStream)
|
|
{
|
|
OutStream[] writers;
|
|
Allocator allocator;
|
|
}
|
|
|
|
<*
|
|
@param [&inout] self
|
|
@param [&inout] allocator
|
|
@require writers.len > 0
|
|
@require self.writers.len == 0 : "Init may not run on already initialized data"
|
|
*>
|
|
fn MultiWriter* MultiWriter.init(&self, Allocator allocator, OutStream... writers)
|
|
{
|
|
OutStream[] copy = allocator::new_array(allocator, OutStream, writers.len);
|
|
copy[..] = writers[..];
|
|
*self = { .writers = copy, .allocator = allocator };
|
|
return self;
|
|
}
|
|
|
|
<*
|
|
@param [&inout] self
|
|
@require writers.len > 0
|
|
@require self.writers.len == 0 : "Init may not run on already initialized data"
|
|
*>
|
|
fn MultiWriter* MultiWriter.tinit(&self, OutStream... writers)
|
|
{
|
|
return self.init(tmem, ...writers);
|
|
}
|
|
|
|
fn void MultiWriter.free(&self)
|
|
{
|
|
if (!self.allocator) return;
|
|
allocator::free(self.allocator, self.writers);
|
|
*self = {};
|
|
}
|
|
|
|
fn usz? MultiWriter.write(&self, char[] bytes) @dynamic
|
|
{
|
|
usz n;
|
|
foreach (w : self.writers)
|
|
{
|
|
n = w.write(bytes)!;
|
|
if (n != bytes.len) return INCOMPLETE_WRITE?;
|
|
}
|
|
return bytes.len;
|
|
}
|
|
|
|
fn void? MultiWriter.write_byte(&self, char c) @dynamic
|
|
{
|
|
char[1] data;
|
|
data[0] = c;
|
|
self.write(data[..])!;
|
|
}
|