// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
namespace System
{
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using Microsoft.Bartok.Runtime;
//|
public abstract class Enum : ValueType, IComparable, IFormattable
{
//|
public override bool Equals(Object obj)
{
Enum that = obj as Enum;
if (that == null || this.GetType() != obj.GetType())
return false;
return this.GetValue().Equals(that.GetValue());
}
//|
public override int GetHashCode()
{
return GetValue().GetHashCode();
}
// Compares this enum and the object.
// They have to be of the same type or a ArgumentException is thrown
// Returns 0 if equal, -1 if less than, or 1 greater then the target
//|
public int CompareTo(Object target)
{
return ((IComparable)GetValue()).CompareTo(target);
}
//|
public String ToString(String format)
{
return ((IFormattable)GetValue()).ToString(format);
}
public override String ToString()
{
return GetValue().ToString();
}
//
// IValue implementation
//
//|
[NoHeapAllocation]
public override TypeCode GetTypeCode()
{
StructuralType type = this.vtable.structuralView;
switch (type) {
case StructuralType.Int8:
return TypeCode.SByte;
case StructuralType.Int16:
return TypeCode.Int16;
case StructuralType.Int32:
return TypeCode.Int32;
case StructuralType.Int64:
return TypeCode.Int64;
case StructuralType.UInt8:
return TypeCode.Byte;
case StructuralType.UInt16:
return TypeCode.UInt16;
case StructuralType.UInt32:
return TypeCode.UInt32;
case StructuralType.UInt64:
return TypeCode.UInt64;
default:
VTable.NotReached("bad enum in InternalGetValue");
return TypeCode.Object;
}
}
private Object GetValue()
{
StructuralType type = this.vtable.structuralView;
Object result;
switch (type) {
case StructuralType.Int8:
result = (sbyte) (Object) this;
break;
case StructuralType.Int16:
result = (short) (Object) this;
break;
case StructuralType.Int32:
result = (int) (Object) this;
break;
case StructuralType.Int64:
result = (long) (Object) this;
break;
case StructuralType.UInt8:
result = (byte) (Object) this;
break;
case StructuralType.UInt16:
result = (ushort) (Object) this;
break;
case StructuralType.UInt32:
result = (uint) (Object) this;
break;
case StructuralType.UInt64:
result = (ulong) (Object) this;
break;
default:
VTable.NotReached("bad enum in InternalGetValue");
result = null;
break;
}
return result;
}
}
}