Example #1
0
 /// <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}");
     }
 }
Example #2
0
 /// <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));
 }
Example #3
0
 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);
 }
Example #4
0
        /// <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);
        }
Example #5
0
        /// <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);
        }
Example #6
0
 public static bool TryReadSubrecordFrame(this IMutagenReadStream stream, RecordType targetType, out SubrecordFrame frame) => stream.MetaData.Constants.TryReadSubrecordFrame(stream, targetType, out frame);
Example #7
0
 public static bool TryGetSubrecordFrame(this IMutagenReadStream stream, out SubrecordFrame frame) => stream.MetaData.Constants.TryGetSubrecordFrame(stream, out frame);
Example #8
0
 private SubrecordPinFrame(SubrecordFrame frame, ReadOnlyMemorySlice <byte> span, int pinLocation)
 {
     this.Frame    = frame;
     this.Location = pinLocation;
 }
Example #9
0
 /// <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));
 }
Example #10
0
 /// <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));
 }
Example #11
0
 /// <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]);
 }
Example #12
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));
 }
Example #13
0
 /// <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());
 }
Example #14
0
 /// <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());
 }
Example #15
0
 /// <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));
 }
Example #16
0
        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);
        }