1
2
3
4
5
6 using System;
7 using System.Collections;
8
9 namespace System.IO
10 {
11 public class MemoryStream : Stream
12 {
13 public MemoryStream() : content(), readPos(0)
14 {
15 }
16 public MemoryStream(byte* data, long count) : content(), readPos(0)
17 {
18 auto result = this->Write(data, count);
19 if (result.Error())
20 {
21 SetErrorId(result.GetErrorId());
22 }
23 }
24 suppress MemoryStream(const MemoryStream&);
25 suppress void operator=(const MemoryStream&);
26 public default MemoryStream(MemoryStream&&);
27 public default void operator=(MemoryStream&&);
28 public inline const byte* Data() const
29 {
30 return content.CBegin().Ptr();
31 }
32 public inline long Count() const
33 {
34 return content.Count();
35 }
36 public inline long ReadPos() const
37 {
38 return readPos;
39 }
40 [nodiscard]
41 public override Result<int> ReadByte()
42 {
43 if (readPos < content.Count())
44 {
45 byte r = content[readPos++];
46 return Result<int>(r);
47 }
48 return Result<int>(-1);
49 }
50 [nodiscard]
51 public override Result<long> Read(byte* buf, long count)
52 {
53 long bytesRead = 0;
54 long n = content.Count();
55 while (count > 0 && readPos < n)
56 {
57 *buf++ = content[readPos++];
58 ++bytesRead;
59 --count;
60 }
61 return Result<long>(bytesRead);
62 }
63 [nodiscard]
64 public override Result<bool> Write(byte x)
65 {
66 content.Add(x);
67 return Result<bool>(true);
68 }
69 [nodiscard]
70 public override Result<bool> Write(byte* buf, long count)
71 {
72 while (count > 0)
73 {
74 content.Add(*buf++);
75 --count;
76 }
77 return Result<bool>(true);
78 }
79 [nodiscard]
80 public override Result<bool> Seek(long pos, Origin origin)
81 {
82 switch (origin)
83 {
84 case Origin.seekSet: readPos = pos; break;
85 case Origin.seekCur: readPos = readPos + pos; break;
86 case Origin.seekEnd: readPos = content.Count() + pos; break;
87 }
88 return Result<bool>(true);
89 }
90 public override Result<long> Tell()
91 {
92 return Result<long>(readPos);
93 }
94 private List<byte> content;
95 private long readPos;
96 }