// // OracleNumber.cs // // Part of the Mono class libraries at // mcs/class/System.Data.OracleClient/System.Data.OracleClient // // Assembly: System.Data.OracleClient.dll // Namespace: System.Data.OracleClient // // Author: Tim Coleman // // Copyright (C) Tim Coleman, 2003 // // Licensed under the MIT/X11 License. // using System; using System.Data.SqlTypes; namespace System.Data.OracleClient { public struct OracleNumber : IComparable, INullable { #region Fields public static readonly OracleNumber E = new OracleNumber (Math.E); public static readonly int MaxPrecision = 38; public static readonly int MaxScale = 127; public static readonly OracleNumber MaxValue; // FIXME public static readonly int MinScale = -84; public static readonly OracleNumber MinusOne = new OracleNumber (-1); public static readonly OracleNumber MinValue; // FIXME public static readonly OracleNumber Null = new OracleNumber (); public static readonly OracleNumber One = new OracleNumber (1); public static readonly OracleNumber PI = new OracleNumber (Math.PI); public static readonly OracleNumber Zero = new OracleNumber (0); decimal value; bool notNull; #endregion // Fields #region Constructors public OracleNumber (decimal decValue) { this.value = decValue; notNull = true; } public OracleNumber (double dblValue) : this ((decimal) dblValue) { } public OracleNumber (int intValue) : this ((decimal) intValue) { } public OracleNumber (long longValue) : this ((decimal) longValue) { } public OracleNumber (OracleNumber from) : this (from.Value) { } #endregion // Constructors #region Properties public bool IsNull { get { return !notNull; } } public decimal Value { get { if (IsNull) throw new InvalidOperationException ("The value is Null."); return value; } } #endregion // Properties #region Methods public static OracleNumber Abs (OracleNumber n) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Abs (n.Value)); } public static OracleNumber Acos (OracleNumber n) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Acos ((double) n)); } public static OracleNumber Add (OracleNumber x, OracleNumber y) { if (x.IsNull || y.IsNull) return OracleNumber.Null; return new OracleNumber (x.Value + y.Value); } public static OracleNumber Asin (OracleNumber n) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Asin ((double) n)); } public static OracleNumber Atan (OracleNumber n) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Atan ((double) n)); } public static OracleNumber Atan2 (OracleNumber y, OracleNumber x) { if (x.IsNull || y.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Atan2 ((double) y, (double) x)); } public static OracleNumber Ceiling (OracleNumber n) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Ceiling ((double) n)); } [MonoTODO] public int CompareTo (object obj) { throw new NotImplementedException (); } public static OracleNumber Cos (OracleNumber n) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Cos ((double) n)); } public static OracleNumber Cosh (OracleNumber n) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Cosh ((double) n)); } public static OracleNumber Divide (OracleNumber x, OracleNumber y) { if (x.IsNull || y.IsNull) return OracleNumber.Null; return new OracleNumber (x.Value / y.Value); } [MonoTODO] public override bool Equals (object value) { throw new NotImplementedException (); } public static OracleBoolean Equals (OracleNumber x, OracleNumber y) { if (x.IsNull || y.IsNull) return OracleBoolean.Null; return new OracleBoolean (x.Value == y.Value); } public static OracleNumber Exp (OracleNumber p) { if (p.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Exp ((double) p)); } public static OracleNumber Floor (OracleNumber n) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Decimal.Floor (n.Value)); } [MonoTODO] public override int GetHashCode () { throw new NotImplementedException (); } public static OracleBoolean GreaterThan (OracleNumber x, OracleNumber y) { if (x.IsNull || y.IsNull) return OracleBoolean.Null; return new OracleBoolean (x.Value > y.Value); } public static OracleBoolean GreaterThanOrEqual (OracleNumber x, OracleNumber y) { if (x.IsNull || y.IsNull) return OracleBoolean.Null; return new OracleBoolean (x.Value >= y.Value); } public static OracleBoolean LessThan (OracleNumber x, OracleNumber y) { if (x.IsNull || y.IsNull) return OracleBoolean.Null; return new OracleBoolean (x.Value < y.Value); } public static OracleBoolean LessThanOrEqual (OracleNumber x, OracleNumber y) { if (x.IsNull || y.IsNull) return OracleBoolean.Null; return new OracleBoolean (x.Value <= y.Value); } public static OracleNumber Log (OracleNumber n) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Log ((double) n)); } public static OracleNumber Log (OracleNumber n, int newBase) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Log ((double) n, (double) newBase)); } public static OracleNumber Log (OracleNumber n, OracleNumber newBase) { if (n.IsNull || newBase.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Log ((double) n, (double) newBase)); } public static OracleNumber Log10 (OracleNumber n) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Log10 ((double) n)); } public static OracleNumber Max (OracleNumber x, OracleNumber y) { if (x.IsNull || y.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Max (x.Value, y.Value)); } public static OracleNumber Min (OracleNumber x, OracleNumber y) { if (x.IsNull || y.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Min (x.Value, y.Value)); } public static OracleNumber Modulo (OracleNumber x, OracleNumber y) { if (x.IsNull || y.IsNull) return OracleNumber.Null; return new OracleNumber (x.Value % y.Value); } public static OracleNumber Multiply (OracleNumber x, OracleNumber y) { if (x.IsNull || y.IsNull) return OracleNumber.Null; return new OracleNumber (x.Value * y.Value); } public static OracleNumber Negate (OracleNumber x) { if (x.IsNull) return OracleNumber.Null; return new OracleNumber (-x.Value); } public static OracleBoolean NotEquals (OracleNumber x, OracleNumber y) { if (x.IsNull || y.IsNull) return OracleBoolean.Null; return new OracleBoolean (x.Value != y.Value); } public static OracleNumber Parse (string s) { return new OracleNumber (Decimal.Parse (s)); } public static OracleNumber Pow (OracleNumber x, int y) { if (x.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Pow ((double) x, (double) y)); } public static OracleNumber Pow (OracleNumber x, OracleNumber y) { if (x.IsNull || y.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Pow ((double) x, (double) y)); } public static OracleNumber Round (OracleNumber n, int position) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Round (n.Value, position)); } public static OracleNumber Shift (OracleNumber n, int digits) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (n * (OracleNumber) (Math.Pow (10, digits))); } public static OracleNumber Sign (OracleNumber n) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Sign (n.Value)); } public static OracleNumber Sin (OracleNumber n) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Sin ((double) n)); } public static OracleNumber Sinh (OracleNumber n) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Sinh ((double) n)); } public static OracleNumber Sqrt (OracleNumber n) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Sqrt ((double) n)); } public static OracleNumber Subtract (OracleNumber x, OracleNumber y) { if (x.IsNull || y.IsNull) return OracleNumber.Null; return new OracleNumber (x.Value - y.Value); } public static OracleNumber Tan (OracleNumber n) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Tan ((double) n)); } public static OracleNumber Tanh (OracleNumber n) { if (n.IsNull) return OracleNumber.Null; return new OracleNumber (Math.Tanh ((double) n)); } public override string ToString () { return ToString(null); } [MonoTODO] public static OracleNumber Truncate (OracleNumber n, int position) { throw new NotImplementedException (); } #endregion // Methods #region Operators and Type Conversions public static OracleNumber operator + (OracleNumber x, OracleNumber y) { return Add (x, y); } public static OracleNumber operator / (OracleNumber x, OracleNumber y) { return Divide (x, y); } public static OracleBoolean operator == (OracleNumber x, OracleNumber y) { return Equals (x, y); } public static OracleBoolean operator > (OracleNumber x, OracleNumber y) { return GreaterThan (x, y); } public static OracleBoolean operator >= (OracleNumber x, OracleNumber y) { return GreaterThanOrEqual (x, y); } public static OracleBoolean operator != (OracleNumber x, OracleNumber y) { return NotEquals (x, y); } public static OracleBoolean operator < (OracleNumber x, OracleNumber y) { return LessThan (x, y); } public static OracleBoolean operator <= (OracleNumber x, OracleNumber y) { return LessThanOrEqual (x, y); } public static OracleNumber operator % (OracleNumber x, OracleNumber y) { return Modulo (x, y); } public static OracleNumber operator * (OracleNumber x, OracleNumber y) { return Multiply (x, y); } public static OracleNumber operator - (OracleNumber x, OracleNumber y) { return Subtract (x, y); } public static OracleNumber operator - (OracleNumber x) { return Negate (x); } public static explicit operator OracleNumber (decimal x) { return new OracleNumber (x); } public static explicit operator OracleNumber (double x) { return new OracleNumber (x); } public static explicit operator OracleNumber (int x) { return new OracleNumber (x); } public static explicit operator OracleNumber (long x) { return new OracleNumber (x); } public static explicit operator double (OracleNumber x) { if (x.IsNull) throw new NullReferenceException (); return (double) x.Value; } public static explicit operator decimal (OracleNumber x) { if (x.IsNull) throw new NullReferenceException (); return x.Value; } public static explicit operator int (OracleNumber x) { if (x.IsNull) throw new NullReferenceException (); return (int) x.Value; } public static explicit operator long (OracleNumber x) { if (x.IsNull) throw new NullReferenceException (); return (long) x.Value; } public static explicit operator OracleNumber (string x) { return OracleNumber.Parse (x); } #endregion // Operators and Type Conversions #region internal IFormatProvider handling internal String ToString(IFormatProvider format) { if (IsNull) return "Null"; return Value.ToString (format); } #endregion } }