From 33908e4e72240fafd4dd79075064a061c113c953 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Thu, 3 Sep 2020 21:59:53 -0700 Subject: [PATCH] Add and use Relation enum --- SabreTools.Library/DatFiles/DatFile.cs | 1 + SabreTools.Library/DatFiles/Listxml.cs | 22 +++---- SabreTools.Library/DatFiles/Logiqx.cs | 1 - SabreTools.Library/DatFiles/SabreDat.cs | 20 +++--- SabreTools.Library/DatItems/Auxiliary.cs | 2 +- SabreTools.Library/DatItems/Condition.cs | 21 ++++--- SabreTools.Library/DatItems/Enums.cs | 19 ++++++ SabreTools.Library/Filtering/Filter.cs | 12 ++-- SabreTools.Library/Tools/Converters.cs | 78 ++++++++++++++++++++++++ 9 files changed, 138 insertions(+), 38 deletions(-) diff --git a/SabreTools.Library/DatFiles/DatFile.cs b/SabreTools.Library/DatFiles/DatFile.cs index 0008d748..a5b5c964 100644 --- a/SabreTools.Library/DatFiles/DatFile.cs +++ b/SabreTools.Library/DatFiles/DatFile.cs @@ -3545,6 +3545,7 @@ namespace SabreTools.Library.DatFiles .Replace("%size%", size); // TODO: Add GameName logic here too? + // TODO: Figure out what I meant by the above ^ return fix; } diff --git a/SabreTools.Library/DatFiles/Listxml.cs b/SabreTools.Library/DatFiles/Listxml.cs index 6f68c7bf..4fa8fe40 100644 --- a/SabreTools.Library/DatFiles/Listxml.cs +++ b/SabreTools.Library/DatFiles/Listxml.cs @@ -229,7 +229,7 @@ namespace SabreTools.Library.DatFiles { Tag = reader.GetAttribute("tag"), Mask = reader.GetAttribute("mask"), - Relation = reader.GetAttribute("relation"), + Relation = reader.GetAttribute("relation").AsRelation(), Value = reader.GetAttribute("value"), Source = new Source @@ -746,7 +746,7 @@ namespace SabreTools.Library.DatFiles var condition = new Condition(); condition.Tag = reader.GetAttribute("tag"); condition.Mask = reader.GetAttribute("mask"); - condition.Relation = reader.GetAttribute("relation"); + condition.Relation = reader.GetAttribute("relation").AsRelation(); condition.Value = reader.GetAttribute("value"); dipSwitch.Conditions.Add(condition); @@ -820,7 +820,7 @@ namespace SabreTools.Library.DatFiles var condition = new Condition(); condition.Tag = reader.GetAttribute("tag"); condition.Mask = reader.GetAttribute("mask"); - condition.Relation = reader.GetAttribute("relation"); + condition.Relation = reader.GetAttribute("relation").AsRelation(); condition.Value = reader.GetAttribute("value"); dipValue.Conditions.Add(condition); @@ -870,7 +870,7 @@ namespace SabreTools.Library.DatFiles var condition = new Condition(); condition.Tag = reader.GetAttribute("tag"); condition.Mask = reader.GetAttribute("mask"); - condition.Relation = reader.GetAttribute("relation"); + condition.Relation = reader.GetAttribute("relation").AsRelation(); condition.Value = reader.GetAttribute("value"); configuration.Conditions.Add(condition); @@ -944,7 +944,7 @@ namespace SabreTools.Library.DatFiles var condition = new Condition(); condition.Tag = reader.GetAttribute("tag"); condition.Mask = reader.GetAttribute("mask"); - condition.Relation = reader.GetAttribute("relation"); + condition.Relation = reader.GetAttribute("relation").AsRelation(); condition.Value = reader.GetAttribute("value"); confSetting.Conditions.Add(condition); @@ -1037,7 +1037,7 @@ namespace SabreTools.Library.DatFiles var condition = new Condition(); condition.Tag = reader.GetAttribute("tag"); condition.Mask = reader.GetAttribute("mask"); - condition.Relation = reader.GetAttribute("relation"); + condition.Relation = reader.GetAttribute("relation").AsRelation(); condition.Value = reader.GetAttribute("value"); adjuster.Conditions.Add(condition); @@ -1320,7 +1320,7 @@ namespace SabreTools.Library.DatFiles xtw.WriteStartElement("condition"); xtw.WriteOptionalAttributeString("tag", adjusterCondition.Tag); xtw.WriteOptionalAttributeString("mask", adjusterCondition.Mask); - xtw.WriteOptionalAttributeString("relation", adjusterCondition.Relation); + xtw.WriteOptionalAttributeString("relation", adjusterCondition.Relation.FromRelation()); xtw.WriteOptionalAttributeString("value", adjusterCondition.Value); xtw.WriteEndElement(); } @@ -1352,7 +1352,7 @@ namespace SabreTools.Library.DatFiles xtw.WriteStartElement("condition"); xtw.WriteOptionalAttributeString("tag", condition.Tag); xtw.WriteOptionalAttributeString("mask", condition.Mask); - xtw.WriteOptionalAttributeString("relation", condition.Relation); + xtw.WriteOptionalAttributeString("relation", condition.Relation.FromRelation()); xtw.WriteOptionalAttributeString("value", condition.Value); xtw.WriteEndElement(); break; @@ -1371,7 +1371,7 @@ namespace SabreTools.Library.DatFiles xtw.WriteStartElement("condition"); xtw.WriteOptionalAttributeString("tag", configurationCondition.Tag); xtw.WriteOptionalAttributeString("mask", configurationCondition.Mask); - xtw.WriteOptionalAttributeString("relation", configurationCondition.Relation); + xtw.WriteOptionalAttributeString("relation", configurationCondition.Relation.FromRelation()); xtw.WriteOptionalAttributeString("value", configurationCondition.Value); xtw.WriteEndElement(); } @@ -1451,7 +1451,7 @@ namespace SabreTools.Library.DatFiles xtw.WriteStartElement("condition"); xtw.WriteOptionalAttributeString("tag", dipSwitchCondition.Tag); xtw.WriteOptionalAttributeString("mask", dipSwitchCondition.Mask); - xtw.WriteOptionalAttributeString("relation", dipSwitchCondition.Relation); + xtw.WriteOptionalAttributeString("relation", dipSwitchCondition.Relation.FromRelation()); xtw.WriteOptionalAttributeString("value", dipSwitchCondition.Value); xtw.WriteEndElement(); } @@ -1482,7 +1482,7 @@ namespace SabreTools.Library.DatFiles xtw.WriteStartElement("condition"); xtw.WriteOptionalAttributeString("tag", dipValueCondition.Tag); xtw.WriteOptionalAttributeString("mask", dipValueCondition.Mask); - xtw.WriteOptionalAttributeString("relation", dipValueCondition.Relation); + xtw.WriteOptionalAttributeString("relation", dipValueCondition.Relation.FromRelation()); xtw.WriteOptionalAttributeString("value", dipValueCondition.Value); xtw.WriteEndElement(); } diff --git a/SabreTools.Library/DatFiles/Logiqx.cs b/SabreTools.Library/DatFiles/Logiqx.cs index 6f66779e..b2b61f47 100644 --- a/SabreTools.Library/DatFiles/Logiqx.cs +++ b/SabreTools.Library/DatFiles/Logiqx.cs @@ -16,7 +16,6 @@ namespace SabreTools.Library.DatFiles /// /// Represents parsing and writing of a Logiqx-derived DAT /// - /// TODO: Add XSD validation for all XML DAT types (maybe?) internal class Logiqx : DatFile { // Private instance variables specific to Logiqx DATs diff --git a/SabreTools.Library/DatFiles/SabreDat.cs b/SabreTools.Library/DatFiles/SabreDat.cs index 747a3bd2..a2667248 100644 --- a/SabreTools.Library/DatFiles/SabreDat.cs +++ b/SabreTools.Library/DatFiles/SabreDat.cs @@ -664,7 +664,7 @@ namespace SabreTools.Library.DatFiles var condition = new Condition(); condition.Tag = reader.GetAttribute("tag"); condition.Mask = reader.GetAttribute("mask"); - condition.Relation = reader.GetAttribute("relation"); + condition.Relation = reader.GetAttribute("relation").AsRelation(); condition.Value = reader.GetAttribute("value"); (adjuster as Adjuster).Conditions.Add(condition); @@ -718,7 +718,7 @@ namespace SabreTools.Library.DatFiles var condition = new Condition(); condition.Tag = reader.GetAttribute("tag"); condition.Mask = reader.GetAttribute("mask"); - condition.Relation = reader.GetAttribute("relation"); + condition.Relation = reader.GetAttribute("relation").AsRelation(); condition.Value = reader.GetAttribute("value"); (configuration as Configuration).Conditions.Add(condition); @@ -792,7 +792,7 @@ namespace SabreTools.Library.DatFiles var condition = new Condition(); condition.Tag = reader.GetAttribute("tag"); condition.Mask = reader.GetAttribute("mask"); - condition.Relation = reader.GetAttribute("relation"); + condition.Relation = reader.GetAttribute("relation").AsRelation(); condition.Value = reader.GetAttribute("value"); confSetting.Conditions.Add(condition); @@ -846,7 +846,7 @@ namespace SabreTools.Library.DatFiles var condition = new Condition(); condition.Tag = reader.GetAttribute("tag"); condition.Mask = reader.GetAttribute("mask"); - condition.Relation = reader.GetAttribute("relation"); + condition.Relation = reader.GetAttribute("relation").AsRelation(); condition.Value = reader.GetAttribute("value"); (dipSwitch as DipSwitch).Conditions.Add(condition); @@ -920,7 +920,7 @@ namespace SabreTools.Library.DatFiles var condition = new Condition(); condition.Tag = reader.GetAttribute("tag"); condition.Mask = reader.GetAttribute("mask"); - condition.Relation = reader.GetAttribute("relation"); + condition.Relation = reader.GetAttribute("relation").AsRelation(); condition.Value = reader.GetAttribute("value"); dipValue.Conditions.Add(condition); @@ -1221,7 +1221,7 @@ namespace SabreTools.Library.DatFiles xtw.WriteStartElement("condition"); xtw.WriteOptionalAttributeString("tag", adjusterCondition.Tag); xtw.WriteOptionalAttributeString("mask", adjusterCondition.Mask); - xtw.WriteOptionalAttributeString("relation", adjusterCondition.Relation); + xtw.WriteOptionalAttributeString("relation", adjusterCondition.Relation.FromRelation()); xtw.WriteOptionalAttributeString("value", adjusterCondition.Value); xtw.WriteEndElement(); } @@ -1264,7 +1264,7 @@ namespace SabreTools.Library.DatFiles xtw.WriteAttributeString("type", "condition"); xtw.WriteOptionalAttributeString("tag", condition.Tag); xtw.WriteOptionalAttributeString("mask", condition.Mask); - xtw.WriteOptionalAttributeString("relation", condition.Relation); + xtw.WriteOptionalAttributeString("relation", condition.Relation.FromRelation()); xtw.WriteOptionalAttributeString("value", condition.Value); xtw.WriteEndElement(); break; @@ -1284,7 +1284,7 @@ namespace SabreTools.Library.DatFiles xtw.WriteStartElement("condition"); xtw.WriteOptionalAttributeString("tag", configurationCondition.Tag); xtw.WriteOptionalAttributeString("mask", configurationCondition.Mask); - xtw.WriteOptionalAttributeString("relation", configurationCondition.Relation); + xtw.WriteOptionalAttributeString("relation", configurationCondition.Relation.FromRelation()); xtw.WriteOptionalAttributeString("value", configurationCondition.Value); xtw.WriteEndElement(); } @@ -1367,7 +1367,7 @@ namespace SabreTools.Library.DatFiles xtw.WriteStartElement("condition"); xtw.WriteOptionalAttributeString("tag", dipSwitchCondition.Tag); xtw.WriteOptionalAttributeString("mask", dipSwitchCondition.Mask); - xtw.WriteOptionalAttributeString("relation", dipSwitchCondition.Relation); + xtw.WriteOptionalAttributeString("relation", dipSwitchCondition.Relation.FromRelation()); xtw.WriteOptionalAttributeString("value", dipSwitchCondition.Value); xtw.WriteEndElement(); } @@ -1398,7 +1398,7 @@ namespace SabreTools.Library.DatFiles xtw.WriteStartElement("condition"); xtw.WriteOptionalAttributeString("tag", dipValueCondition.Tag); xtw.WriteOptionalAttributeString("mask", dipValueCondition.Mask); - xtw.WriteOptionalAttributeString("relation", dipValueCondition.Relation); + xtw.WriteOptionalAttributeString("relation", dipValueCondition.Relation.FromRelation()); xtw.WriteOptionalAttributeString("value", dipValueCondition.Value); xtw.WriteEndElement(); } diff --git a/SabreTools.Library/DatItems/Auxiliary.cs b/SabreTools.Library/DatItems/Auxiliary.cs index 3ad205d1..67f2997e 100644 --- a/SabreTools.Library/DatItems/Auxiliary.cs +++ b/SabreTools.Library/DatItems/Auxiliary.cs @@ -56,7 +56,7 @@ namespace SabreTools.Library.DatItems public long? Size { get; set; } /// - /// Byte width of the area + /// Word width for the area /// [JsonProperty("width", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Width { get; set; } // TODO: (8|16|32|64) "8" diff --git a/SabreTools.Library/DatItems/Condition.cs b/SabreTools.Library/DatItems/Condition.cs index b069b440..e2c6d84a 100644 --- a/SabreTools.Library/DatItems/Condition.cs +++ b/SabreTools.Library/DatItems/Condition.cs @@ -2,7 +2,9 @@ using System.Linq; using SabreTools.Library.Filtering; +using SabreTools.Library.Tools; using Newtonsoft.Json; +using Newtonsoft.Json.Converters; namespace SabreTools.Library.DatItems { @@ -30,7 +32,8 @@ namespace SabreTools.Library.DatItems /// Condition relationship /// [JsonProperty("relation", DefaultValueHandling = DefaultValueHandling.Ignore)] - public string Relation { get; set; } // TODO: (eq|ne|gt|le|lt|ge) + [JsonConverter(typeof(StringEnumConverter))] + public Relation Relation { get; set; } /// /// Condition value @@ -71,7 +74,7 @@ namespace SabreTools.Library.DatItems Mask = mappings[Field.DatItem_Condition_Mask]; if (mappings.Keys.Contains(Field.DatItem_Condition_Relation)) - Relation = mappings[Field.DatItem_Condition_Relation]; + Relation = mappings[Field.DatItem_Condition_Relation].AsRelation(); if (mappings.Keys.Contains(Field.DatItem_Condition_Value)) Value = mappings[Field.DatItem_Condition_Value]; @@ -85,7 +88,7 @@ namespace SabreTools.Library.DatItems Mask = mappings[Field.DatItem_Mask]; if (mappings.Keys.Contains(Field.DatItem_Relation)) - Relation = mappings[Field.DatItem_Relation]; + Relation = mappings[Field.DatItem_Relation].AsRelation(); if (mappings.Keys.Contains(Field.DatItem_Value)) Value = mappings[Field.DatItem_Value]; @@ -187,9 +190,9 @@ namespace SabreTools.Library.DatItems return false; // Filter on relation - if (filter.DatItem_Condition_Relation.MatchesPositiveSet(Relation) == false) + if (filter.DatItem_Condition_Relation.MatchesPositive(Relation.NULL, Relation) == false) return false; - if (filter.DatItem_Condition_Relation.MatchesNegativeSet(Relation) == true) + if (filter.DatItem_Condition_Relation.MatchesNegative(Relation.NULL, Relation) == true) return false; // Filter on value @@ -213,9 +216,9 @@ namespace SabreTools.Library.DatItems return false; // Filter on relation - if (filter.DatItem_Relation.MatchesPositiveSet(Relation) == false) + if (filter.DatItem_Relation.MatchesPositive(Relation.NULL, Relation) == false) return false; - if (filter.DatItem_Relation.MatchesNegativeSet(Relation) == true) + if (filter.DatItem_Relation.MatchesNegative(Relation.NULL, Relation) == true) return false; // Filter on value @@ -257,7 +260,7 @@ namespace SabreTools.Library.DatItems Mask = null; if (fields.Contains(Field.DatItem_Condition_Relation)) - Relation = null; + Relation = Relation.NULL; if (fields.Contains(Field.DatItem_Condition_Value)) Value = null; @@ -271,7 +274,7 @@ namespace SabreTools.Library.DatItems Mask = null; if (fields.Contains(Field.DatItem_Relation)) - Relation = null; + Relation = Relation.NULL; if (fields.Contains(Field.DatItem_Value)) Value = null; diff --git a/SabreTools.Library/DatItems/Enums.cs b/SabreTools.Library/DatItems/Enums.cs index c4113218..68dfb071 100644 --- a/SabreTools.Library/DatItems/Enums.cs +++ b/SabreTools.Library/DatItems/Enums.cs @@ -560,6 +560,25 @@ namespace SabreTools.Library.DatItems SCCPlusCart = 1 << 2, } + /// + /// Determine relation of value to condition + /// + [Flags] + public enum Relation + { + /// + /// This is a fake flag that is used for filter only + /// + NULL = 0, + + Equal = 1 << 0, + NotEqual = 1 << 1, + GreaterThan = 1 << 2, + LessThanOrEqual = 1 << 3, + LessThan = 1 << 4, + GreaterThanOrEqual = 1 << 5, + } + /// /// Determine machine runnable status /// diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs index f7acbcdf..239efac3 100644 --- a/SabreTools.Library/Filtering/Filter.cs +++ b/SabreTools.Library/Filtering/Filter.cs @@ -169,10 +169,10 @@ namespace SabreTools.Library.Filtering // Condition public FilterItem DatItem_Mask { get; private set; } = new FilterItem(); - public FilterItem DatItem_Relation { get; private set; } = new FilterItem(); + public FilterItem DatItem_Relation { get; private set; } = new FilterItem() { Positive = Relation.NULL, Negative = Relation.NULL }; public FilterItem DatItem_Condition_Tag { get; private set; } = new FilterItem(); public FilterItem DatItem_Condition_Mask { get; private set; } = new FilterItem(); - public FilterItem DatItem_Condition_Relation { get; private set; } = new FilterItem(); + public FilterItem DatItem_Condition_Relation { get; private set; } = new FilterItem() { Positive = Relation.NULL, Negative = Relation.NULL }; public FilterItem DatItem_Condition_Value { get; private set; } = new FilterItem(); // Control @@ -1043,9 +1043,9 @@ namespace SabreTools.Library.Filtering case Field.DatItem_Relation: if (negate) - DatItem_Relation.NegativeSet.Add(value); + DatItem_Relation.Negative |= value.AsRelation(); else - DatItem_Relation.PositiveSet.Add(value); + DatItem_Relation.Positive |= value.AsRelation(); break; case Field.DatItem_Condition_Tag: @@ -1064,9 +1064,9 @@ namespace SabreTools.Library.Filtering case Field.DatItem_Condition_Relation: if (negate) - DatItem_Condition_Relation.NegativeSet.Add(value); + DatItem_Condition_Relation.Negative |= value.AsRelation(); else - DatItem_Condition_Relation.PositiveSet.Add(value); + DatItem_Condition_Relation.Positive |= value.AsRelation(); break; case Field.DatItem_Condition_Value: diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs index 1683f090..b61881d4 100644 --- a/SabreTools.Library/Tools/Converters.cs +++ b/SabreTools.Library/Tools/Converters.cs @@ -1971,6 +1971,45 @@ namespace SabreTools.Library.Tools #endif } + /// + /// Get Relation value from input string + /// + /// String to get value from + /// Relation value corresponding to the string + public static Relation AsRelation(this string relation) + { +#if NET_FRAMEWORK + switch (relation?.ToLowerInvariant()) + { + case "eq": + return Relation.Equal; + case "ne": + return Relation.NotEqual; + case "gt": + return Relation.GreaterThan; + case "le": + return Relation.LessThanOrEqual; + case "lt": + return Relation.LessThan; + case "ge": + return Relation.GreaterThanOrEqual; + default: + return Relation.NULL; + } +#else + return relation?.ToLowerInvariant() switch + { + "eq" => Relation.Equal, + "ne" => Relation.NotEqual, + "gt" => Relation.GreaterThan, + "le" => Relation.LessThanOrEqual, + "lt" => Relation.LessThan, + "ge" => Relation.GreaterThanOrEqual, + _ => Relation.NULL, + }; +#endif + } + /// /// Get Runnable value from input string /// @@ -2784,6 +2823,45 @@ namespace SabreTools.Library.Tools #endif } + /// + /// Get string value from input Relation + /// + /// Relation to get value from + /// String value corresponding to the Relation + public static string FromRelation(this Relation relation) + { +#if NET_FRAMEWORK + switch (relation) + { + case Relation.Equal: + return "eq"; + case Relation.NotEqual: + return "ne"; + case Relation.GreaterThan: + return "gt"; + case Relation.LessThanOrEqual: + return "le"; + case Relation.LessThan: + return "lt"; + case Relation.GreaterThanOrEqual: + return "ge"; + default: + return null; + } +#else + return relation switch + { + Relation.Equal => "eq", + Relation.NotEqual => "ne", + Relation.GreaterThan => "gt", + Relation.LessThanOrEqual => "le", + Relation.LessThan => "lt", + Relation.GreaterThanOrEqual => "ge", + _ => null, + }; +#endif + } + /// /// Get string value from input Runnable ///