Example #1
0
        public IEnumerable <T> ParseParallel(
            MutagenFrame reader,
            RecordType triggeringRecord,
            BinaryMasterParseDelegate <T> transl,
            TypedParseParams?translationParams = null)
        {
            var frames = new List <MutagenFrame>();

            triggeringRecord = translationParams.ConvertToCustom(triggeringRecord);
            while (!reader.Complete && !reader.Reader.Complete)
            {
                var header = reader.Reader.GetVariableHeader();
                if (header.RecordType != triggeringRecord)
                {
                    break;
                }
                if (!IsLoqui)
                {
                    throw new NotImplementedException();
                }
                var totalLen = header.TotalLength;
                var subFrame = new MutagenFrame(reader.ReadAndReframe(checked ((int)totalLen)));
                frames.Add(subFrame);
            }
            var ret = new TryGet <T> [frames.Count];

            Parallel.ForEach(frames, (subFrame, state, count) =>
            {
                if (transl(subFrame, out var subItem, translationParams))
                {
                    ret[count] = TryGet <T> .Succeed(subItem);
                }
Example #2
0
        public static G GroupParse <G>(
            G record,
            MutagenFrame frame,
            RecordTypeConverter?recordTypeConverter,
            RecordStructFill <G> fillStructs,
            RecordTypeFill <G> fillTyped)
        {
            var groupMeta = frame.GetGroup();

            if (!groupMeta.IsGroup)
            {
                throw new ArgumentException($"Expected GRUP header was not read in: {frame.Position}");
            }
            frame.Position += groupMeta.TypeAndLengthLength;
            frame           = frame.ReadAndReframe(checked ((int)(groupMeta.TotalLength - groupMeta.TypeAndLengthLength)));

            fillStructs?.Invoke(
                record: record,
                frame: frame);
            while (!frame.Complete)
            {
                var nextRecordType = HeaderTranslation.GetNextSubrecordType(
                    reader: frame.Reader,
                    contentLength: out var contentLength);
                var finalPos = frame.Position + contentLength;
                var parsed   = fillTyped(
                    record: record,
                    frame: frame,
                    nextRecordType: nextRecordType,
                    contentLength: contentLength,
                    recordTypeConverter: recordTypeConverter);
                if (parsed.Failed)
                {
                    break;
                }
                if (frame.Position < finalPos)
                {
                    frame.Position = finalPos;
                }
            }
            frame.SetToFinalPosition();
            return(record);
        }
Example #3
0
        public ExtendedList <T> Parse(
            MutagenFrame reader,
            RecordType triggeringRecord,
            BinarySubParseDelegate <IBinaryReadStream, T> transl)
        {
            var ret = new ExtendedList <T>();

            while (!reader.Complete && !reader.Reader.Complete)
            {
                if (!HeaderTranslation.TryGetRecordType(reader.Reader, triggeringRecord))
                {
                    break;
                }
                var          startingPos = reader.Position;
                MutagenFrame subFrame;
                if (!IsLoqui)
                {
                    var subHeader = reader.ReadSubrecord();
                    subFrame = reader.ReadAndReframe(subHeader.ContentLength);
                }
                else
                {
                    subFrame = reader;
                }
                if (transl(subFrame, out var subItem))
                {
                    ret.Add(subItem);
                }

                if (reader.Position == startingPos)
                {
                    reader.Position += reader.MetaData.Constants.SubConstants.HeaderLength;
                    throw new ArgumentException($"Parsed item on the list consumed no data: {subItem}");
                }
            }
            return(ret);
        }