1 module dlangui.core.streams;
2
3 private import std.stdio;
4
5 interface Closeable {
6 void close();
7 @property bool isOpen();
8 }
9
10 interface InputStream : Closeable {
11 size_t read(ubyte[] buffer);
12 @property bool eof();
13 }
14
15 interface OutputStream : Closeable {
16 void write(ubyte[] data);
17 }
18
19 class FileInputStream : InputStream {
20 std.stdio.File _file;
21 this(string filename) {
22 _file = std.stdio.File(filename, "rb");
23 }
24 void close() {
25 if (isOpen)
26 _file.close();
27 }
28 size_t read(ubyte[] buffer) {
29 ubyte[] res = _file.rawRead(buffer);
30 return res.length;
31 }
32 @property bool isOpen() {
33 return _file.isOpen;
34 }
35 @property bool eof() {
36 return _file.eof;
37 }
38 }
39
40 class FileOutputStream : OutputStream {
41 std.stdio.File _file;
42 this(string filename) {
43 _file = std.stdio.File(filename, "wb");
44 }
45 void close() {
46 _file.close();
47 }
48 void write(ubyte[] data) {
49 _file.rawWrite(data);
50 }
51 @property bool isOpen() {
52 return _file.isOpen;
53 }
54 }
55
56 class MemoryInputStream : InputStream {
57 private ubyte[] _data;
58 private size_t _pos;
59 private bool _closed;
60 this(ubyte[] data) {
61 _data = data;
62 _closed = false;
63 _pos = 0;
64 }
65 void close() {
66 _closed = true;
67 }
68 @property bool isOpen() {
69 return !_closed;
70 }
71 size_t read(ubyte[] buffer) {
72 size_t bytesRead = 0;
73 for (size_t i = 0; i < buffer.length && _pos < _data.length; bytesRead++) {
74 buffer[i++] = _data[_pos++];
75 }
76 return bytesRead;
77 }
78 @property bool eof() {
79 return _closed || (_pos >= _data.length);
80 }
81 }