aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/io/reader.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/vlib/io/reader.v')
-rw-r--r--v_windows/v/vlib/io/reader.v66
1 files changed, 66 insertions, 0 deletions
diff --git a/v_windows/v/vlib/io/reader.v b/v_windows/v/vlib/io/reader.v
new file mode 100644
index 0000000..61f566f
--- /dev/null
+++ b/v_windows/v/vlib/io/reader.v
@@ -0,0 +1,66 @@
+module io
+
+// Reader represents a stream of data that can be read
+pub interface Reader {
+ // read reads up to buf.len bytes and places
+ // them into buf.
+ // A type that implements this should return
+ // `none` on end of stream (EOF) instead of just returning 0
+ read(mut buf []byte) ?int
+}
+
+const (
+ read_all_len = 10 * 1024
+ read_all_grow_len = 1024
+)
+
+// ReadAllConfig allows options to be passed for the behaviour
+// of read_all
+pub struct ReadAllConfig {
+ reader Reader
+ read_to_end_of_stream bool
+}
+
+// read_all reads all bytes from a reader until either a 0 length read
+// or if read_to_end_of_stream is true then the end of the stream (`none`)
+pub fn read_all(config ReadAllConfig) ?[]byte {
+ r := config.reader
+ read_till_eof := config.read_to_end_of_stream
+
+ mut b := []byte{len: io.read_all_len}
+ mut read := 0
+ for {
+ new_read := r.read(mut b[read..]) or { break }
+ read += new_read
+ if !read_till_eof && read == 0 {
+ break
+ }
+ if b.len == read {
+ unsafe { b.grow_len(io.read_all_grow_len) }
+ }
+ }
+ return b[..read]
+}
+
+// read_any reads any available bytes from a reader
+// (until the reader returns a read of 0 length)
+pub fn read_any(r Reader) ?[]byte {
+ mut b := []byte{len: io.read_all_len}
+ mut read := 0
+ for {
+ new_read := r.read(mut b[read..]) or { break }
+ read += new_read
+ if new_read == 0 {
+ break
+ }
+ if b.len == read {
+ unsafe { b.grow_len(io.read_all_grow_len) }
+ }
+ }
+ return b[..read]
+}
+
+// RandomReader represents a stream of data that can be read from at a random location
+interface RandomReader {
+ read_from(pos u64, mut buf []byte) ?int
+}