diff --git a/SabreTools.DatTools/Splitter.cs b/SabreTools.DatTools/Splitter.cs index d330e5f7..d950bada 100644 --- a/SabreTools.DatTools/Splitter.cs +++ b/SabreTools.DatTools/Splitter.cs @@ -622,17 +622,47 @@ namespace SabreTools.DatTools // Create each of the respective output DATs InternalStopwatch watch = new($"Splitting DAT by size"); - DatFile lessThan = Parser.CreateDatFile((DatHeader)datFile.Header.Clone(), datFile.Modifiers); + // Initialize the outputs + SplitBySizeInit(datFile, radix, out DatFile lessThan, out DatFile greaterThan); + + // Now populate each of the DAT objects in turn + SplitBySizeImpl(datFile, radix, lessThan, greaterThan); + SplitBySizeDBImpl(datFile, radix, lessThan, greaterThan); + + // Then return both DatFiles + watch.Stop(); + return (lessThan, greaterThan); + } + + /// + /// Initialize splitting by size + /// + /// Current DatFile object to split + /// Size to use as the radix between the outputs + /// DatFile representing items less than + /// DatFile representing items greater than or equal to + private static void SplitBySizeInit(DatFile datFile, long radix, out DatFile lessThan, out DatFile greaterThan) + { + lessThan = Parser.CreateDatFile((DatHeader)datFile.Header.Clone(), datFile.Modifiers); lessThan.Header.SetFieldValue(DatHeader.FileNameKey, lessThan.Header.GetStringFieldValue(DatHeader.FileNameKey) + $" (less than {radix})"); lessThan.Header.SetFieldValue(Models.Metadata.Header.NameKey, lessThan.Header.GetStringFieldValue(Models.Metadata.Header.NameKey) + $" (less than {radix})"); lessThan.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, lessThan.Header.GetStringFieldValue(Models.Metadata.Header.DescriptionKey) + $" (less than {radix})"); - DatFile greaterThan = Parser.CreateDatFile((DatHeader)datFile.Header.Clone(), datFile.Modifiers); + greaterThan = Parser.CreateDatFile((DatHeader)datFile.Header.Clone(), datFile.Modifiers); greaterThan.Header.SetFieldValue(DatHeader.FileNameKey, greaterThan.Header.GetStringFieldValue(DatHeader.FileNameKey) + $" (equal-greater than {radix})"); greaterThan.Header.SetFieldValue(Models.Metadata.Header.NameKey, greaterThan.Header.GetStringFieldValue(Models.Metadata.Header.NameKey) + $" (equal-greater than {radix})"); greaterThan.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, greaterThan.Header.GetStringFieldValue(Models.Metadata.Header.DescriptionKey) + $" (equal-greater than {radix})"); + } - // Now populate each of the DAT objects in turn + /// + /// Split a DAT by size of Rom + /// + /// Current DatFile object to split + /// Size to use as the radix between the outputs + /// DatFile representing items less than + /// DatFile representing items greater than or equal to + private static void SplitBySizeImpl(DatFile datFile, long radix, DatFile lessThan, DatFile greaterThan) + { #if NET452_OR_GREATER || NETCOREAPP Parallel.ForEach(datFile.Items.SortedKeys, Core.Globals.ParallelOptions, key => #elif NET40_OR_GREATER @@ -671,33 +701,17 @@ namespace SabreTools.DatTools #else } #endif - - // Then return both DatFiles - watch.Stop(); - return (lessThan, greaterThan); } /// /// Split a DAT by size of Rom /// /// Current DatFile object to split - /// Long value representing the split point - /// Less Than and Greater Than DatFiles - public static (DatFile lessThan, DatFile greaterThan) SplitBySizeDB(DatFile datFile, long radix) + /// Size to use as the radix between the outputs + /// DatFile representing items less than + /// DatFile representing items greater than or equal to + private static void SplitBySizeDBImpl(DatFile datFile, long radix, DatFile lessThan, DatFile greaterThan) { - // Create each of the respective output DATs - var watch = new InternalStopwatch($"Splitting DAT by size"); - - DatFile lessThan = Parser.CreateDatFile((DatHeader)datFile.Header.Clone(), datFile.Modifiers); - lessThan.Header.SetFieldValue(DatHeader.FileNameKey, lessThan.Header.GetStringFieldValue(DatHeader.FileNameKey) + $" (less than {radix})"); - lessThan.Header.SetFieldValue(Models.Metadata.Header.NameKey, lessThan.Header.GetStringFieldValue(Models.Metadata.Header.NameKey) + $" (less than {radix})"); - lessThan.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, lessThan.Header.GetStringFieldValue(Models.Metadata.Header.DescriptionKey) + $" (less than {radix})"); - - DatFile greaterThan = Parser.CreateDatFile((DatHeader)datFile.Header.Clone(), datFile.Modifiers); - greaterThan.Header.SetFieldValue(DatHeader.FileNameKey, greaterThan.Header.GetStringFieldValue(DatHeader.FileNameKey) + $" (equal-greater than {radix})"); - greaterThan.Header.SetFieldValue(Models.Metadata.Header.NameKey, greaterThan.Header.GetStringFieldValue(Models.Metadata.Header.NameKey) + $" (equal-greater than {radix})"); - greaterThan.Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, greaterThan.Header.GetStringFieldValue(Models.Metadata.Header.DescriptionKey) + $" (equal-greater than {radix})"); - // Get all current items, machines, and mappings var datItems = datFile.ItemsDB.GetItems(); var machines = datFile.GetMachinesDB(); @@ -756,18 +770,19 @@ namespace SabreTools.DatTools #else } #endif - - // Then return both DatFiles - watch.Stop(); - return (lessThan, greaterThan); } + #endregion + + #region Total Size + /// /// Split a DAT by size of Rom /// /// Current DatFile object to split /// Long value representing the total size to split at /// Less Than and Greater Than DatFiles + /// TODO: Create DB version of this method public static List SplitByTotalSize(DatFile datFile, long chunkSize) { // If the size is invalid, just return diff --git a/SabreTools/Features/Split.cs b/SabreTools/Features/Split.cs index cee91373..d96d588e 100644 --- a/SabreTools/Features/Split.cs +++ b/SabreTools/Features/Split.cs @@ -144,7 +144,6 @@ namespace SabreTools.Features #endif { (DatFile lessThan, DatFile greaterThan) = DatTools.Splitter.SplitBySize(internalDat, GetInt64(features, RadixInt64Value)); - //(DatFile lessThan, DatFile greaterThan) = DatTools.Splitter.SplitBySizeDB(internalDat, GetInt64(features, RadixInt64Value)); var watch = new InternalStopwatch("Outputting size-split DATs");