1 // =================================
 2 // Copyright (c) 2024 Seppo Laakko
 3 // Distributed under the MIT license
 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* datalong count) : content()readPos(0)
17         {
18             auto result = this->Write(datacount);
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* buflong 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* buflong 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 posOrigin 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     }