Add nullable context to SabreTools.DatItems

This change also starts migrating the internals of the DatItem formats to the new internal models. Right now, it's basically just acting like a wrapper around those models.
This commit is contained in:
Matt Nadareski
2023-08-14 13:17:51 -04:00
parent 1752b1a0ac
commit b37aed389e
87 changed files with 3266 additions and 2199 deletions

View File

@@ -785,10 +785,14 @@ namespace SabreTools.Filtering
Chip chip => PassesFilters(chip),
Condition condition => PassesFilters(condition),
Configuration configuration => PassesFilters(configuration),
ConfLocation confLocation => PassesFilters(confLocation),
ConfSetting confSetting => PassesFilters(confSetting),
Control control => PassesFilters(control),
DataArea dataArea => PassesFilters(dataArea),
Device device => PassesFilters(device),
DipLocation dipLocation => PassesFilters(dipLocation),
DipSwitch dipSwitch => PassesFilters(dipSwitch),
DipValue dipValue => PassesFilters(dipValue),
Disk disk => PassesFilters(disk),
DiskArea diskArea => PassesFilters(diskArea),
Display display => PassesFilters(display),
@@ -798,7 +802,6 @@ namespace SabreTools.Filtering
Info info => PassesFilters(info),
Input input => PassesFilters(input),
Instance instance => PassesFilters(instance),
Location location => PassesFilters(location),
Media media => PassesFilters(media),
Part part => PassesFilters(part),
PartFeature partFeature => PassesFilters(partFeature),
@@ -806,7 +809,6 @@ namespace SabreTools.Filtering
RamOption ramOption => PassesFilters(ramOption),
Release release => PassesFilters(release),
Rom rom => PassesFilters(rom),
Setting setting => PassesFilters(setting),
SharedFeature sharedFeature => PassesFilters(sharedFeature),
Slot slot => PassesFilters(slot),
SlotOption slotOption => PassesFilters(slotOption),
@@ -1024,7 +1026,7 @@ namespace SabreTools.Filtering
// Filter on individual locations
if (configuration.LocationsSpecified)
{
foreach (Location subLocation in configuration.Locations)
foreach (ConfLocation subLocation in configuration.Locations)
{
if (!PassesFilters(subLocation))
return false;
@@ -1034,7 +1036,7 @@ namespace SabreTools.Filtering
// Filter on individual settings
if (configuration.SettingsSpecified)
{
foreach (Setting subSetting in configuration.Settings)
foreach (ConfSetting subSetting in configuration.Settings)
{
if (!PassesFilters(subSetting))
return false;
@@ -1044,6 +1046,60 @@ namespace SabreTools.Filtering
return true;
}
/// <summary>
/// Check to see if a ConfLocation passes the filters
/// </summary>
/// <param name="confLocation">ConfLocation to check</param>
/// <returns>True if the item passed the filter, false otherwise</returns>
private bool PassesFilters(ConfLocation confLocation)
{
// DatItem_Location_Inverted
if (!PassBoolFilter(Location_Inverted, confLocation.Inverted))
return false;
// DatItem_Location_Name
if (!PassStringFilter(Location_Name, confLocation.Name))
return false;
// DatItem_Location_Number
if (!PassLongFilter(Location_Number, confLocation.Number))
return false;
return true;
}
/// <summary>
/// Check to see if a ConfSetting passes the filters
/// </summary>
/// <param name="confSetting">ConfSetting to check</param>
/// <returns>True if the item passed the filter, false otherwise</returns>
private bool PassesFilters(ConfSetting confSetting)
{
// DatItem_Setting_Default
if (!PassBoolFilter(Setting_Default, confSetting.Default))
return false;
// DatItem_Setting_Name
if (!PassStringFilter(Setting_Name, confSetting.Name))
return false;
// DatItem_Setting_Value
if (!PassStringFilter(Setting_Value, confSetting.Value))
return false;
// Filter on individual conditions
if (confSetting.ConditionsSpecified)
{
foreach (Condition subCondition in confSetting.Conditions)
{
if (!PassesFilters(subCondition, true))
return false;
}
}
return true;
}
/// <summary>
/// Check to see if a Control passes the filters
/// </summary>
@@ -1184,6 +1240,28 @@ namespace SabreTools.Filtering
return true;
}
/// <summary>
/// Check to see if a DipLocation passes the filters
/// </summary>
/// <param name="dipLocation">DipLocation to check</param>
/// <returns>True if the item passed the filter, false otherwise</returns>
private bool PassesFilters(DipLocation dipLocation)
{
// DatItem_Location_Inverted
if (!PassBoolFilter(Location_Inverted, dipLocation.Inverted))
return false;
// DatItem_Location_Name
if (!PassStringFilter(Location_Name, dipLocation.Name))
return false;
// DatItem_Location_Number
if (!PassLongFilter(Location_Number, dipLocation.Number))
return false;
return true;
}
/// <summary>
/// Check to see if a DipSwitch passes the filters
/// </summary>
@@ -1212,7 +1290,7 @@ namespace SabreTools.Filtering
// Filter on individual locations
if (dipSwitch.LocationsSpecified)
{
foreach (Location subLocation in dipSwitch.Locations)
foreach (DipLocation subLocation in dipSwitch.Locations)
{
if (!PassesFilters(subLocation))
return false;
@@ -1222,7 +1300,7 @@ namespace SabreTools.Filtering
// Filter on individual values
if (dipSwitch.ValuesSpecified)
{
foreach (Setting subValue in dipSwitch.Values)
foreach (DipValue subValue in dipSwitch.Values)
{
if (!PassesFilters(subValue))
return false;
@@ -1239,6 +1317,38 @@ namespace SabreTools.Filtering
return true;
}
/// <summary>
/// Check to see if a DipValue passes the filters
/// </summary>
/// <param name="dipValue">DipValue to check</param>
/// <returns>True if the item passed the filter, false otherwise</returns>
private bool PassesFilters(DipValue dipValue)
{
// DatItem_Setting_Default
if (!PassBoolFilter(Setting_Default, dipValue.Default))
return false;
// DatItem_Setting_Name
if (!PassStringFilter(Setting_Name, dipValue.Name))
return false;
// DatItem_Setting_Value
if (!PassStringFilter(Setting_Value, dipValue.Value))
return false;
// Filter on individual conditions
if (dipValue.ConditionsSpecified)
{
foreach (Condition subCondition in dipValue.Conditions)
{
if (!PassesFilters(subCondition, true))
return false;
}
}
return true;
}
/// <summary>
/// Check to see if a Disk passes the filters
/// </summary>
@@ -1539,28 +1649,6 @@ namespace SabreTools.Filtering
return true;
}
/// <summary>
/// Check to see if a Location passes the filters
/// </summary>
/// <param name="location">Location to check</param>
/// <returns>True if the item passed the filter, false otherwise</returns>
private bool PassesFilters(Location location)
{
// DatItem_Location_Inverted
if (!PassBoolFilter(Location_Inverted, location.Inverted))
return false;
// DatItem_Location_Name
if (!PassStringFilter(Location_Name, location.Name))
return false;
// DatItem_Location_Number
if (!PassLongFilter(Location_Number, location.Number))
return false;
return true;
}
/// <summary>
/// Check to see if a Media passes the filters
/// </summary>
@@ -1855,38 +1943,6 @@ namespace SabreTools.Filtering
return true;
}
/// <summary>
/// Check to see if a Setting passes the filters
/// </summary>
/// <param name="setting">Setting to check</param>
/// <returns>True if the item passed the filter, false otherwise</returns>
private bool PassesFilters(Setting setting)
{
// DatItem_Setting_Default
if (!PassBoolFilter(Setting_Default, setting.Default))
return false;
// DatItem_Setting_Name
if (!PassStringFilter(Setting_Name, setting.Name))
return false;
// DatItem_Setting_Value
if (!PassStringFilter(Setting_Value, setting.Value))
return false;
// Filter on individual conditions
if (setting.ConditionsSpecified)
{
foreach (Condition subCondition in setting.Conditions)
{
if (!PassesFilters(subCondition, true))
return false;
}
}
return true;
}
/// <summary>
/// Check to see if a SharedFeature passes the filters
/// </summary>

View File

@@ -92,10 +92,14 @@ namespace SabreTools.Filtering
else if (datItem is Chip) RemoveFields(datItem as Chip);
else if (datItem is Condition) RemoveFields(datItem as Condition);
else if (datItem is Configuration) RemoveFields(datItem as Configuration);
else if (datItem is ConfLocation) RemoveFields(datItem as ConfLocation);
else if (datItem is ConfSetting) RemoveFields(datItem as ConfSetting);
else if (datItem is Control) RemoveFields(datItem as Control);
else if (datItem is DataArea) RemoveFields(datItem as DataArea);
else if (datItem is Device) RemoveFields(datItem as Device);
else if (datItem is DipLocation) RemoveFields(datItem as DipLocation);
else if (datItem is DipSwitch) RemoveFields(datItem as DipSwitch);
else if (datItem is DipValue) RemoveFields(datItem as DipValue);
else if (datItem is Disk) RemoveFields(datItem as Disk);
else if (datItem is DiskArea) RemoveFields(datItem as DiskArea);
else if (datItem is Display) RemoveFields(datItem as Display);
@@ -105,7 +109,6 @@ namespace SabreTools.Filtering
else if (datItem is Info) RemoveFields(datItem as Info);
else if (datItem is Input) RemoveFields(datItem as Input);
else if (datItem is Instance) RemoveFields(datItem as Instance);
else if (datItem is Location) RemoveFields(datItem as Location);
else if (datItem is Media) RemoveFields(datItem as Media);
else if (datItem is Part) RemoveFields(datItem as Part);
else if (datItem is PartFeature) RemoveFields(datItem as PartFeature);
@@ -113,7 +116,6 @@ namespace SabreTools.Filtering
else if (datItem is RamOption) RemoveFields(datItem as RamOption);
else if (datItem is Release) RemoveFields(datItem as Release);
else if (datItem is Rom) RemoveFields(datItem as Rom);
else if (datItem is Setting) RemoveFields(datItem as Setting);
else if (datItem is SharedFeature) RemoveFields(datItem as SharedFeature);
else if (datItem is Slot) RemoveFields(datItem as Slot);
else if (datItem is SlotOption) RemoveFields(datItem as SlotOption);
@@ -394,7 +396,7 @@ namespace SabreTools.Filtering
if (configuration.LocationsSpecified)
{
foreach (Location subLocation in configuration.Locations)
foreach (ConfLocation subLocation in configuration.Locations)
{
RemoveFields(subLocation);
}
@@ -402,13 +404,53 @@ namespace SabreTools.Filtering
if (configuration.SettingsSpecified)
{
foreach (Setting subSetting in configuration.Settings)
foreach (ConfSetting subSetting in configuration.Settings)
{
RemoveFields(subSetting);
}
}
}
/// <summary>
/// Remove fields with given values
/// </summary>
/// <param name="confLocation">ConfLocation to remove fields from</param>
private void RemoveFields(ConfLocation confLocation)
{
if (DatItemFields.Contains(DatItemField.Location_Inverted))
confLocation.Inverted = null;
if (DatItemFields.Contains(DatItemField.Location_Name))
confLocation.Name = null;
if (DatItemFields.Contains(DatItemField.Location_Number))
confLocation.Number = null;
}
/// <summary>
/// Remove fields with given values
/// </summary>
/// <param name="confsetting">ConfSetting to remove fields from</param>
private void RemoveFields(ConfSetting confsetting)
{
if (DatItemFields.Contains(DatItemField.Setting_Default))
confsetting.Default = null;
if (DatItemFields.Contains(DatItemField.Setting_Name))
confsetting.Name = null;
if (DatItemFields.Contains(DatItemField.Setting_Value))
confsetting.Value = null;
if (confsetting.ConditionsSpecified)
{
foreach (Condition subCondition in confsetting.Conditions)
{
RemoveFields(subCondition, true);
}
}
}
/// <summary>
/// Remove fields with given values
/// </summary>
@@ -509,6 +551,22 @@ namespace SabreTools.Filtering
}
}
/// <summary>
/// Remove fields with given values
/// </summary>
/// <param name="dipLocation">DipLocation to remove fields from</param>
private void RemoveFields(DipLocation dipLocation)
{
if (DatItemFields.Contains(DatItemField.Location_Inverted))
dipLocation.Inverted = null;
if (DatItemFields.Contains(DatItemField.Location_Name))
dipLocation.Name = null;
if (DatItemFields.Contains(DatItemField.Location_Number))
dipLocation.Number = null;
}
/// <summary>
/// Remove fields with given values
/// </summary>
@@ -531,7 +589,7 @@ namespace SabreTools.Filtering
if (dipSwitch.LocationsSpecified)
{
foreach (Location subLocation in dipSwitch.Locations)
foreach (DipLocation subLocation in dipSwitch.Locations)
{
RemoveFields(subLocation);
}
@@ -539,7 +597,7 @@ namespace SabreTools.Filtering
if (dipSwitch.ValuesSpecified)
{
foreach (Setting subValue in dipSwitch.Values)
foreach (DipValue subValue in dipSwitch.Values)
{
RemoveFields(subValue);
}
@@ -549,6 +607,30 @@ namespace SabreTools.Filtering
RemoveFields(dipSwitch.Part);
}
/// <summary>
/// Remove fields with given values
/// </summary>
/// <param name="dipValue">DipValue to remove fields from</param>
private void RemoveFields(DipValue dipValue)
{
if (DatItemFields.Contains(DatItemField.Setting_Default))
dipValue.Default = null;
if (DatItemFields.Contains(DatItemField.Setting_Name))
dipValue.Name = null;
if (DatItemFields.Contains(DatItemField.Setting_Value))
dipValue.Value = null;
if (dipValue.ConditionsSpecified)
{
foreach (Condition subCondition in dipValue.Conditions)
{
RemoveFields(subCondition, true);
}
}
}
/// <summary>
/// Remove fields with given values
/// </summary>
@@ -752,22 +834,6 @@ namespace SabreTools.Filtering
instance.Name = null;
}
/// <summary>
/// Remove fields with given values
/// </summary>
/// <param name="location">Location to remove fields from</param>
private void RemoveFields(Location location)
{
if (DatItemFields.Contains(DatItemField.Location_Inverted))
location.Inverted = null;
if (DatItemFields.Contains(DatItemField.Location_Name))
location.Name = null;
if (DatItemFields.Contains(DatItemField.Location_Number))
location.Number = null;
}
/// <summary>
/// Remove fields with given values
/// </summary>
@@ -977,30 +1043,6 @@ namespace SabreTools.Filtering
RemoveFields(rom.Part);
}
/// <summary>
/// Remove fields with given values
/// </summary>
/// <param name="setting">Setting to remove fields from</param>
private void RemoveFields(Setting setting)
{
if (DatItemFields.Contains(DatItemField.Setting_Default))
setting.Default = null;
if (DatItemFields.Contains(DatItemField.Setting_Name))
setting.Name = null;
if (DatItemFields.Contains(DatItemField.Setting_Value))
setting.Value = null;
if (setting.ConditionsSpecified)
{
foreach (Condition subCondition in setting.Conditions)
{
RemoveFields(subCondition, true);
}
}
}
/// <summary>
/// Remove fields with given values
/// </summary>

