Add and use Relation enum

This commit is contained in:
Matt Nadareski
2020-09-03 21:59:53 -07:00
parent ad0e5a7f0f
commit 33908e4e72
9 changed files with 138 additions and 38 deletions

View File

@@ -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;
}

View File

@@ -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();
}

View File

@@ -16,7 +16,6 @@ namespace SabreTools.Library.DatFiles
/// <summary>
/// Represents parsing and writing of a Logiqx-derived DAT
/// </summary>
/// TODO: Add XSD validation for all XML DAT types (maybe?)
internal class Logiqx : DatFile
{
// Private instance variables specific to Logiqx DATs

View File

@@ -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();
}

View File

@@ -56,7 +56,7 @@ namespace SabreTools.Library.DatItems
public long? Size { get; set; }
/// <summary>
/// Byte width of the area
/// Word width for the area
/// </summary>
[JsonProperty("width", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Width { get; set; } // TODO: (8|16|32|64) "8"

View File

@@ -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
/// </summary>
[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; }
/// <summary>
/// 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;

View File

@@ -560,6 +560,25 @@ namespace SabreTools.Library.DatItems
SCCPlusCart = 1 << 2,
}
/// <summary>
/// Determine relation of value to condition
/// </summary>
[Flags]
public enum Relation
{
/// <summary>
/// This is a fake flag that is used for filter only
/// </summary>
NULL = 0,
Equal = 1 << 0,
NotEqual = 1 << 1,
GreaterThan = 1 << 2,
LessThanOrEqual = 1 << 3,
LessThan = 1 << 4,
GreaterThanOrEqual = 1 << 5,
}
/// <summary>
/// Determine machine runnable status
/// </summary>

View File

@@ -169,10 +169,10 @@ namespace SabreTools.Library.Filtering
// Condition
public FilterItem<string> DatItem_Mask { get; private set; } = new FilterItem<string>();
public FilterItem<string> DatItem_Relation { get; private set; } = new FilterItem<string>();
public FilterItem<Relation> DatItem_Relation { get; private set; } = new FilterItem<Relation>() { Positive = Relation.NULL, Negative = Relation.NULL };
public FilterItem<string> DatItem_Condition_Tag { get; private set; } = new FilterItem<string>();
public FilterItem<string> DatItem_Condition_Mask { get; private set; } = new FilterItem<string>();
public FilterItem<string> DatItem_Condition_Relation { get; private set; } = new FilterItem<string>();
public FilterItem<Relation> DatItem_Condition_Relation { get; private set; } = new FilterItem<Relation>() { Positive = Relation.NULL, Negative = Relation.NULL };
public FilterItem<string> DatItem_Condition_Value { get; private set; } = new FilterItem<string>();
// 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:

View File

@@ -1971,6 +1971,45 @@ namespace SabreTools.Library.Tools
#endif
}
/// <summary>
/// Get Relation value from input string
/// </summary>
/// <param name="relation">String to get value from</param>
/// <returns>Relation value corresponding to the string</returns>
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
}
/// <summary>
/// Get Runnable value from input string
/// </summary>
@@ -2784,6 +2823,45 @@ namespace SabreTools.Library.Tools
#endif
}
/// <summary>
/// Get string value from input Relation
/// </summary>
/// <param name="relation">Relation to get value from</param>
/// <returns>String value corresponding to the Relation</returns>
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
}
/// <summary>
/// Get string value from input Runnable
/// </summary>