/// <summary> /// Creates the alias to this entry and returnes data which can be used to aliasing the target. /// </summary> /// <param name="snapshot">The snapshot.</param> /// <returns> /// Alias data fro the newly created aliases. /// </returns> public AliasData CreateAliasToEntry(Snapshot snapshot) { //Collect alias indexes AssignCollector indexesCollector = new AssignCollector(snapshot); indexesCollector.ProcessPath(path); //Memory locations where to get data from ReadCollector valueCollector = new ReadCollector(snapshot); valueCollector.ProcessPath(path); //Get data from locations ReadWorker worker = new ReadWorker(snapshot); MemoryEntry value = worker.ReadValue(valueCollector); //Makes deep copy of data to prevent changes after assign alias TemporaryIndex temporaryIndex = snapshot.CreateTemporary(); MergeWithinSnapshotWorker mergeWorker = new MergeWithinSnapshotWorker(snapshot); mergeWorker.MergeMemoryEntry(temporaryIndex, value); AliasData data = new AliasData(indexesCollector.MustIndexes, indexesCollector.MayIndexes, temporaryIndex); data.TemporaryIndexToRealease(temporaryIndex); return(data); }
/// <summary> /// Set aliases to current snapshot entry. Aliases can be set even to those entries /// that doesn't belongs to any variable, field,.. /// </summary> /// <param name="context">Context snapshot where operation is proceeded</param> /// <param name="aliasedEntry">Snapshot entry which will be aliased from current entry</param> protected override void setAliases(SnapshotBase context, ReadSnapshotEntryBase aliasedEntry) { Snapshot snapshot = ToSnapshot(context); SnapshotLogger.append(context, "set alias: " + this.ToString() + " from: " + aliasedEntry.ToString()); if (snapshot.CurrentMode == SnapshotMode.InfoLevel) { return; } ICopyModelSnapshotEntry entry = ToEntry(aliasedEntry); AliasData data = entry.CreateAliasToEntry(snapshot); AssignCollector collector = new AssignCollector(snapshot); collector.AliasesProcessing = AliasesProcessing.BeforeCollecting; collector.ProcessPath(path); AssignAliasWorker worker = new AssignAliasWorker(snapshot); worker.AssignAlias(collector, data); data.Release(snapshot); }
/// <summary> /// Makes the aliases. /// </summary> /// <param name="collector">The collector.</param> /// <param name="data">The data.</param> private void makeAliases(IIndexCollector collector, AliasData data) { //Must target foreach (MemoryIndex index in collector.MustIndexes) { snapshot.MustSetAliases(index, data.MustIndexes, data.MayIndexes); } //Must source foreach (MemoryIndex index in data.MustIndexes) { snapshot.AddAliases(index, collector.MustIndexes, collector.MayIndexes); } //May target HashSet <MemoryIndex> sourceAliases = new HashSet <MemoryIndex>(data.MustIndexes.Concat(data.MayIndexes)); foreach (MemoryIndex index in collector.MayIndexes) { snapshot.MaySetAliases(index, sourceAliases); } //May source HashSet <MemoryIndex> targetAliases = new HashSet <MemoryIndex>(collector.MustIndexes.Concat(collector.MayIndexes)); foreach (MemoryIndex index in data.MayIndexes) { snapshot.AddAliases(index, null, targetAliases); } }
/// <summary> /// Adds the created alias. /// </summary> /// <param name="aliasData">The alias data.</param> internal void AddCreatedAlias(AliasData aliasData) { CreatedAliases.Add(aliasData); }
/// <summary> /// Assigns the alias. /// </summary> /// <param name="collector">The collector.</param> /// <param name="data">The data.</param> internal void AssignAlias(IIndexCollector collector, AliasData data) { assignWorker.Assign(collector, data.SourceIndex); makeAliases(collector, data); }