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); }
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); }
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); }