Watch comparaison interfaces implementation
Watch now implements IEquatable<Watch>, IEquatable<Cheat>, IComparable<Watch> Operators had also been overloaded. You can now put watches from SAME domain in a list and easly sort them. Sorting is based on address first then size.
This commit is contained in:
parent
fbd1d6d8e2
commit
01639c3e10
|
@ -13,6 +13,7 @@
|
||||||
<Compartment Name="Nested Types" Collapsed="false" />
|
<Compartment Name="Nested Types" Collapsed="false" />
|
||||||
</Compartments>
|
</Compartments>
|
||||||
<TypeIdentifier />
|
<TypeIdentifier />
|
||||||
|
<Lollipop Orientation="Left" Position="0.1" />
|
||||||
</Class>
|
</Class>
|
||||||
<Class Name="BizHawk.Client.Common.SeparatorWatch">
|
<Class Name="BizHawk.Client.Common.SeparatorWatch">
|
||||||
<Position X="6" Y="19" Width="2.75" />
|
<Position X="6" Y="19" Width="2.75" />
|
||||||
|
|
|
@ -9,6 +9,9 @@ using System.Linq;
|
||||||
namespace BizHawk.Client.Common
|
namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
public abstract partial class Watch
|
public abstract partial class Watch
|
||||||
|
: IEquatable<Watch>,
|
||||||
|
IEquatable<Cheat>,
|
||||||
|
IComparable<Watch>
|
||||||
{
|
{
|
||||||
#region Fields
|
#region Fields
|
||||||
|
|
||||||
|
@ -33,6 +36,7 @@ namespace BizHawk.Client.Common
|
||||||
/// <param name="type">How you you want to display the value See <see cref="DisplayType"/></param>
|
/// <param name="type">How you you want to display the value See <see cref="DisplayType"/></param>
|
||||||
/// <param name="bigEndian">Specify the endianess. true for big endian</param>
|
/// <param name="bigEndian">Specify the endianess. true for big endian</param>
|
||||||
/// <param name="note">A custom note about the <see cref="Watch"/></param>
|
/// <param name="note">A custom note about the <see cref="Watch"/></param>
|
||||||
|
/// <exception cref="ArgumentException">Occurs when a <see cref="DisplayType"/> is incompatible with the <see cref="WatchSize"/></exception>
|
||||||
protected Watch(MemoryDomain domain, long address, WatchSize size, DisplayType type, bool bigEndian, string note)
|
protected Watch(MemoryDomain domain, long address, WatchSize size, DisplayType type, bool bigEndian, string note)
|
||||||
{
|
{
|
||||||
if (IsDiplayTypeAvailable(type))
|
if (IsDiplayTypeAvailable(type))
|
||||||
|
@ -55,7 +59,7 @@ namespace BizHawk.Client.Common
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Methods
|
#region Methods
|
||||||
|
|
||||||
#region Static
|
#region Static
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -189,6 +193,8 @@ namespace BizHawk.Client.Common
|
||||||
return GenerateWatch(domain, address, size, type, bigEndian, string.Empty, 0, 0, 0);
|
return GenerateWatch(domain, address, size, type, bigEndian, string.Empty, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region Operators
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Equality operator between two <see cref="Watch"/>
|
/// Equality operator between two <see cref="Watch"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -244,6 +250,56 @@ namespace BizHawk.Client.Common
|
||||||
return !(a == b);
|
return !(a == b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Compare two <see cref="Watch"/> together
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="a">First <see cref="Watch"/></param>
|
||||||
|
/// <param name="b">Second <see cref="Watch"/></param>
|
||||||
|
/// <returns>True if first is lesser than b; otherwise, false</returns>
|
||||||
|
/// <exception cref="InvalidOperationException">Occurs when you try to compare two <see cref="Watch"/> throughout different <see cref="MemoryDomain"/></exception>
|
||||||
|
public static bool operator <(Watch a, Watch b)
|
||||||
|
{
|
||||||
|
return a.CompareTo(b) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Compare two <see cref="Watch"/> together
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="a">First <see cref="Watch"/></param>
|
||||||
|
/// <param name="b">Second <see cref="Watch"/></param>
|
||||||
|
/// <returns>True if first is greater than b; otherwise, false</returns>
|
||||||
|
/// <exception cref="InvalidOperationException">Occurs when you try to compare two <see cref="Watch"/> throughout different <see cref="MemoryDomain"/></exception>
|
||||||
|
public static bool operator >(Watch a, Watch b)
|
||||||
|
{
|
||||||
|
return a.CompareTo(b) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Compare two <see cref="Watch"/> together
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="a">First <see cref="Watch"/></param>
|
||||||
|
/// <param name="b">Second <see cref="Watch"/></param>
|
||||||
|
/// <returns>True if first is lesser or equals to b; otherwise, false</returns>
|
||||||
|
/// <exception cref="InvalidOperationException">Occurs when you try to compare two <see cref="Watch"/> throughout different <see cref="MemoryDomain"/></exception>
|
||||||
|
public static bool operator <=(Watch a, Watch b)
|
||||||
|
{
|
||||||
|
return a.CompareTo(b) <= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Compare two <see cref="Watch"/> together
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="a">First <see cref="Watch"/></param>
|
||||||
|
/// <param name="b">Second <see cref="Watch"/></param>
|
||||||
|
/// <returns>True if first is greater or equals to b; otherwise, false</returns>
|
||||||
|
/// <exception cref="InvalidOperationException">Occurs when you try to compare two <see cref="Watch"/> throughout different <see cref="MemoryDomain"/></exception>
|
||||||
|
public static bool operator >=(Watch a, Watch b)
|
||||||
|
{
|
||||||
|
return a.CompareTo(b) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion Operators
|
||||||
|
|
||||||
#endregion Static
|
#endregion Static
|
||||||
|
|
||||||
#region Abstracts
|
#region Abstracts
|
||||||
|
@ -359,6 +415,70 @@ namespace BizHawk.Client.Common
|
||||||
_changecount = 0;
|
_changecount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region IEquatable<Watch>
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determine if this <see cref="Watch"/> is equals to another
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="obj">The <see cref="Watch"/> to compare</param>
|
||||||
|
/// <returns>True if both object are equals; otherwise, false</returns>
|
||||||
|
public bool Equals(Watch other)
|
||||||
|
{
|
||||||
|
return this._domain == other._domain &&
|
||||||
|
this._address == other._address &&
|
||||||
|
this._size == other._size;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion IEquatable<Watch>
|
||||||
|
|
||||||
|
#region IEquatable<Cheat>
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determine if this <see cref="Watch"/> is equals to an instance of <see cref="Cheat"/>
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="obj">The <see cref="Cheat"/> to compare</param>
|
||||||
|
/// <returns>True if both object are equals; otherwise, false</returns>
|
||||||
|
public bool Equals(Cheat other)
|
||||||
|
{
|
||||||
|
return this._domain == other.Domain &&
|
||||||
|
this._address == other.Address &&
|
||||||
|
this._size == other.Size;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion IEquatable<Cheat>
|
||||||
|
|
||||||
|
#region IComparable<Watch>
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Compare two <see cref="Watch"/> together and determine wich one comes first.
|
||||||
|
/// First we look the address and then the size
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="other">The other <see cref="Watch"/> to compare to</param>
|
||||||
|
/// <returns>0 if they are equals, 1 if the other is greater, -1 if the other is lesser</returns>
|
||||||
|
/// <exception cref="InvalidOperationException">Occurs when you try to compare two <see cref="Watch"/> throughout different <see cref="MemoryDomain"/></exception>
|
||||||
|
public int CompareTo(Watch other)
|
||||||
|
{
|
||||||
|
if (this._domain != other._domain)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("Watch cannot be compared through different domain");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.Equals(other))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if (_address.Equals(other._address))
|
||||||
|
{
|
||||||
|
return ((int)_size).CompareTo((int)other._size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return _address.CompareTo(other._address);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion IComparable<Watch>
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Determine if this object is Equals to another
|
/// Determine if this object is Equals to another
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -366,19 +486,14 @@ namespace BizHawk.Client.Common
|
||||||
/// <returns>True if both object are equals; otherwise, false</returns>
|
/// <returns>True if both object are equals; otherwise, false</returns>
|
||||||
public override bool Equals(object obj)
|
public override bool Equals(object obj)
|
||||||
{
|
{
|
||||||
Watch watch = (Watch)obj;
|
|
||||||
|
|
||||||
if (obj is Watch)
|
if (obj is Watch)
|
||||||
{
|
{
|
||||||
return this.Domain == watch.Domain &&
|
return Equals((Watch)obj);
|
||||||
this.Address == watch.Address &&
|
|
||||||
this.Size == watch.Size &&
|
|
||||||
this.Type == watch.Type &&
|
|
||||||
this.Notes == watch.Notes;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (obj is Cheat)
|
else if (obj is Cheat)
|
||||||
{
|
{
|
||||||
return this.Domain == watch.Domain && this.Address == watch.Address;
|
return Equals((Cheat)obj);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -404,7 +519,7 @@ namespace BizHawk.Client.Common
|
||||||
public bool IsDiplayTypeAvailable(DisplayType type)
|
public bool IsDiplayTypeAvailable(DisplayType type)
|
||||||
{
|
{
|
||||||
return AvailableTypes().Where<DisplayType>(d => d == type).Any<DisplayType>();
|
return AvailableTypes().Where<DisplayType>(d => d == type).Any<DisplayType>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Transform the current instance into a string
|
/// Transform the current instance into a string
|
||||||
|
@ -508,6 +623,7 @@ namespace BizHawk.Client.Common
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or set the way current <see cref="Watch"/> is displayed
|
/// Gets or set the way current <see cref="Watch"/> is displayed
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <exception cref="ArgumentException">Occurs when a <see cref="DisplayType"/> is incompatible with the <see cref="WatchSize"/></exception>
|
||||||
public DisplayType Type
|
public DisplayType Type
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
|
Loading…
Reference in New Issue