/// <summary> /// Asserts that a subrecord's content is exactly a certain length /// </summary> /// <param name="frame">Frame to check</param> /// <param name="len">Length to assert on the content</param> /// <exception cref="System.ArgumentException">Thrown if frame's content length does not match parameter</exception> public static void AssertLength(this SubrecordFrame frame, int len) { if (frame.Content.Length != len) { throw new ArgumentException($"{frame.RecordType} Subrecord frame had unexpected length: {frame.Content.Length} != {len}"); } }
/// <summary> /// Factory /// </summary> /// <param name="header">Existing SubrecordHeader struct</param> /// <param name="span">Span to overlay on, aligned to the start of the header</param> /// <param name="pinLocation">Location pin tracker relative to parent MajorRecordFrame</param> public static SubrecordPinFrame FactoryNoTrim(SubrecordHeader header, ReadOnlyMemorySlice <byte> span, int pinLocation) { return(new SubrecordPinFrame( SubrecordFrame.FactoryNoTrim(header, span), span, pinLocation)); }
public bool TryReadSubrecordFrame(IBinaryReadStream stream, RecordType targetType, out SubrecordFrame frame) { if (!TryGetSubrecord(stream, targetType, out var meta)) { frame = default; return(false); } frame = new SubrecordFrame(meta, stream.ReadSpan(meta.TotalLength)); return(true); }
/// <summary> /// Iterates a MajorRecordFrame's subrecords and locates the first occurance of the desired type /// </summary> /// <param name="majorFrame">Frame to read from</param> /// <param name="type">Type to search for</param> /// <param name="frame">SubrecordFrame if found</param> /// <returns>True if matching subrecord is found</returns> public static bool TryLocateSubrecordFrame(this MajorRecordFrame majorFrame, RecordType type, out SubrecordFrame frame) { var find = UtilityTranslation.FindFirstSubrecord(majorFrame.Content, majorFrame.Meta, type, navigateToContent: false); if (find == null) { frame = default; return(false); } frame = new SubrecordFrame(majorFrame.Meta, majorFrame.Content.Slice(find.Value)); return(true); }
/// <summary> /// Iterates a MajorRecordFrame's subrecords and locates the first occurance of the desired type /// </summary> /// <param name="majorFrame">Frame to read from</param> /// <param name="type">Type to search for</param> /// <param name="offset">Offset within the Major Record's contents to start searching</param> /// <param name="frame">SubrecordFrame if found</param> /// <param name="loc">Location of the subrecord, relative to the parent record's RecordType data</param> /// <returns>True if matching subrecord is found</returns> public static bool TryLocateSubrecordFrame(this MajorRecordFrame majorFrame, RecordType type, int offset, out SubrecordFrame frame, out int loc) { var find = UtilityTranslation.FindFirstSubrecord(majorFrame.Content.Slice(offset - majorFrame.HeaderLength), majorFrame.Meta, type, navigateToContent: false); if (find == null) { frame = default; loc = default; return(false); } frame = new SubrecordFrame(majorFrame.Meta, majorFrame.Content.Slice(find.Value + offset - majorFrame.HeaderLength)); loc = find.Value + offset; return(true); }
public static bool TryReadSubrecordFrame(this IMutagenReadStream stream, RecordType targetType, out SubrecordFrame frame) => stream.MetaData.Constants.TryReadSubrecordFrame(stream, targetType, out frame);
public static bool TryGetSubrecordFrame(this IMutagenReadStream stream, out SubrecordFrame frame) => stream.MetaData.Constants.TryGetSubrecordFrame(stream, out frame);
private SubrecordPinFrame(SubrecordFrame frame, ReadOnlyMemorySlice <byte> span, int pinLocation) { this.Frame = frame; this.Location = pinLocation; }
/// <summary> /// Interprets a subrecord's content as a int. /// </summary> /// <param name="frame">Frame to read from</param> /// <exception cref="System.ArgumentException">Thrown if frame's content is not exactly 4</exception> /// <returns>Subrecord's content as a int</returns> public static int AsInt32(this SubrecordFrame frame) { frame.AssertLength(4); return(BinaryPrimitives.ReadInt32LittleEndian(frame.Content)); }
/// <summary> /// Interprets a subrecord's content as a short. /// </summary> /// <param name="frame">Frame to read from</param> /// <exception cref="System.ArgumentException">Thrown if frame's content is not exactly 2</exception> /// <returns>Subrecord's content as a short</returns> public static short AsInt16(this SubrecordFrame frame) { frame.AssertLength(2); return(BinaryPrimitives.ReadInt16LittleEndian(frame.Content)); }
/// <summary> /// Interprets a subrecord's content as a sbyte. /// </summary> /// <param name="frame">Frame to read from</param> /// <exception cref="System.ArgumentException">Thrown if frame's content is not exactly 1</exception> /// <returns>Subrecord's content as a sbyte</returns> public static sbyte AsInt8(this SubrecordFrame frame) { frame.AssertLength(1); return((sbyte)frame.Content[0]); }
/// <summary> /// Interprets a subrecord's content as a string. /// </summary> /// <param name="frame">Frame to read from</param> /// <returns>Subrecord's content as a string, null trimmed if applicable</returns> public static string AsString(this SubrecordFrame frame) { return(BinaryStringUtility.ProcessWholeToZString(frame.Content)); }
/// <summary> /// Interprets a subrecord's content as a double. /// </summary> /// <param name="frame">Frame to read from</param> /// <exception cref="System.ArgumentException">Thrown if frame's content is not exactly 8</exception> /// <returns>Subrecord's content as a double</returns> public static double AsDouble(this SubrecordFrame frame) { frame.AssertLength(8); return(frame.Content.Double()); }
/// <summary> /// Interprets a subrecord's content as a float. /// </summary> /// <param name="frame">Frame to read from</param> /// <exception cref="System.ArgumentException">Thrown if frame's content is not exactly 4</exception> /// <returns>Subrecord's content as a float</returns> public static float AsFloat(this SubrecordFrame frame) { frame.AssertLength(4); return(frame.Content.Float()); }
/// <summary> /// Interprets a subrecord's content as a long. /// </summary> /// <param name="frame">Frame to read from</param> /// <exception cref="System.ArgumentException">Thrown if frame's content is not exactly 8</exception> /// <returns>Subrecord's content as a long</returns> public static long AsInt64(this SubrecordFrame frame) { frame.AssertLength(8); return(BinaryPrimitives.ReadInt64LittleEndian(frame.Content)); }
public bool TrySubrecordFrame(ReadOnlyMemorySlice <byte> span, RecordType targetType, out SubrecordFrame header) { if (span.Length < this.SubConstants.HeaderLength) { header = default; return(false); } var meta = new SubrecordHeader(this, span); if (meta.RecordType != targetType) { header = default; return(false); } header = Binary.SubrecordFrame.Factory(meta, span); return(true); }