CONSTVAL
using System;
using System.Globalization;
namespace Microsoft.CSharp.RuntimeBinder.Semantics
{
internal sealed class CONSTVAL
{
private object _value;
public object objectVal {
get {
return _value;
}
set {
_value = value;
}
}
public bool boolVal {
get {
return SpecialUnbox<bool>(_value);
}
set {
_value = SpecialBox(value);
}
}
public sbyte sbyteVal => SpecialUnbox<sbyte>(_value);
public byte byteVal => SpecialUnbox<byte>(_value);
public short shortVal => SpecialUnbox<short>(_value);
public ushort ushortVal => SpecialUnbox<ushort>(_value);
public int iVal {
get {
return SpecialUnbox<int>(_value);
}
set {
_value = SpecialBox(value);
}
}
public uint uiVal {
get {
return SpecialUnbox<uint>(_value);
}
set {
_value = SpecialBox(value);
}
}
public long longVal {
get {
return SpecialUnbox<long>(_value);
}
set {
_value = SpecialBox(value);
}
}
public ulong ulongVal {
get {
return SpecialUnbox<ulong>(_value);
}
set {
_value = SpecialBox(value);
}
}
public float floatVal {
get {
return SpecialUnbox<float>(_value);
}
set {
_value = SpecialBox(value);
}
}
public double doubleVal {
get {
return SpecialUnbox<double>(_value);
}
set {
_value = SpecialBox(value);
}
}
public decimal decVal {
get {
return SpecialUnbox<decimal>(_value);
}
set {
_value = SpecialBox(value);
}
}
public char cVal => SpecialUnbox<char>(_value);
public string strVal {
get {
return SpecialUnbox<string>(_value);
}
set {
_value = SpecialBox(value);
}
}
internal CONSTVAL()
: this(null)
{
}
internal CONSTVAL(object value)
{
_value = value;
}
public bool IsNullRef()
{
return _value == null;
}
public bool IsZero(ConstValKind kind)
{
switch (kind) {
case ConstValKind.Decimal:
return decVal == decimal.Zero;
case ConstValKind.String:
return false;
default:
return IsDefault(_value);
}
}
private T SpecialUnbox<T>(object o)
{
if (IsDefault(o))
return default(T);
return (T)Convert.ChangeType(o, typeof(T), CultureInfo.InvariantCulture);
}
private object SpecialBox<T>(T x)
{
return x;
}
private bool IsDefault(object o)
{
if (o != null) {
switch (o.GetType().GetTypeCode()) {
case TypeCode.Boolean:
return false.Equals(o);
case TypeCode.SByte:
return ((sbyte)0).Equals(o);
case TypeCode.Byte:
return ((byte)0).Equals(o);
case TypeCode.Int16:
return ((short)0).Equals(o);
case TypeCode.UInt16:
return ((ushort)0).Equals(o);
case TypeCode.Int32:
return 0.Equals(o);
case TypeCode.UInt32:
return 0.Equals(o);
case TypeCode.Int64:
return 0.Equals(o);
case TypeCode.UInt64:
return 0.Equals(o);
case TypeCode.Single:
return 0.Equals(o);
case TypeCode.Double:
return 0.Equals(o);
case TypeCode.Decimal:
return decimal.Zero.Equals(o);
case TypeCode.Char:
return ' '.Equals(o);
default:
return false;
}
}
return true;
}
}
}