public MapListRun(IDataModel model, int start, SortedSpan <int> sources) : base(start, sources) { this.Model = model; ElementContent = ArrayRun.ParseSegments(segmentFormat, model); var index = (sources[0] - model.GetNextRun(sources[0]).Start) / 4; ElementCount = BPRE0_Lengths[index]; }
public TableStreamRun(IDataModel model, int start, SortedSpan <int> sources, string formatString, IReadOnlyList <ArrayRunElementSegment> parsedSegments, IStreamEndStrategy endStream) : base(start, sources) { if (parsedSegments == null) { parsedSegments = ArrayRun.ParseSegments(formatString.Substring(1, formatString.Length - 2), model); } this.model = model; ElementContent = parsedSegments; this.endStream = endStream; ElementLength = parsedSegments.Sum(segment => segment.Length); ElementCount = endStream.GetCount(start, ElementLength, sources); Length = ElementLength * ElementCount + endStream.ExtraLength; FormatString = formatString; }
public static bool TryParseTableStream(IDataModel model, int start, SortedSpan <int> sources, string fieldName, string content, IReadOnlyList <ArrayRunElementSegment> sourceSegments, out TableStreamRun tableStream) { tableStream = null; if (content.Length < 4 || content[0] != '[') { return(false); } var close = content.LastIndexOf(']'); if (close == -1) { return(false); } try { var segmentContent = content.Substring(1, close - 1); var segments = ArrayRun.ParseSegments(segmentContent, model); var endStream = ParseEndStream(model, fieldName, content.Substring(close + 1), segments, sourceSegments); if (endStream == null) { return(false); } if (segments.Count == 0) { return(false); } tableStream = new TableStreamRun(model, start, sources, content, segments, endStream); } catch (ArrayRunParseException) { return(false); } if (start < 0) { return(false); // not a valid data location, so the data can't possibly be valid } if (model.GetUnmappedSourcesToAnchor(fieldName).Count > 0) { // we're pasting this format and something else is expecting it. Don't expect the content to match yet. return(tableStream.ElementCount > 0); } // if the first 90% matches, we don't need to check the last 10% var mostElementsCount = (int)Math.Ceiling(tableStream.ElementCount * .85); return(DataMatches(model, tableStream, mostElementsCount)); }