Files
Il2CppInspectorRedux/VersionedSerialization/SeekableReaderExtensions.cs
LukeFZ 20f90a0926 vendor in newer version of VersionedSerialization
this is done now to reduce the migration burden in the future when this is made into a nuget package (hopefully)
2026-03-13 17:34:07 +01:00

63 lines
1.8 KiB
C#

using System.Numerics;
using System.Runtime.CompilerServices;
using VersionedSerialization.Impl;
namespace VersionedSerialization;
file static class ReaderAccessors<TReader>
where TReader : IReader, allows ref struct
{
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_impl")]
public static extern ref TReader GetImpl(ref Reader<TReader> obj);
}
public static class SeekableReaderExtensions
{
extension<TReader>(ref Reader<TReader> reader)
where TReader : ISeekableReader, allows ref struct
{
public int Offset
{
get => ReaderAccessors<TReader>.GetImpl(ref reader).Offset;
set => ReaderAccessors<TReader>.GetImpl(ref reader).Offset = value;
}
public int Length => ReaderAccessors<TReader>.GetImpl(ref reader).Length;
public void Align(int alignment = 0)
{
if (alignment == 0)
{
alignment = reader.Config.Is32Bit
? sizeof(int)
: sizeof(long);
}
if (BitOperations.IsPow2(alignment))
{
reader.Offset = (reader.Offset + (alignment - 1)) & ~(alignment - 1);
}
else
{
var offset = reader.Offset;
var rem = offset % alignment;
if (rem != 0)
{
reader.Offset += alignment - rem;
}
}
}
public void Skip(int count)
{
reader.Offset += count;
}
}
extension<TReader>(TReader reader) where TReader : ISeekableReader, allows ref struct
{
public LittleEndianSeekableReader<TReader> AsLittleEndian() => new(reader);
public BigEndianSeekableReader<TReader> AsBigEndian() => new(reader);
}
}