Replace TrustedAsOfLength with safe As and Set.
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using UnsafeIL;
|
||||
|
||||
namespace Cryville.Common.Pdt {
|
||||
/// <summary>
|
||||
@@ -126,10 +127,43 @@ namespace Cryville.Common.Pdt {
|
||||
throw new InvalidCastException("Not an identifier");
|
||||
return *(int*)(_ptr + offset);
|
||||
}
|
||||
internal void* TrustedAsOfLength(int len) {
|
||||
if (Length < len)
|
||||
throw new InvalidCastException("Type not matched");
|
||||
return _ptr;
|
||||
/// <summary>
|
||||
/// Gets the memory of the span as an instance of the specified type.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The specified type.</typeparam>
|
||||
/// <param name="offset">The offset on the span to start reading from.</param>
|
||||
/// <returns>An instance of the specified type.</returns>
|
||||
/// <exception cref="ArgumentOutOfRangeException"><paramref name="offset" /> is not less than the length of the span.</exception>
|
||||
/// <exception cref="InvalidCastException">The length of the span is not sufficient.</exception>
|
||||
/// <remarks>
|
||||
/// <para>Use <see cref="AsNumber(int)" /> instead while reading an unaligned number.</para>
|
||||
/// </remarks>
|
||||
public T As<T>(int offset = 0) {
|
||||
var len = Unsafe.SizeOf<T>();
|
||||
if (offset >= Length)
|
||||
throw new ArgumentOutOfRangeException("offset");
|
||||
if (offset + len > Length)
|
||||
throw new InvalidCastException("Frame length not sufficient");
|
||||
return Unsafe.Read<T>(_ptr + offset);
|
||||
}
|
||||
/// <summary>
|
||||
/// Sets the memory of the span to an instance of the specified type.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The specified type.</typeparam>
|
||||
/// <param name="value">The value.</param>
|
||||
/// <param name="offset">The offset from the start of the span.</param>
|
||||
/// <exception cref="ArgumentOutOfRangeException"><paramref name="offset" /> is not less than the length of the span.</exception>
|
||||
/// <exception cref="InvalidCastException">The length of the span is not sufficient.</exception>
|
||||
/// <remarks>
|
||||
/// <para>Use <see cref="SetNumber(float, int)" /> instead while writing an unaligned number.</para>
|
||||
/// </remarks>
|
||||
public void Set<T>(T value, int offset = 0) {
|
||||
var len = Unsafe.SizeOf<T>();
|
||||
if (offset >= Length)
|
||||
throw new ArgumentOutOfRangeException("offset");
|
||||
if (offset + len > Length)
|
||||
throw new InvalidCastException("Frame length not sufficient");
|
||||
Unsafe.Write(_ptr + offset, value);
|
||||
}
|
||||
/// <summary>
|
||||
/// Gets the array suffix.
|
||||
|
Reference in New Issue
Block a user