diff --git a/core/io/multi.odin b/core/io/multi.odin index b6583ecf6..817d4a1cb 100644 --- a/core/io/multi.odin +++ b/core/io/multi.odin @@ -4,7 +4,6 @@ import "core:runtime" @(private) Multi_Reader :: struct { - using stream: Stream, readers: [dynamic]Reader, } @@ -37,11 +36,9 @@ _multi_reader_vtable := &Stream_VTable{ }, }; -mutlti_reader :: proc(readers: ..Reader, allocator := context.allocator) -> Reader { +mutlti_reader :: proc(readers: ..Reader, allocator := context.allocator) -> (r: Reader) { context.allocator = allocator; mr := new(Multi_Reader); - mr.stream_vtable = _multi_reader_vtable; - mr.stream_data = mr; all_readers := make([dynamic]Reader, 0, len(readers)); for w in readers { @@ -54,14 +51,15 @@ mutlti_reader :: proc(readers: ..Reader, allocator := context.allocator) -> Read } mr.readers = all_readers; - res, _ := to_reader(mr^); - return res; + + r.stream_vtable = _multi_reader_vtable; + r.stream_data = mr; + return; } @(private) Multi_Writer :: struct { - using stream: Stream, writers: []Writer, allocator: runtime.Allocator, } @@ -92,11 +90,9 @@ _multi_writer_vtable := &Stream_VTable{ }, }; -mutlti_writer :: proc(writers: ..Writer, allocator := context.allocator) -> Writer { +mutlti_writer :: proc(writers: ..Writer, allocator := context.allocator) -> (w: Writer) { context.allocator = allocator; mw := new(Multi_Writer); - mw.stream_vtable = _multi_writer_vtable; - mw.stream_data = mw; mw.allocator = allocator; all_writers := make([dynamic]Writer, 0, len(writers)); @@ -110,6 +106,8 @@ mutlti_writer :: proc(writers: ..Writer, allocator := context.allocator) -> Writ } mw.writers = all_writers[:]; - res, _ := to_writer(mw^); - return res; + + w.stream_vtable = _multi_writer_vtable; + w.stream_data = mw; + return; } diff --git a/core/io/util.odin b/core/io/util.odin index 06e95a8b3..b618a6c23 100644 --- a/core/io/util.odin +++ b/core/io/util.odin @@ -23,7 +23,6 @@ write_int :: proc(w: Writer, i: int, base: int = 10) -> (n: int, err: Error) { @(private) Tee_Reader :: struct { - using stream: Stream, r: Reader, w: Writer, allocator: runtime.Allocator, @@ -51,14 +50,14 @@ _tee_reader_vtable := &Stream_VTable{ // tee_reader // tee_reader must call io.destroy when done with -tee_reader :: proc(r: Reader, w: Writer, allocator := context.allocator) -> Reader { +tee_reader :: proc(r: Reader, w: Writer, allocator := context.allocator) -> (out: Reader) { t := new(Tee_Reader, allocator); t.r, t.w = r, w; t.allocator = allocator; - t.stream_data = t; - t.stream_vtable = _tee_reader_vtable; - res, _ := to_reader(t^); - return res; + + out.stream_data = t; + out.stream_vtable = _tee_reader_vtable; + return; } @@ -67,7 +66,6 @@ tee_reader :: proc(r: Reader, w: Writer, allocator := context.allocator) -> Read // updates n to reflect the new amount remaining. // read returns EOF when n <= 0 or when the underlying r returns EOF. Limited_Reader :: struct { - using stream: Stream, r: Reader, // underlying reader n: i64, // max_bytes } @@ -91,19 +89,20 @@ _limited_reader_vtable := &Stream_VTable{ new_limited_reader :: proc(r: Reader, n: i64) -> ^Limited_Reader { l := new(Limited_Reader); - l.stream_vtable = _limited_reader_vtable; - l.stream_data = l; l.r = r; l.n = n; return l; } +limited_reader_to_reader :: proc(l: ^Limited_Reader) -> (r: Reader) { + r.stream_vtable = _limited_reader_vtable; + r.stream_data = l; + return; +} + @(private="package") inline_limited_reader :: proc(l: ^Limited_Reader, r: Reader, n: i64) -> Reader { - l.stream_vtable = _limited_reader_vtable; - l.stream_data = l; l.r = r; l.n = n; - res, _ := to_reader(l^); - return res; + return limited_reader_to_reader(l); }