View File

@@ -40,10 +40,14 @@ namespace SabreTools.Filtering
else if (datItem is Chip) ReplaceFields(datItem as Chip, repDatItem as Chip, datItemFields);
else if (datItem is Condition) ReplaceFields(datItem as Condition, repDatItem as Condition, datItemFields);
else if (datItem is Configuration) ReplaceFields(datItem as Configuration, repDatItem as Configuration, datItemFields);
else if (datItem is ConfLocation) ReplaceFields(datItem as ConfLocation, repDatItem as ConfLocation, datItemFields);
else if (datItem is ConfSetting) ReplaceFields(datItem as ConfSetting, repDatItem as ConfSetting, datItemFields);
else if (datItem is Control) ReplaceFields(datItem as Control, repDatItem as Control, datItemFields);
else if (datItem is DataArea) ReplaceFields(datItem as DataArea, repDatItem as DataArea, datItemFields);
else if (datItem is Device) ReplaceFields(datItem as Device, repDatItem as Device, datItemFields);
else if (datItem is DipLocation) ReplaceFields(datItem as DipLocation, repDatItem as DipLocation, datItemFields);
else if (datItem is DipSwitch) ReplaceFields(datItem as DipSwitch, repDatItem as DipSwitch, datItemFields);
else if (datItem is DipValue) ReplaceFields(datItem as DipValue, repDatItem as DipValue, datItemFields);
else if (datItem is Disk) ReplaceFields(datItem as Disk, repDatItem as Disk, datItemFields);
else if (datItem is DiskArea) ReplaceFields(datItem as DiskArea, repDatItem as DiskArea, datItemFields);
else if (datItem is Display) ReplaceFields(datItem as Display, repDatItem as Display, datItemFields);
@@ -53,7 +57,6 @@ namespace SabreTools.Filtering
else if (datItem is Info) ReplaceFields(datItem as Info, repDatItem as Info, datItemFields);
else if (datItem is Input) ReplaceFields(datItem as Input, repDatItem as Input, datItemFields);
else if (datItem is Instance) ReplaceFields(datItem as Instance, repDatItem as Instance, datItemFields);
else if (datItem is Location) ReplaceFields(datItem as Location, repDatItem as Location, datItemFields);
else if (datItem is Media) ReplaceFields(datItem as Media, repDatItem as Media, datItemFields);
else if (datItem is Part) ReplaceFields(datItem as Part, repDatItem as Part, datItemFields);
else if (datItem is PartFeature) ReplaceFields(datItem as PartFeature, repDatItem as PartFeature, datItemFields);
@@ -61,7 +64,6 @@ namespace SabreTools.Filtering
else if (datItem is RamOption) ReplaceFields(datItem as RamOption, repDatItem as RamOption, datItemFields);
else if (datItem is Release) ReplaceFields(datItem as Release, repDatItem as Release, datItemFields);
else if (datItem is Rom) ReplaceFields(datItem as Rom, repDatItem as Rom, datItemFields);
else if (datItem is Setting) ReplaceFields(datItem as Setting, repDatItem as Setting, datItemFields);
else if (datItem is SharedFeature) ReplaceFields(datItem as SharedFeature, repDatItem as SharedFeature, datItemFields);
else if (datItem is Slot) ReplaceFields(datItem as Slot, repDatItem as Slot, datItemFields);
else if (datItem is SlotOption) ReplaceFields(datItem as SlotOption, repDatItem as SlotOption, datItemFields);
@@ -351,6 +353,46 @@ namespace SabreTools.Filtering
// can replace every setting under this item
}
/// <summary>
/// Replace fields with given values
/// </summary>
/// <param name="location">ConfLocation to remove replace fields in</param>
/// <param name="newItem">ConfLocation to pull new information from</param>
/// <param name="datItemFields">List of fields representing what should be updated</param>
private static void ReplaceFields(ConfLocation location, ConfLocation newItem, List<DatItemField> datItemFields)
{
if (datItemFields.Contains(DatItemField.Location_Inverted))
location.Inverted = newItem.Inverted;
if (datItemFields.Contains(DatItemField.Location_Name))
location.Name = newItem.Name;
if (datItemFields.Contains(DatItemField.Location_Number))
location.Number = newItem.Number;
}
/// <summary>
/// Replace fields with given values
/// </summary>
/// <param name="confSetting">ConfSetting to remove replace fields in</param>
/// <param name="newItem">ConfSetting to pull new information from</param>
/// <param name="datItemFields">List of fields representing what should be updated</param>
private static void ReplaceFields(ConfSetting confSetting, ConfSetting newItem, List<DatItemField> datItemFields)
{
if (datItemFields.Contains(DatItemField.Setting_Default))
confSetting.Default = newItem.Default;
if (datItemFields.Contains(DatItemField.Setting_Name))
confSetting.Name = newItem.Name;
if (datItemFields.Contains(DatItemField.Setting_Value))
confSetting.Value = newItem.Value;
// Condition_* doesn't make sense here
// since not every condition under the other item
// can replace every condition under this item
}
/// <summary>
/// Replace fields with given values
/// </summary>
@@ -449,6 +491,24 @@ namespace SabreTools.Filtering
// can replace every extension under this item
}
/// <summary>
/// Replace fields with given values
/// </summary>
/// <param name="location">DipLocation to remove replace fields in</param>
/// <param name="newItem">DipLocation to pull new information from</param>
/// <param name="datItemFields">List of fields representing what should be updated</param>
private static void ReplaceFields(DipLocation location, DipLocation newItem, List<DatItemField> datItemFields)
{
if (datItemFields.Contains(DatItemField.Location_Inverted))
location.Inverted = newItem.Inverted;
if (datItemFields.Contains(DatItemField.Location_Name))
location.Name = newItem.Name;
if (datItemFields.Contains(DatItemField.Location_Number))
location.Number = newItem.Number;
}
/// <summary>
/// Replace fields with given values
/// </summary>
@@ -479,6 +539,28 @@ namespace SabreTools.Filtering
ReplaceFields(dipSwitch.Part, newItem.Part, datItemFields);
}
/// <summary>
/// Replace fields with given values
/// </summary>
/// <param name="dipValue">DipValue to remove replace fields in</param>
/// <param name="newItem">DipValue to pull new information from</param>
/// <param name="datItemFields">List of fields representing what should be updated</param>
private static void ReplaceFields(DipValue dipValue, DipValue newItem, List<DatItemField> datItemFields)
{
if (datItemFields.Contains(DatItemField.Setting_Default))
dipValue.Default = newItem.Default;
if (datItemFields.Contains(DatItemField.Setting_Name))
dipValue.Name = newItem.Name;
if (datItemFields.Contains(DatItemField.Setting_Value))
dipValue.Value = newItem.Value;
// Condition_* doesn't make sense here
// since not every condition under the other item
// can replace every condition under this item
}
/// <summary>
/// Replace fields with given values
/// </summary>
@@ -702,24 +784,6 @@ namespace SabreTools.Filtering
instance.Name = newItem.Name;
}
/// <summary>
/// Replace fields with given values
/// </summary>
/// <param name="location">Location to remove replace fields in</param>
/// <param name="newItem">Location to pull new information from</param>
/// <param name="datItemFields">List of fields representing what should be updated</param>
private static void ReplaceFields(Location location, Location newItem, List<DatItemField> datItemFields)
{
if (datItemFields.Contains(DatItemField.Location_Inverted))
location.Inverted = newItem.Inverted;
if (datItemFields.Contains(DatItemField.Location_Name))
location.Name = newItem.Name;
if (datItemFields.Contains(DatItemField.Location_Number))
location.Number = newItem.Number;
}
/// <summary>
/// Replace fields with given values
/// </summary>
@@ -968,28 +1032,6 @@ namespace SabreTools.Filtering
ReplaceFields(rom.Part, newItem.Part, datItemFields);
}
/// <summary>
/// Replace fields with given values
/// </summary>
/// <param name="setting">Setting to remove replace fields in</param>
/// <param name="newItem">Setting to pull new information from</param>
/// <param name="datItemFields">List of fields representing what should be updated</param>
private static void ReplaceFields(Setting setting, Setting newItem, List<DatItemField> datItemFields)
{
if (datItemFields.Contains(DatItemField.Setting_Default))
setting.Default = newItem.Default;
if (datItemFields.Contains(DatItemField.Setting_Name))
setting.Name = newItem.Name;
if (datItemFields.Contains(DatItemField.Setting_Value))
setting.Value = newItem.Value;
// Condition_* doesn't make sense here
// since not every condition under the other item
// can replace every condition under this item
}
/// <summary>
/// Replace fields with given values
/// </summary>