public override int LengthForNewRun(IDataModel model, int pointerAddress) { var tableRun = GetTable(model, pointerAddress); var pointerSegment = GetSegment(tableRun, pointerAddress); TableStreamRun.TryParseTableStream(model, -1, new SortedSpan <int>(pointerAddress), pointerSegment.Name, pointerSegment.InnerFormat, tableRun.ElementContent, out var newStream); return(newStream.Length); }
public override void UpdateNewRunFromPointerFormat(IDataModel model, ModelDelta token, string name, ref IFormattedRun run) { if (!TableStreamRun.TryParseTableStream(model, run.Start, run.PointerSources, name, Format, null, out var runAttempt)) { return; } model.ClearFormat(token, run.Start, runAttempt.Length); run = runAttempt; }
public override void UpdateNewRunFromPointerFormat(IDataModel model, ModelDelta token, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments, int parentIndex, ref IFormattedRun run) { if (!TableStreamRun.TryParseTableStream(model, run.Start, run.PointerSources, name, Format, null, out var runAttempt)) { return; } model.ClearFormat(token, run.Start, runAttempt.Length); run = runAttempt; }
public override IFormattedRun WriteNewRun(IDataModel owner, ModelDelta token, int source, int destination, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments) { // don't bother checking the TryParse result: we very much expect that the data originally in the run won't fit the parse. TableStreamRun.TryParseTableStream(owner, destination, new SortedSpan <int>(source), name, Format, sourceSegments, out var tableStream); if (TableStreamRun.TryWriteNewEndToken(token, ref tableStream)) { return(tableStream); } return(tableStream.DeserializeRun("", token)); }
public override bool TryAddFormatAtDestination(IDataModel owner, ModelDelta token, int source, int destination, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments) { if (TableStreamRun.TryParseTableStream(owner, destination, new SortedSpan <int>(source), name, Format, sourceSegments, out var tsRun)) { if (!(token is NoDataChangeDeltaModel)) { owner.ObserveRunWritten(token, tsRun); } return(true); } return(false); }
public override bool TryAddFormatAtDestination(IDataModel owner, ModelDelta token, int source, int destination, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments, int parentIndex) { if (TableStreamRun.TryParseTableStream(owner, destination, new SortedSpan <int>(source), name, Format, sourceSegments, out var tsRun)) { if (token is not NoDataChangeDeltaModel) { // we know that the data format matches, but there may already be a run there that starts sooner if (owner.GetNextRun(tsRun.Start) is ITableRun existingTable && existingTable.Start < tsRun.Start) { // there is already a format that starts sooner: do nothing, but return true because the format matches } else { owner.ClearFormat(token, tsRun.Start + 1, tsRun.Length - 1); owner.ObserveRunWritten(token, tsRun); } } return(true); }