using System.Collections.Immutable; using VersionedSerialization.Impl; namespace VersionedSerialization; public static class Reader { public static Reader From(T reader, ReaderConfig config = default) where T : IReader, allows ref struct => new(reader, config); public static Reader> LittleEndian(ReadOnlySpan data, int offset = 0, ReaderConfig config = default) => new(new SpanReader(data, offset).AsLittleEndian(), config); public static Reader> BigEndian(ReadOnlySpan data, int offset = 0, ReaderConfig config = default) => new(new SpanReader(data, offset).AsBigEndian(), config); public static T Read(ReadOnlySpan data, int offset = 0, bool littleEndian = true, ReaderConfig config = default) where T : unmanaged { if (littleEndian) { var reader = LittleEndian(data, offset, config); return reader.Read(); } else { var reader = BigEndian(data, offset, config); return reader.Read(); } } public static T ReadPrimitive(ReadOnlySpan data, int offset = 0, bool littleEndian = true, ReaderConfig config = default) where T : unmanaged { if (littleEndian) { var reader = LittleEndian(data, offset, config); return reader.ReadPrimitive(); } else { var reader = BigEndian(data, offset, config); return reader.ReadPrimitive(); } } public static ImmutableArray ReadPrimitiveArray(ReadOnlySpan data, long count, int offset = 0, bool littleEndian = true, ReaderConfig config = default) where T : unmanaged { if (littleEndian) { var reader = LittleEndian(data, offset, config); return reader.ReadPrimitiveArray(count); } else { var reader = BigEndian(data, offset, config); return reader.ReadPrimitiveArray(count); } } public static T ReadVersionedObject(ReadOnlySpan data, StructVersion version = default, int offset = 0, bool littleEndian = true, ReaderConfig config = default) where T : IReadable, new() { if (littleEndian) { var reader = LittleEndian(data, offset, config); return reader.ReadVersionedObject(version); } else { var reader = BigEndian(data, offset, config); return reader.ReadVersionedObject(version); } } public static ImmutableArray ReadVersionedObjectArray(ReadOnlySpan data, long count, StructVersion version = default, int offset = 0, bool littleEndian = true, ReaderConfig config = default) where T : IReadable, new() { if (littleEndian) { var reader = LittleEndian(data, offset, config); return reader.ReadVersionedObjectArray(count, version); } else { var reader = BigEndian(data, offset, config); return reader.ReadVersionedObjectArray(count, version); } } }