--- trunk/RomCheater.Logging/EnumNameValuePair.cs 2012/05/10 13:55:44 111 +++ trunk/RomCheater.Logging/EnumNameValuePair.cs 2012/06/03 19:47:47 265 @@ -5,25 +5,180 @@ using System.Text; namespace RomCheater.Logging { - public class EnumNameValuePair<TName,TValue> + public class EnumNameValuePair<TValue> where TValue : IConvertible { #region implicit operators - public static implicit operator TValue(EnumNameValuePair<TName, TValue> o) { return o.Value; } - public static implicit operator TName(EnumNameValuePair<TName, TValue> o) { return o.Name; } + //public static implicit operator EnumNameValuePair<TValue>(TValue o) { return new EnumNameValuePair<TValue>("", o); } + public static implicit operator TValue(EnumNameValuePair<TValue> o) { return o.Value; } + public static implicit operator string(EnumNameValuePair<TValue> o) { return o.Name; } + public static TValue operator |(EnumNameValuePair<TValue> x, EnumNameValuePair<TValue> y) { return bitwise_or(x, y); } + public static TValue operator &(EnumNameValuePair<TValue> x, EnumNameValuePair<TValue> y) { return bitwise_and(x, y); } + public static bool operator ==(EnumNameValuePair<TValue> x, EnumNameValuePair<TValue> y) { return x.Value.Equals(y.Value); } + public static bool operator !=(EnumNameValuePair<TValue> x, EnumNameValuePair<TValue> y) { return !x.Value.Equals(y.Value); } + public override bool Equals(object obj) + { + EnumNameValuePair<TValue> t = (obj as EnumNameValuePair<TValue>); + if (t == null) return false; + return this.Value.Equals(t.Value); + } + public override int GetHashCode() + { + return base.GetHashCode(); + } #endregion - public EnumNameValuePair() : this(default(TName)) { } - public EnumNameValuePair(TName name) : this(name, default(TValue)) { } - public EnumNameValuePair(TName name, TValue value) + public EnumNameValuePair() : this("") { } + public EnumNameValuePair(string name) : this(name, default(TValue)) { } + public EnumNameValuePair(string name, TValue value) { this.Name = name; this.Value = value; } - public TName Name { get; protected set; } + public string Name { get; protected set; } public TValue Value { get; protected set; } public override string ToString() { return string.Format("[{0}: 0x{1:x8}]", Name.ToString(), Value); } + private static TValue bitwise_or(EnumNameValuePair<TValue> x, EnumNameValuePair<TValue> y) + { + #region bitwise code + string type = (typeof(TValue).Name); + if (type.ToLower() == "byte") + { + byte x1 = Convert.ToByte(x.Value); + byte y1 = Convert.ToByte(y.Value); + return (TValue)Convert.ChangeType(x1 | y1, typeof(TValue)); + } + else if (type.ToLower() == "sbyte") + { + sbyte x1 = Convert.ToSByte(x.Value); + sbyte y1 = Convert.ToSByte(y.Value); + return (TValue)Convert.ChangeType(x1 | y1, typeof(TValue)); + } + else if (type.ToLower() == "int16") + { + short x1 = Convert.ToInt16(x.Value); + short y1 = Convert.ToInt16(y.Value); + return (TValue)Convert.ChangeType(x1 | y1, typeof(TValue)); + } + else if (type.ToLower() == "uint16") + { + ushort x1 = Convert.ToUInt16(x.Value); + ushort y1 = Convert.ToUInt16(y.Value); + return (TValue)Convert.ChangeType(x1 | y1, typeof(TValue)); + } + else if (type.ToLower() == "int32") + { + int x1 = Convert.ToInt32(x.Value); + int y1 = Convert.ToInt32(y.Value); + return (TValue)Convert.ChangeType(x1 | y1, typeof(TValue)); + } + else if (type.ToLower() == "uint32") + { + uint x1 = Convert.ToUInt32(x.Value); + uint y1 = Convert.ToUInt32(y.Value); + return (TValue)Convert.ChangeType(x1 | y1, typeof(TValue)); + } + else if (type.ToLower() == "int64") + { + long x1 = Convert.ToInt64(x.Value); + long y1 = Convert.ToInt64(y.Value); + return (TValue)Convert.ChangeType(x1 | y1, typeof(TValue)); + } + else if (type.ToLower() == "uint64") + { + ulong x1 = Convert.ToUInt64(x.Value); + ulong y1 = Convert.ToUInt64(y.Value); + return (TValue)Convert.ChangeType(x1 | y1, typeof(TValue)); + } + else + { + throw new InvalidCastException(string.Format("Unable to cast values to type: {0}", type), new NotImplementedException(string.Format("Type: {0} has not been implemented", type))); + } + #endregion + } + private static TValue bitwise_and(EnumNameValuePair<TValue> x, EnumNameValuePair<TValue> y) + { + #region bitwise code + string type = (typeof(TValue).Name); + if (type.ToLower() == "byte") + { + byte x1 = Convert.ToByte(x.Value); + byte y1 = Convert.ToByte(y.Value); + return (TValue)Convert.ChangeType(x1 & y1, typeof(TValue)); + } + else if (type.ToLower() == "sbyte") + { + sbyte x1 = Convert.ToSByte(x.Value); + sbyte y1 = Convert.ToSByte(y.Value); + return (TValue)Convert.ChangeType(x1 & y1, typeof(TValue)); + } + else if (type.ToLower() == "int16") + { + short x1 = Convert.ToInt16(x.Value); + short y1 = Convert.ToInt16(y.Value); + return (TValue)Convert.ChangeType(x1 & y1, typeof(TValue)); + } + else if (type.ToLower() == "uint16") + { + ushort x1 = Convert.ToUInt16(x.Value); + ushort y1 = Convert.ToUInt16(y.Value); + return (TValue)Convert.ChangeType(x1 & y1, typeof(TValue)); + } + else if (type.ToLower() == "int32") + { + int x1 = Convert.ToInt32(x.Value); + int y1 = Convert.ToInt32(y.Value); + return (TValue)Convert.ChangeType(x1 & y1, typeof(TValue)); + } + else if (type.ToLower() == "uint32") + { + uint x1 = Convert.ToUInt32(x.Value); + uint y1 = Convert.ToUInt32(y.Value); + return (TValue)Convert.ChangeType(x1 & y1, typeof(TValue)); + } + else if (type.ToLower() == "int64") + { + long x1 = Convert.ToInt64(x.Value); + long y1 = Convert.ToInt64(y.Value); + return (TValue)Convert.ChangeType(x1 & y1, typeof(TValue)); + } + else if (type.ToLower() == "uint64") + { + ulong x1 = Convert.ToUInt64(x.Value); + ulong y1 = Convert.ToUInt64(y.Value); + return (TValue)Convert.ChangeType(x1 & y1, typeof(TValue)); + } + else + { + throw new InvalidCastException(string.Format("Unable to cast values to type: {0}", type), new NotImplementedException(string.Format("Type: {0} has not been implemented", type))); + } + #endregion + } + + internal static TValue bitwise_or(TValue x, TValue y) + { + return bitwise_or(new EnumNameValuePair<TValue>("",x), new EnumNameValuePair<TValue>("",y)); + } + internal static TValue bitwise_or(params EnumNameValuePair<TValue>[] values) + { + if (!(values.Length > 1 )) { throw new InvalidOperationException("bitwise_or must have at least two operands"); } + TValue value = default(TValue); + foreach (EnumNameValuePair<TValue> v in values) { value = bitwise_or(value, v.Value); } + return value; + } + + internal static TValue bitwise_and(TValue x, TValue y) + { + return bitwise_and(new EnumNameValuePair<TValue>("", x), new EnumNameValuePair<TValue>("", y)); + } + internal static TValue bitwise_and(params EnumNameValuePair<TValue>[] values) + { + if (!(values.Length > 1)) { throw new InvalidOperationException("bitwise_and must have at least two operands"); } + TValue value = default(TValue); + foreach (EnumNameValuePair<TValue> v in values) { value = bitwise_and(value, v.Value); } + return value; + } } } |