/// <inheritdoc /> public void AssignAlias(Snapshot snapshot, MemoryPath targetPath, MemoryPath sourcePath) { if (snapshot.AssignInfo == null) { snapshot.AssignInfo = new AssignInfo(); } // Collects memory location of alias sources TreeIndexCollector aliasSourcesCollector = new TreeIndexCollector(snapshot); aliasSourcesCollector.ProcessPath(sourcePath); // Creates missing source locations and collect source data AliasWorker aliasWorker = new AliasWorker(Factories, snapshot, aliasSourcesCollector, snapshot.AssignInfo.AliasAssignModifications); aliasWorker.CollectAliases(); // Collects target locations TreeIndexCollector aliasTargetCollector = new TreeIndexCollector(snapshot); aliasTargetCollector.ProcessPath(targetPath); // Creates missing target locations, create aliases and assign source data AssignWorker assignWorker = new AssignWorker(Factories, snapshot, aliasWorker.EntryCollector, aliasTargetCollector, snapshot.AssignInfo.AliasAssignModifications); assignWorker.AssignAliasesIntoCollectedIndexes = true; assignWorker.Assign(); }
/// <inheritdoc /> public void Assign(Snapshot snapshot, MemoryPath path, MemoryEntry value, bool forceStrongWrite) { if (snapshot.AssignInfo == null) { snapshot.AssignInfo = new AssignInfo(); } MemoryIndexModificationList pathModifications = snapshot.AssignInfo.GetOrCreatePathModification(path); // Collecting all sources of the data MemoryEntryCollector entryCollector = new MemoryEntryCollector(snapshot); entryCollector.ProcessRootMemoryEntry(value); // Collecting all locations where to assign into TreeIndexCollector treeCollector = new TreeIndexCollector(snapshot); treeCollector.PostProcessAliases = true; treeCollector.ProcessPath(path); // Provides an assign operation AssignWorker worker = new AssignWorker(Factories, snapshot, entryCollector, treeCollector, pathModifications); worker.ForceStrongWrite = forceStrongWrite; worker.Assign(); }
/// <summary> /// Initializes a new instance of the <see cref="AssignWorker"/> class. /// </summary> /// <param name="factories">The factories.</param> /// <param name="snapshot">The snapshot.</param> /// <param name="memoryEntryCollector">The memory entry collector.</param> /// <param name="treeCollector">The tree collector.</param> /// <param name="pathModifications">The path modifications.</param> public AssignWorker(ModularMemoryModelFactories factories, Snapshot snapshot, MemoryEntryCollector memoryEntryCollector, TreeIndexCollector treeCollector, MemoryIndexModificationList pathModifications) : base(factories, snapshot, treeCollector, pathModifications) { this.memoryEntryCollector = memoryEntryCollector; ForceStrongWrite = false; AssignAliasesIntoCollectedIndexes = false; }
/// <summary> /// Initializes a new instance of the <see cref="AbstractAssignWorker"/> class. /// </summary> /// <param name="factories">The factories.</param> /// <param name="snapshot">The snapshot.</param> /// <param name="treeCollector">The tree collector.</param> /// <param name="pathModifications">The path modifications.</param> public AbstractAssignWorker(ModularMemoryModelFactories factories, Snapshot snapshot, TreeIndexCollector treeCollector, MemoryIndexModificationList pathModifications) { Factories = factories; this.Snapshot = snapshot; this.treeCollector = treeCollector; this.PathModifications = pathModifications; this.Structure = snapshot.Structure.Writeable; this.Data = snapshot.CurrentData.Writeable; }
/// <summary> /// Initializes a new instance of the <see cref="AliasWorker"/> class. /// </summary> /// <param name="factories">The factories.</param> /// <param name="snapshot">The snapshot.</param> /// <param name="treeCollector">The tree collector.</param> /// <param name="pathModifications">The path modifications.</param> public AliasWorker(ModularMemoryModelFactories factories, Snapshot snapshot, TreeIndexCollector treeCollector, MemoryIndexModificationList pathModifications) : base(factories, snapshot, treeCollector, pathModifications) { EntryCollector = new MemoryEntryCollector(snapshot); }