Browse Source

MemStream improvements

Brian Fiete 3 years ago
parent
commit
c3644d15de
1 changed files with 101 additions and 0 deletions
  1. 101 0
      BeefLibs/corlib/src/IO/DynMemStream.bf

+ 101 - 0
BeefLibs/corlib/src/IO/DynMemStream.bf

@@ -15,6 +15,11 @@ namespace System.IO
 			mOwnsData = true;
 		}
 
+		public this(List<uint8> data)
+		{
+			mData = data;
+		}
+
 		public uint8* Ptr
 		{
 			get
@@ -112,4 +117,100 @@ namespace System.IO
 			mData.RemoveRange(0, count);
 		}
 	}
+
+	class DynMemStreamSequential : Stream
+	{
+		List<uint8> mData ~ { if (mOwnsData) delete _; };
+		bool mOwnsData;
+
+		public this()
+		{
+			mData = new .();
+			mOwnsData = true;
+		}
+
+		public this(List<uint8> data)
+		{
+			mData = data;
+		}
+
+		public uint8* Ptr
+		{
+			get
+			{
+				return mData.Ptr;
+			}
+		}
+		
+		public Span<uint8> Content
+		{
+			get
+			{
+				return mData;
+			}
+		}
+
+		public override int64 Position
+		{
+			get
+			{
+				return mData.Count;
+			}
+
+			set
+			{
+				Runtime.FatalError();
+			}
+		}
+
+		public override int64 Length
+		{
+			get
+			{
+				return mData.Count;
+			}
+		}
+
+		public override bool CanRead
+		{
+			get
+			{
+				return true;
+			}
+		}
+
+		public override bool CanWrite
+		{
+			get
+			{
+				return true;
+			}
+		}
+
+		public List<uint8> TakeOwnership()
+		{
+			Debug.Assert(mOwnsData);
+			mOwnsData = false;
+			return mData;
+		}
+
+		public override Result<int> TryRead(Span<uint8> data)
+		{
+			return .Err;
+		}
+
+		public override Result<int> TryWrite(Span<uint8> data)
+		{
+			let count = data.Length;
+			if (count == 0)
+				return .Ok(0);
+			Internal.MemCpy(mData.GrowUnitialized(count), data.Ptr, count);
+			return .Ok(count);
+		}
+
+		public override Result<void> Close()
+		{
+			return .Ok;
+		}
+	}
 }