Update package io

This commit is contained in:
gingerBill
2021-01-09 00:30:10 +00:00
parent 37253f2621
commit 56980e51da
2 changed files with 69 additions and 93 deletions
+15 -33
View File
@@ -1,8 +1,5 @@
package io
import "core:runtime"
@(private)
Multi_Reader :: struct {
readers: [dynamic]Reader,
}
@@ -27,19 +24,10 @@ _multi_reader_vtable := &Stream_VTable{
}
return 0, .EOF;
},
impl_destroy = proc(s: Stream) -> Error {
mr := (^Multi_Reader)(s.stream_data);
context.allocator = mr.readers.allocator;
delete(mr.readers);
free(mr);
return .None;
},
};
multi_reader :: proc(readers: ..Reader, allocator := context.allocator) -> (r: Reader) {
context.allocator = allocator;
mr := new(Multi_Reader);
all_readers := make([dynamic]Reader, 0, len(readers));
multi_reader_init :: proc(mr: ^Multi_Reader, readers: ..Reader, allocator := context.allocator) -> (r: Reader) {
all_readers := make([dynamic]Reader, 0, len(readers), allocator);
for w in readers {
if w.stream_vtable == _multi_reader_vtable {
@@ -57,11 +45,13 @@ multi_reader :: proc(readers: ..Reader, allocator := context.allocator) -> (r: R
return;
}
multi_reader_destroy :: proc(mr: ^Multi_Reader) {
delete(mr.readers);
}
@(private)
Multi_Writer :: struct {
writers: []Writer,
allocator: runtime.Allocator,
writers: [dynamic]Writer,
}
@(private)
@@ -81,33 +71,25 @@ _multi_writer_vtable := &Stream_VTable{
return len(p), nil;
},
impl_destroy = proc(s: Stream) -> Error {
mw := (^Multi_Writer)(s.stream_data);
context.allocator = mw.allocator;
delete(mw.writers);
free(mw);
return .None;
},
};
multi_writer :: proc(writers: ..Writer, allocator := context.allocator) -> (out: Writer) {
context.allocator = allocator;
mw := new(Multi_Writer);
mw.allocator = allocator;
all_writers := make([dynamic]Writer, 0, len(writers));
multi_writer_init :: proc(mw: ^Multi_Writer, writers: ..Writer, allocator := context.allocator) -> (out: Writer) {
mw.writers = make([dynamic]Writer, 0, len(writers), allocator);
for w in writers {
if w.stream_vtable == _multi_writer_vtable {
other := (^Multi_Writer)(w.stream_data);
append(&all_writers, ..other.writers);
append(&mw.writers, ..other.writers[:]);
} else {
append(&all_writers, w);
append(&mw.writers, w);
}
}
mw.writers = all_writers[:];
out.stream_vtable = _multi_writer_vtable;
out.stream_data = mw;
return;
}
multi_writer_destroy :: proc(mw: ^Multi_Writer) {
delete(mw.writers);
}