Browse Source

Remove `using stream` on custom stream types in package io

gingerBill 4 years ago
parent
commit
6e04b1c429
2 changed files with 22 additions and 25 deletions
  1. 10 12
      core/io/multi.odin
  2. 12 13
      core/io/util.odin

+ 10 - 12
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;
 }

+ 12 - 13
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);
 }