lambda computing GmbH
tel +49.(0)69.66563134
fax +49.(0)69.66563135


 

 
// Copyright (c) 2004, Rüdiger Klaehn
// All rights reserved.
//
namespace Lambda.Generic.Arithmetic
{
    #region Unsigned Wrapper
    public struct Unsigned<T, O>
        where O : IUnsignedMath<T>, new()
    {
        private static O o = new O();
        private readonly T value;
        public Unsigned(T a)
        {
            value = a;
        }
        public static explicit operator Unsigned<T, O>(ulong a)
        {
            return o.ConvertFrom(a);
        }
        public static implicit operator Unsigned<T, O>(T a)
        {
            return new Unsigned<T, O>(a);
        }
        public static implicit operator T(Unsigned<T, O> a)
        {
            return a.value;
        }
        public static Unsigned<T, O> operator +(Unsigned<T, O> a, Unsigned<T, O> b)
        {
            return o.Add(a, b);
        }
        public static Unsigned<T, O> operator -(Unsigned<T, O> a, Unsigned<T, O> b)
        {
            return o.Subtract(a, b);
        }
        public static Unsigned<T, O> operator *(Unsigned<T, O> a, Unsigned<T, O> b)
        {
            return o.Multiply(a, b);
        }
        public static Unsigned<T, O> operator /(Unsigned<T, O> a, Unsigned<T, O> b)
        {
            return o.Divide(a, b);
        }
        public static Unsigned<T, O> Zero
        {
            get { return o.Zero; }
        }
        public static Unsigned<T, O> One
        {
            get { return o.One; }
        }
        public static bool operator ==(Unsigned<T, O> a, Unsigned<T, O> b)
        {
            return o.Equals(a, b);
        }
        public static bool operator !=(Unsigned<T, O> a, Unsigned<T, O> b)
        {
            return !o.Equals(a, b);
        }
        public static bool operator <=(Unsigned<T, O> a, Unsigned<T, O> b)
        {
            return o.Compare(a, b) <= 0;
        }
        public static bool operator >=(Unsigned<T, O> a, Unsigned<T, O> b)
        {
            return o.Compare(a, b) >= 0;
        }
        public static bool operator <(Unsigned<T, O> a, Unsigned<T, O> b)
        {
            return o.Compare(a, b) < 0;
        }
        public static bool operator >(Unsigned<T, O> a, Unsigned<T, O> b)
        {
            return o.Compare(a, b) > 0;
        }
        public override bool Equals(object a)
        {
            if (a is T)
                return o.Equals(value, (T)a);
            else
                return false;
        }
        public override int GetHashCode()
        {
            return o.GetHashCode(value);
        }
    }
    #endregion
    #region Signed Wrapper
    public struct Signed<T, O>
        where O : ISignedMath<T>, new()
    {
        private static O o = new O();
        private readonly T value;
        public Signed(T a)
        {
            value = a;
        }
        public static explicit operator Signed<T, O>(ulong a)
        {
            return o.ConvertFrom(a);
        }
        public static explicit operator Signed<T, O>(long a)
        {
            return o.ConvertFrom(a);
        }
        public static implicit operator Signed<T, O>(T a)
        {
            return new Signed<T, O>(a);
        }
        public static implicit operator T(Signed<T, O> a)
        {
            return a.value;
        }
        public static Signed<T, O> operator +(Signed<T, O> a, Signed<T, O> b)
        {
            return o.Add(a, b);
        }
        public static Signed<T, O> operator -(Signed<T, O> a, Signed<T, O> b)
        {
            return o.Subtract(a, b);
        }
        public static Signed<T, O> operator -(Signed<T, O> a)
        {
            return o.Negate(a);
        }
        public static Signed<T, O> operator *(Signed<T, O> a, Signed<T, O> b)
        {
            return o.Multiply(a, b);
        }
        public static Signed<T, O> operator /(Signed<T, O> a, Signed<T, O> b)
        {
            return o.Divide(a, b);
        }
        public static Signed<T, O> Zero
        {
            get { return o.Zero; }
        }
        public static Signed<T, O> One
        {
            get { return o.One; }
        }
        public static bool operator ==(Signed<T, O> a, Signed<T, O> b)
        {
            return o.Equals(a, b);
        }
        public static bool operator !=(Signed<T, O> a, Signed<T, O> b)
        {
            return !o.Equals(a, b);
        }
        public static bool operator <=(Signed<T, O> a, Signed<T, O> b)
        {
            return o.Compare(a, b) <= 0;
        }
        public static bool operator >=(Signed<T, O> a, Signed<T, O> b)
        {
            return o.Compare(a, b) >= 0;
        }
        public static bool operator <(Signed<T, O> a, Signed<T, O> b)
        {
            return o.Compare(a, b) < 0;
        }
        public static bool operator >(Signed<T, O> a, Signed<T, O> b)
        {
            return o.Compare(a, b) > 0;
        }
        public override bool Equals(object a)
        {
            if (a is T)
                return o.Equals(value, (T)a);
            else
                return false;
        }
        public override int GetHashCode()
        {
            return o.GetHashCode(value);
        }
    }
    #endregion
    #region Rational Wrapper
    public struct Rational<T, O>
        where O : IRationalMath<T>, new()
    {
        private static O o = new O();
        private readonly T value;
        public Rational(T a)
        {
            value = a;
        }
        public static implicit operator Rational<T, O>(T a)
        {
            return new Rational<T, O>(a);
        }
        public static implicit operator T(Rational<T, O> a)
        {
            return a.value;
        }
        public static explicit operator Rational<T, O>(ulong a)
        {
            return o.ConvertFrom(a);
        }
        public static explicit operator Rational<T, O>(long a)
        {
            return o.ConvertFrom(a);
        }
        public static explicit operator Rational<T, O>(double a)
        {
            return o.ConvertFrom(a);
        }
        public static Rational<T, O> operator +(Rational<T, O> a, Rational<T, O> b)
        {
            return o.Add(a, b);
        }
        public static Rational<T, O> operator -(Rational<T, O> a, Rational<T, O> b)
        {
            return o.Subtract(a, b);
        }
        public static Rational<T, O> operator -(Rational<T, O> a)
        {
            return o.Negate(a);
        }
        public static Rational<T, O> operator *(Rational<T, O> a, Rational<T, O> b)
        {
            return o.Multiply(a, b);
        }
        public static Rational<T, O> operator /(Rational<T, O> a, Rational<T, O> b)
        {
            return o.Divide(a, b);
        }
        public Rational<T, O> Invert
        {
            get { return o.Invert(value); }
        }
        public static Rational<T, O> Zero
        {
            get { return o.Zero; }
        }
        public static Rational<T, O> One
        {
            get { return o.One; }
        }
        public static bool operator ==(Rational<T, O> a, Rational<T, O> b)
        {
            return o.Equals(a, b);
        }
        public static bool operator !=(Rational<T, O> a, Rational<T, O> b)
        {
            return !o.Equals(a, b);
        }
        public static bool operator <=(Rational<T, O> a, Rational<T, O> b)
        {
            return o.Compare(a, b) <= 0;
        }
        public static bool operator >=(Rational<T, O> a, Rational<T, O> b)
        {
            return o.Compare(a, b) >= 0;
        }
        public static bool operator <(Rational<T, O> a, Rational<T, O> b)
        {
            return o.Compare(a, b) < 0;
        }
        public static bool operator >(Rational<T, O> a, Rational<T, O> b)
        {
            return o.Compare(a, b) > 0;
        }
        public override bool Equals(object a)
        {
            if (a is T)
                return o.Equals(value, (T)a);
            else
                return false;
        }
        public override int GetHashCode()
        {
            return o.GetHashCode(value);
        }
    }
    #endregion
}