104 lines
3.6 KiB
C#
104 lines
3.6 KiB
C#
using System;
|
|
|
|
using Best.HTTP.Shared.PlatformSupport.Text;
|
|
|
|
namespace Best.HTTP.Shared.PlatformSupport.Memory
|
|
{
|
|
[Best.HTTP.Shared.PlatformSupport.IL2CPP.Il2CppEagerStaticClassConstructionAttribute]
|
|
public struct AutoReleaseBuffer : IDisposable
|
|
{
|
|
public static readonly AutoReleaseBuffer Empty = new AutoReleaseBuffer(null);
|
|
|
|
public byte[] Data;
|
|
public int Offset;
|
|
public int Count;
|
|
|
|
public AutoReleaseBuffer(byte[] data)
|
|
{
|
|
this.Data = data;
|
|
this.Offset = 0;
|
|
this.Count = data != null ? data.Length : 0;
|
|
}
|
|
|
|
public AutoReleaseBuffer(BufferSegment segment)
|
|
{
|
|
this.Data = segment.Data;
|
|
this.Offset = segment.Offset;
|
|
this.Count = segment.Count;
|
|
}
|
|
|
|
public AutoReleaseBuffer(byte[] data, int offset, int count)
|
|
{
|
|
this.Data = data;
|
|
this.Offset = offset;
|
|
this.Count = count;
|
|
}
|
|
|
|
public BufferSegment Slice(int newOffset) => new BufferSegment(this.Data, newOffset, this.Count - (newOffset - this.Offset));
|
|
|
|
public BufferSegment Slice(int offset, int count) => new BufferSegment(this.Data, offset, count);
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
if (obj == null || !(obj is BufferSegment))
|
|
return false;
|
|
|
|
return Equals((BufferSegment)obj);
|
|
}
|
|
|
|
public bool Equals(BufferSegment other) => this.Data == other.Data && this.Offset == other.Offset && this.Count == other.Count;
|
|
public bool Equals(AutoReleaseBuffer other) => this.Data == other.Data && this.Offset == other.Offset && this.Count == other.Count;
|
|
|
|
public override int GetHashCode() => (this.Data != null ? this.Data.GetHashCode() : 0) * 21 + this.Offset + this.Count;
|
|
|
|
public static bool operator ==(AutoReleaseBuffer left, AutoReleaseBuffer right) => left.Equals(right);
|
|
|
|
public static bool operator !=(AutoReleaseBuffer left, AutoReleaseBuffer right) => !left.Equals(right);
|
|
|
|
public static bool operator ==(AutoReleaseBuffer left, BufferSegment right) => left.Equals(right);
|
|
|
|
public static bool operator !=(AutoReleaseBuffer left, BufferSegment right) => !left.Equals(right);
|
|
|
|
public static implicit operator byte[](AutoReleaseBuffer left) => left.Data;
|
|
public static implicit operator BufferSegment(AutoReleaseBuffer left) => new BufferSegment(left.Data, left.Offset, left.Count);
|
|
|
|
public override string ToString()
|
|
{
|
|
var sb = StringBuilderPool.Get(this.Count + 5);
|
|
sb.Append("[AutoReleaseBuffer ");
|
|
|
|
if (this.Count > 0)
|
|
{
|
|
sb.AppendFormat("Offset: {0:N0} ", this.Offset);
|
|
sb.AppendFormat("Count: {0:N0} ", this.Count);
|
|
sb.Append("Data: [");
|
|
|
|
if (this.Count > 0)
|
|
{
|
|
int dumpCount = Math.Min(this.Count, BufferSegment.ToStringMaxDumpLength);
|
|
|
|
sb.AppendFormat("{0:X2}", this.Data[this.Offset]);
|
|
for (int i = 1; i < dumpCount; ++i)
|
|
sb.AppendFormat(", {0:X2}", this.Data[this.Offset + i]);
|
|
|
|
if (this.Count > dumpCount)
|
|
sb.Append(", ...");
|
|
}
|
|
|
|
sb.Append("]]");
|
|
}
|
|
else
|
|
sb.Append(']');
|
|
|
|
return StringBuilderPool.ReleaseAndGrab(sb);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
if (this.Data != null)
|
|
BufferPool.Release(this.Data);
|
|
this.Data = null;
|
|
}
|
|
}
|
|
}
|