diff --git a/SabreTools.Metadata.DatFiles/ItemDatabase.cs b/SabreTools.Metadata.DatFiles/ItemDatabase.cs index 7be5ddde..e0625eb3 100644 --- a/SabreTools.Metadata.DatFiles/ItemDatabase.cs +++ b/SabreTools.Metadata.DatFiles/ItemDatabase.cs @@ -92,16 +92,6 @@ namespace SabreTools.Metadata.DatFiles [JsonIgnore, XmlIgnore] private long _sourceIndex = 0; - /// - /// Internal dictionary for item to machine mappings - /// - [JsonIgnore, XmlIgnore] -#if NET40_OR_GREATER || NETCOREAPP || NETSTANDARD2_0_OR_GREATER - private readonly ConcurrentDictionary _itemToMachineMapping = []; -#else - private readonly Dictionary _itemToMachineMapping = []; -#endif - /// /// Internal dictionary representing the current buckets /// @@ -411,25 +401,14 @@ namespace SabreTools.Metadata.DatFiles /// public KeyValuePair GetMachineForItem(long itemIndex) { -#if NET40_OR_GREATER || NETCOREAPP || NETSTANDARD2_0_OR_GREATER - if (!_itemToMachineMapping.TryGetValue(itemIndex, out long machineIndex)) + if (!_items.TryGetValue(itemIndex, out var item)) return new KeyValuePair(-1, null); + long machineIndex = item.MachineIndex; if (!_machines.TryGetValue(machineIndex, out var machine)) return new KeyValuePair(-1, null); return new KeyValuePair(machineIndex, machine); -#else - if (!_itemToMachineMapping.ContainsKey(itemIndex)) - return new KeyValuePair(-1, null); - - long machineIndex = _itemToMachineMapping[itemIndex]; - if (!_machines.ContainsKey(machineIndex)) - return new KeyValuePair(-1, null); - - var machine = _machines[machineIndex]; - return new KeyValuePair(machineIndex, machine); -#endif } /// @@ -475,10 +454,8 @@ namespace SabreTools.Metadata.DatFiles /// New machine index public void RemapDatItemToMachine(long itemIndex, long machineIndex) { - lock (_itemToMachineMapping) - { - _itemToMachineMapping[itemIndex] = machineIndex; - } + if (_items.TryGetValue(itemIndex, out var item)) + item.MachineIndex = machineIndex; } /// @@ -539,14 +516,6 @@ namespace SabreTools.Metadata.DatFiles if (datItem is not null) DatStatistics.RemoveItemStatistics(datItem); - // Remove the machine mapping -#if NET40_OR_GREATER || NETCOREAPP || NETSTANDARD2_0_OR_GREATER - _itemToMachineMapping.TryRemove(itemIndex, out _); -#else - if (_itemToMachineMapping.ContainsKey(itemIndex)) - _itemToMachineMapping.Remove(itemIndex); -#endif - return true; } @@ -564,18 +533,12 @@ namespace SabreTools.Metadata.DatFiles _machines.Remove(machineIndex); #endif - var itemIds = _itemToMachineMapping - .Where(mapping => mapping.Value == machineIndex) - .Select(mapping => mapping.Key); + // TODO: Figure out if removing or marking items makes sense here - foreach (long itemId in itemIds) - { -#if NET40_OR_GREATER || NETCOREAPP || NETSTANDARD2_0_OR_GREATER - _itemToMachineMapping.TryRemove(itemId, out _); -#else - _itemToMachineMapping.Remove(itemId); -#endif - } + // The old version of this code removed all items that were associated + // with the machine. However, only items with a machine will ever be + // written out. The extra processing time to find and remove all + // of the related items seems unnecessary with this in mind. return true; } @@ -597,23 +560,18 @@ namespace SabreTools.Metadata.DatFiles /// internal long AddItem(DatItem item, long machineIndex, long sourceIndex) { - // Add the source index + // Add the machine and source index + item.MachineIndex = machineIndex; item.SourceIndex = sourceIndex; #if NET40_OR_GREATER || NETCOREAPP || NETSTANDARD2_0_OR_GREATER // Add the item with a new index long index = Interlocked.Increment(ref _itemIndex) - 1; _items.TryAdd(index, item); - - // Add the machine mapping - _itemToMachineMapping.TryAdd(index, machineIndex); #else // Add the item with a new index long index = _itemIndex++ - 1; _items[index] = item; - - // Add the machine mapping - _itemToMachineMapping[index] = machineIndex; #endif // Add the item statistics @@ -896,22 +854,22 @@ namespace SabreTools.Metadata.DatFiles var itemSource = _sources[GetSourceForItem(itemIndex).Key]; // Get the machines associated with the items - var savedMachine = _machines[_itemToMachineMapping[savedIndex]]; - var itemMachine = _machines[_itemToMachineMapping[itemIndex]]; + var savedMachine = GetMachineForItem(savedIndex); + var itemMachine = GetMachineForItem(itemIndex); // If the current source has a lower ID than the saved, use the saved source if (itemSource?.Index < savedSource?.Index) { datItem.SourceIndex = savedItem.SourceIndex; - _machines[_itemToMachineMapping[savedIndex]] = (itemMachine.Clone() as Machine)!; + _machines[savedMachine.Key] = (itemMachine.Value!.Clone() as Machine)!; savedItem.SetName(datItem.GetName()); } // If the saved machine is a child of the current machine, use the current machine instead - if (savedMachine.CloneOf == itemMachine.Name - || savedMachine.RomOf == itemMachine.Name) + if (savedMachine.Value!.CloneOf == itemMachine.Value!.Name + || savedMachine.Value!.RomOf == itemMachine.Value!.Name) { - _machines[_itemToMachineMapping[savedIndex]] = (itemMachine.Clone() as Machine)!; + _machines[savedMachine.Key] = (itemMachine.Value!.Clone() as Machine)!; savedItem.SetName(datItem.GetName()); } @@ -1154,8 +1112,8 @@ namespace SabreTools.Metadata.DatFiles } // Get the machines - Machine? xMachine = _machines[_itemToMachineMapping[x.Key]]; - Machine? yMachine = _machines[_itemToMachineMapping[y.Key]]; + Machine? xMachine = GetMachineForItem(x.Key).Value; + Machine? yMachine = GetMachineForItem(y.Key).Value; // If machine names don't match string? xMachineName = xMachine?.Name;