public override void UpdateNewRunFromPointerFormat(IDataModel model, ModelDelta token, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments, int parentIndex, ref IFormattedRun run) { var newRun = new TilemapRun(model, run.Start, format, run.PointerSources); model.ClearFormat(token, newRun.Start, newRun.Length); run = newRun; }
public override void UpdateNewRunFromPointerFormat(IDataModel model, ModelDelta token, string name, ref IFormattedRun run) { var runAttempt = new TrainerPokemonTeamRun(model, run.Start, run.PointerSources); 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) { var runAttempt = new TrainerPokemonTeamRun(model, run.Start, run.PointerSources); model.ClearFormat(token, run.Start, runAttempt.Length); run = runAttempt; }
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 void UpdateNewRunFromPointerFormat(IDataModel model, ModelDelta token, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments, int parentIndex, ref IFormattedRun run) { var runAttempt = new PLMRun(model, run.Start); if (runAttempt.Length > 0) { run = runAttempt.MergeAnchor(run.PointerSources); model.ClearFormat(token, run.Start, run.Length); } }
public override bool TryAddFormatAtDestination(IDataModel owner, ModelDelta token, int source, int destination, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments, int parentIndex) { var run = new ASERun(destination, new SortedSpan <int>(source)); if (run.Length < 1) { return(false); } owner.ClearFormat(token, run.Start, run.Length); owner.ObserveRunWritten(token, run); return(true); }
public override void UpdateNewRunFromPointerFormat(IDataModel model, ModelDelta token, string name, ref IFormattedRun run) { var length = PCSString.ReadString(model, run.Start, true); if (length > 0) { var newRun = new PCSRun(model, run.Start, length, run.PointerSources); if (!newRun.Equals(run)) { model.ClearFormat(token, newRun.Start, newRun.Length); } run = newRun; } }
public override void UpdateNewRunFromPointerFormat(IDataModel model, ModelDelta token, string name, IReadOnlyList <ArrayRunElementSegment> sourceSegments, int parentIndex, ref IFormattedRun run) { var length = PCSString.ReadString(model, run.Start, true); if (length > 0) { var newRun = new PCSRun(model, run.Start, length, run.PointerSources); if (!newRun.Equals(run)) { model.ClearFormat(token, newRun.Start, newRun.Length); } run = newRun; } }
public TableStreamRun UpdateFromParentStream(TableStreamRun run, ModelDelta token, int parentSegmentIndex) { var parentAddress = GetParentIndex(run.PointerSources); var parent = model.GetNextRun(parentAddress) as ITableRun; if (parent == null) { return(run); } var segmentIndex = GetSegmentIndex(parent.ElementContent, parentFieldForLength); if (segmentIndex == -1 || segmentIndex != parentSegmentIndex) { return(run); } var segmentOffset = parent.ElementContent.Take(segmentIndex).Sum(segment => segment.Length); var offsets = parent.ConvertByteOffsetToArrayOffset(parentAddress); var newElementCount = model.ReadMultiByteValue(parent.Start + offsets.ElementIndex * parent.ElementLength + segmentOffset, parent.ElementContent[segmentIndex].Length); var newRun = run; if (newElementCount != newRun.ElementCount) { var endOfCurrentRun = run.Start + run.Length; var nextRunMinimumStart = newRun.Start + newRun.ElementLength * newElementCount; if ( TableStreamRun.DataMatches(model, newRun, newElementCount) && model.GetNextRun(nextRunMinimumStart).Start >= nextRunMinimumStart && run.ElementCount <= 1 ) { // no need to repoint: the next data matches // this is important for when we're pasting pointers to existing formats before pasting those formats' lengths. // example: paste ^newanchor <pointer> count, where pointer points to existing data. We don't want writing the 'count' to cause a repoint model.ClearFormat(token, endOfCurrentRun, nextRunMinimumStart - endOfCurrentRun); UpdateParents(token, parent, segmentIndex, newElementCount, newRun.PointerSources); newRun = new TableStreamRun(model, newRun.Start, newRun.PointerSources, newRun.FormatString, newRun.ElementContent, this); } else { newRun = (TableStreamRun)newRun.Append(token, newElementCount - newRun.ElementCount); UpdateParents(token, parent, segmentIndex, newElementCount, newRun.PointerSources); } } return(newRun); }
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); }