mirror of
https://github.com/claunia/SabreTools.git
synced 2025-12-16 19:14:27 +00:00
Move GetDuplicateStatus implementations
This commit is contained in:
@@ -766,9 +766,9 @@ namespace SabreTools.DatFiles
|
||||
|
||||
// If the current item exactly matches the last item, then we don't add it
|
||||
#if NET20 || NET35
|
||||
if ((datItem.GetDuplicateStatus(lastItem) & DupeType.All) != 0)
|
||||
if ((Items.GetDuplicateStatus(datItem, lastItem) & DupeType.All) != 0)
|
||||
#else
|
||||
if (datItem.GetDuplicateStatus(lastItem).HasFlag(DupeType.All))
|
||||
if (Items.GetDuplicateStatus(datItem, lastItem).HasFlag(DupeType.All))
|
||||
#endif
|
||||
{
|
||||
_logger.Verbose($"Exact duplicate found for '{datItemName}'");
|
||||
@@ -838,7 +838,7 @@ namespace SabreTools.DatFiles
|
||||
SortDB(ref mappings, true);
|
||||
|
||||
// Now we want to loop through and check names
|
||||
DatItem? lastItem = null;
|
||||
KeyValuePair<long, DatItem>? lastItem = null;
|
||||
string? lastrenamed = null;
|
||||
int lastid = 0;
|
||||
foreach (var datItem in mappings)
|
||||
@@ -847,13 +847,13 @@ namespace SabreTools.DatFiles
|
||||
if (lastItem == null)
|
||||
{
|
||||
output.Add(datItem);
|
||||
lastItem = datItem.Value;
|
||||
lastItem = datItem;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get the last item name, if applicable
|
||||
string lastItemName = lastItem.GetName()
|
||||
?? lastItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>().AsStringValue()
|
||||
string lastItemName = lastItem.Value.Value.GetName()
|
||||
?? lastItem.Value.Value.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>().AsStringValue()
|
||||
?? string.Empty;
|
||||
|
||||
// Get the current item name, if applicable
|
||||
@@ -861,11 +861,15 @@ namespace SabreTools.DatFiles
|
||||
?? datItem.Value.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>().AsStringValue()
|
||||
?? string.Empty;
|
||||
|
||||
// Get sources for both items
|
||||
var datItemSource = ItemsDB.GetSourceForItem(datItem.Key);
|
||||
var lastItemSource = ItemsDB.GetSourceForItem(lastItem.Value.Key);
|
||||
|
||||
// If the current item exactly matches the last item, then we don't add it
|
||||
#if NET20 || NET35
|
||||
if ((datItem.Value.GetDuplicateStatus(lastItem) & DupeType.All) != 0)
|
||||
if ((ItemsDB.GetDuplicateStatus(datItem, datItemSource.Value, lastItem, lastItemSource.Value) & DupeType.All) != 0)
|
||||
#else
|
||||
if (datItem.Value.GetDuplicateStatus(lastItem).HasFlag(DupeType.All))
|
||||
if (ItemsDB.GetDuplicateStatus(datItem, datItemSource.Value, lastItem, lastItemSource.Value).HasFlag(DupeType.All))
|
||||
#endif
|
||||
{
|
||||
_logger.Verbose($"Exact duplicate found for '{datItemName}'");
|
||||
@@ -904,7 +908,7 @@ namespace SabreTools.DatFiles
|
||||
else
|
||||
{
|
||||
output.Add(datItem);
|
||||
lastItem = datItem.Value;
|
||||
lastItem = datItem;
|
||||
lastrenamed = null;
|
||||
lastid = 0;
|
||||
}
|
||||
|
||||
@@ -447,6 +447,61 @@ namespace SabreTools.DatFiles
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Return the duplicate status of two items
|
||||
/// </summary>
|
||||
/// <param name="self">Current DatItem</param>
|
||||
/// <param name="last">DatItem to check against</param>
|
||||
/// <returns>The DupeType corresponding to the relationship between the two</returns>
|
||||
public DupeType GetDuplicateStatus(DatItem? self, DatItem? last)
|
||||
{
|
||||
DupeType output = 0x00;
|
||||
|
||||
// If either item is null
|
||||
if (self == null || last == null)
|
||||
return output;
|
||||
|
||||
// If we don't have a duplicate at all, return none
|
||||
if (!self.Equals(last))
|
||||
return output;
|
||||
|
||||
// Get the sources for comparison
|
||||
var selfSource = self.GetFieldValue<Source?>(DatItem.SourceKey);
|
||||
var lastSource = last.GetFieldValue<Source?>(DatItem.SourceKey);
|
||||
|
||||
// Get the machines for comparison
|
||||
var selfMachine = self.GetMachine();
|
||||
string? selfMachineName = selfMachine?.GetName();
|
||||
var lastMachine = last.GetMachine();
|
||||
string? lastMachineName = lastMachine?.GetName();
|
||||
|
||||
// If the duplicate is external already
|
||||
#if NET20 || NET35
|
||||
if ((last.GetFieldValue<DupeType>(DatItem.DupeTypeKey) & DupeType.External) != 0)
|
||||
#else
|
||||
if (last.GetFieldValue<DupeType>(DatItem.DupeTypeKey).HasFlag(DupeType.External))
|
||||
#endif
|
||||
output |= DupeType.External;
|
||||
|
||||
// If the duplicate should be external
|
||||
else if (lastSource?.Index != selfSource?.Index)
|
||||
output |= DupeType.External;
|
||||
|
||||
// Otherwise, it's considered an internal dupe
|
||||
else
|
||||
output |= DupeType.Internal;
|
||||
|
||||
// If the item and machine names match
|
||||
if (lastMachineName == selfMachineName && last.GetName() == self.GetName())
|
||||
output |= DupeType.All;
|
||||
|
||||
// Otherwise, hash match is assumed
|
||||
else
|
||||
output |= DupeType.Hash;
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Merge an arbitrary set of DatItems based on the supplied information
|
||||
/// </summary>
|
||||
@@ -459,6 +514,9 @@ namespace SabreTools.DatFiles
|
||||
if (items == null || items.Count == 0)
|
||||
return [];
|
||||
|
||||
// Create placeholder object for checking duplicates
|
||||
var dupDict = new ItemDictionary();
|
||||
|
||||
// Create output list
|
||||
List<DatItem> output = [];
|
||||
|
||||
@@ -492,7 +550,7 @@ namespace SabreTools.DatFiles
|
||||
}
|
||||
|
||||
// Find the index of the first duplicate, if one exists
|
||||
int pos = output.FindIndex(lastItem => datItem.GetDuplicateStatus(lastItem) != 0x00);
|
||||
int pos = output.FindIndex(lastItem => dupDict.GetDuplicateStatus(datItem, lastItem) != 0x00);
|
||||
if (pos < 0)
|
||||
{
|
||||
output.Add(datItem);
|
||||
@@ -501,7 +559,7 @@ namespace SabreTools.DatFiles
|
||||
|
||||
// Get the duplicate item
|
||||
DatItem savedItem = output[pos];
|
||||
DupeType dupetype = datItem.GetDuplicateStatus(savedItem);
|
||||
DupeType dupetype = dupDict.GetDuplicateStatus(datItem, savedItem);
|
||||
|
||||
// Disks, File, Media, and Roms have more information to fill
|
||||
if (datItem is Disk diskItem && savedItem is Disk savedDisk)
|
||||
|
||||
@@ -719,6 +719,59 @@ namespace SabreTools.DatFiles
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Return the duplicate status of two items
|
||||
/// </summary>
|
||||
/// <param name="selfItem">Current DatItem</param>
|
||||
/// <param name="selfSource">Source associated with this item</param>
|
||||
/// <param name="lastItem">DatItem to check against</param>
|
||||
/// <param name="lastSource">Source associated with the last item</param>
|
||||
/// <returns>The DupeType corresponding to the relationship between the two</returns>
|
||||
public DupeType GetDuplicateStatus(KeyValuePair<long, DatItem>? selfItem, Source? selfSource, KeyValuePair<long, DatItem>? lastItem, Source? lastSource)
|
||||
{
|
||||
DupeType output = 0x00;
|
||||
|
||||
// If either item is null
|
||||
if (selfItem == null || lastItem == null)
|
||||
return output;
|
||||
|
||||
// If we don't have a duplicate at all, return none
|
||||
if (!selfItem.Value.Value.Equals(lastItem.Value.Value))
|
||||
return output;
|
||||
|
||||
// Get the machines for comparison
|
||||
var selfMachine = GetMachineForItem(selfItem.Value.Key).Value;
|
||||
string? selfMachineName = selfMachine?.GetName();
|
||||
var lastMachine = GetMachineForItem(lastItem.Value.Key).Value;
|
||||
string? lastMachineName = lastMachine?.GetName();
|
||||
|
||||
// If the duplicate is external already
|
||||
#if NET20 || NET35
|
||||
if ((lastItem.Value.Value.GetFieldValue<DupeType>(DatItem.DupeTypeKey) & DupeType.External) != 0)
|
||||
#else
|
||||
if (lastItem.Value.Value.GetFieldValue<DupeType>(DatItem.DupeTypeKey).HasFlag(DupeType.External))
|
||||
#endif
|
||||
output |= DupeType.External;
|
||||
|
||||
// If the duplicate should be external
|
||||
else if (lastSource?.Index != selfSource?.Index)
|
||||
output |= DupeType.External;
|
||||
|
||||
// Otherwise, it's considered an internal dupe
|
||||
else
|
||||
output |= DupeType.Internal;
|
||||
|
||||
// If the item and machine names match
|
||||
if (lastMachineName == selfMachineName && lastItem.Value.Value.GetName() == selfItem.Value.Value.GetName())
|
||||
output |= DupeType.All;
|
||||
|
||||
// Otherwise, hash match is assumed
|
||||
else
|
||||
output |= DupeType.Hash;
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// List all duplicates found in a DAT based on a DatItem
|
||||
/// </summary>
|
||||
@@ -837,7 +890,12 @@ namespace SabreTools.DatFiles
|
||||
}
|
||||
|
||||
// Find the index of the first duplicate, if one exists
|
||||
int pos = output.FindIndex(lastItem => datItem.GetDuplicateStatus(lastItem.Value) != 0x00);
|
||||
var datItemSource = GetSourceForItem(itemIndex);
|
||||
int pos = output.FindIndex(lastItem =>
|
||||
{
|
||||
var lastItemSource = GetSourceForItem(lastItem.Key);
|
||||
return GetDuplicateStatus(kvp, datItemSource.Value, lastItem, lastItemSource.Value) != 0x00;
|
||||
});
|
||||
if (pos < 0)
|
||||
{
|
||||
output.Add(new KeyValuePair<long, DatItem>(itemIndex, datItem));
|
||||
@@ -847,7 +905,8 @@ namespace SabreTools.DatFiles
|
||||
// Get the duplicate item
|
||||
long savedIndex = output[pos].Key;
|
||||
DatItem savedItem = output[pos].Value;
|
||||
DupeType dupetype = datItem.GetDuplicateStatus(savedItem);
|
||||
var savedItemSource = GetSourceForItem(savedIndex);
|
||||
DupeType dupetype = GetDuplicateStatus(kvp, datItemSource.Value, output[pos], savedItemSource.Value);
|
||||
|
||||
// Disks, Media, and Roms have more information to fill
|
||||
if (datItem is Disk diskItem && savedItem is Disk savedDisk)
|
||||
|
||||
Reference in New Issue
Block a user