File: Base\System\IO\Packaging\CompoundFile\VersionPair.cs
Project: wpf\src\WindowsBase.csproj (WindowsBase)
//-----------------------------------------------------------------------------
//
// <copyright file="VersionPair.cs" company="Microsoft">
//    Copyright (C) Microsoft Corporation.  All rights reserved.
// </copyright>
//
// Description:
//  A major, minor version number pair.
//
// History:
//  06/20/2002: Microsoft:  Created
//  05/30/2003: LGolding: Ported to WCP tree. Split out from FormatVersion.cs.
//  02/16/2005: Microsoft:  Changed Class name to VersionPair from VersionTuple
//
//-----------------------------------------------------------------------------
 
// Allow use of presharp warning numbers [6506] unknown to the compiler
#pragma warning disable 1634, 1691
 
using System;
using System.Globalization;
 
#if PBTCOMPILER
using MS.Utility;     // For SR.cs
#else
using System.Windows;
using System.Text;
using MS.Internal.WindowsBase; // FriendAccessAllowed
#endif
 
namespace MS.Internal.IO.Packaging.CompoundFile
{
    ///<summary>Class for a version pair which consists of major and minor numbers</summary>
#if !PBTCOMPILER
    [FriendAccessAllowed]
    internal    class VersionPair : IComparable
#else
    internal  class VersionPair
#endif
    {
        //------------------------------------------------------
        //
        //  Internal Constructors
        //
        //------------------------------------------------------
 
        #region Constructors
 
        /// <summary>
        /// Constructor for VersionPair with given major and minor numbers.
        /// </summary>
        /// <param name="major">major part of version</param>
        /// <param name="minor">minor part of version</param>
        internal VersionPair(Int16 major, Int16 minor)
        {
            if (major < 0)
            {
                throw new ArgumentOutOfRangeException("major",
                            SR.Get(SRID.VersionNumberComponentNegative));
            }
 
            if (minor < 0)
            {
                throw new ArgumentOutOfRangeException("minor",
                            SR.Get(SRID.VersionNumberComponentNegative));
            }
 
            _major = major;
            _minor = minor;
        }
 
        #endregion Constructors
 
        //------------------------------------------------------
        //
        //  Internal Properties
        //
        //------------------------------------------------------
 
        #region Public Properties
 
        /// <summary>
        /// Major number of version
        /// </summary>
        public Int16 Major
        {
            get
            {
                return _major;
            }
        }
 
        /// <summary>
        /// Minor number of version
        /// </summary>
        public Int16 Minor
        {
            get
            {
                return _minor;
            }
        }
 
        #endregion Public Properties
 
        //------------------------------------------------------
        //
        //  Public Methods
        //
        //------------------------------------------------------        
 
        #region Public methods
 
#if !PBTCOMPILER
        /// <summary>
        /// Returns a string that represents the current VersionPair object.
        /// The string is of the form (major,minor).
        /// </summary>
        public override string ToString()
        {
            StringBuilder stringFormBuilder = new StringBuilder("(");
            stringFormBuilder.Append(_major);
            stringFormBuilder.Append(",");
            stringFormBuilder.Append(_minor);
            stringFormBuilder.Append(")");
            
            return stringFormBuilder.ToString();
        }
#endif
 
        #endregion
 
        #region Operators
 
        /// <summary>
        /// == comparison operator
        /// </summary>
        /// <param name="v1">version to be compared</param>
        /// <param name="v2">version to be compared</param>
        public static bool operator ==(VersionPair v1, VersionPair v2)
        {
            bool result = false;
 
            // If both v1 & v2 are null they are same
            if ((Object) v1 == null && (Object) v2 == null)
            {
                result = true;
            }
            // Do comparison only if both v1 and v2 are not null
            else if ((Object) v1 != null && (Object) v2 != null)
            {
                if (v1.Major == v2.Major && v1.Minor == v2.Minor)
                {
                    result = true;
                }
            }
 
            return result;
        }
 
        /// <summary>
        /// != comparison operator
        /// </summary>
        /// <param name="v1">version to be compared</param>
        /// <param name="v2">version to be compared</param>
        public static bool operator !=(VersionPair v1, VersionPair v2)
        {
            // == is previously define so it can be used
            return !(v1 == v2);
        }
 
#if !PBTCOMPILER
        /// <summary>
        /// "less than" comparison operator
        /// </summary>
        /// <param name="v1">version to be compared</param>
        /// <param name="v2">version to be compared</param>
        public static bool operator <(VersionPair v1, VersionPair v2)
        {
            bool result = false;
 
            if ((Object) v1 == null && (Object) v2 != null)
            {
                result = true;
            }
            else if ((Object) v1 != null && (object) v2 != null)
            {
                // == is previously define so it can be used
                if (v1.Major < v2.Major || ((v1.Major == v2.Major) && (v1.Minor < v2.Minor)))
                {
                    result = true;
                }
            }
 
            return result;
        }
 
        /// <summary>
        /// "greater than" comparison operator
        /// </summary>
        /// <param name="v1">version to be compared</param>
        /// <param name="v2">version to be compared</param>
        public static bool operator >(VersionPair v1, VersionPair v2)
        {
            bool result = false;
 
            if ((Object) v1 != null && (Object) v2 == null)
            {
                result = true;
            }
            // Comare only if neither v1 nor v2 are not null
            else if ((Object) v1 != null && (object) v2 != null)
            {
                // < and == are previously define so it can be used
                if (!(v1 < v2) && v1 != v2)
                {
                    return true;
                }
            }
                
            return result;
        }
 
        /// <summary>
        /// "less than or equal" comparison operator
        /// </summary>
        /// <param name="v1">version to be compared</param>
        /// <param name="v2">version to be compared</param>
        public static bool operator <=(VersionPair v1, VersionPair v2)
        {
            if (!(v1 > v2))
            {
                return true;
            }
 
            return false;
        }
 
        /// <summary>
        /// "greater than or equal" comparison operator
        /// </summary>
        /// <param name="v1">version to be compared</param>
        /// <param name="v2">version to be compared</param>
        public static bool operator >=(VersionPair v1, VersionPair v2)
        {
            if (!(v1 < v2))
            {
                return true;
            }
 
            return false;
        }
#endif
 
        /// <summary>
        /// Eaual comparison operator
        /// </summary>
        /// <param name="obj">Object to compare</param>
        /// <returns>true if the object is equal to this instance</returns>
        public override bool Equals(Object obj)
        {
            if (obj == null)
            {
                return false;
            }
 
            if (obj.GetType() != GetType())
            {
                return false;
            }
 
            VersionPair v = (VersionPair) obj;
 
            //PRESHARP:Parameter to this public method must be validated:  A null-dereference can occur here. 
            //    Parameter 'v' to this public method must be validated:  A null-dereference can occur here. 
            //This is a false positive as the checks above can gurantee no null dereference will occur  
#pragma warning disable 6506
            if (this != v)
            {
                return false;
            }
#pragma warning restore 6506
 
            return true;
        }
 
        /// <summary>
        /// Hash code
        /// </summary>
        public override int GetHashCode()
        {
            return (_major << 16 + _minor);
        }
 
#if !PBTCOMPILER
        /// <summary>
        /// Compare this instance to the object
        /// </summary>
        /// <param name="obj">Object to compare</param>
        /// <returns>Less than 0 - This instance is less than obj
        /// Zero - This instance is equal to obj
        /// Greater than 0 - This instance is greater than obj</returns>
        public int CompareTo(Object obj)
        {
            if (obj == null)
            {
                return 1;
            }
 
            if (obj.GetType() != GetType())
            {
                throw new ArgumentException(SR.Get(SRID.ExpectedVersionPairObject));
            }
 
            VersionPair v = (VersionPair) obj;
 
            //PRESHARP:Parameter to this public method must be validated:  A null-dereference can occur here. 
            //    Parameter 'v' to this public method must be validated:  A null-dereference can occur here. 
            //This is a false positive as the checks above can gurantee no null dereference will occur  
#pragma warning disable 6506
            if (this.Equals(obj))   // equal
            {
                return 0;
            }
            // less than
            else if (this < v)
            {
                return -1;
            }
#pragma warning restore 6506
            // greater than
            return 1;
        }
#endif
 
        #endregion Operators
 
        //------------------------------------------------------
        //
        //  Public Events
        //
        //------------------------------------------------------
        // None
        //------------------------------------------------------
        //
        //  Internal Constructors
        //
        //------------------------------------------------------
        // None       
        //------------------------------------------------------
        //
        //  Internal Properties
        //
        //------------------------------------------------------
        // None       
        //------------------------------------------------------
        //
        //  Internal Methods
        //
        //------------------------------------------------------
        // None       
        //------------------------------------------------------
        //
        //  Internal Events
        //
        //------------------------------------------------------
        // None
        //------------------------------------------------------
        //
        //  Private Methods
        //
        //------------------------------------------------------
        // None
        //------------------------------------------------------
        //
        //  Private Fields
        //
        //------------------------------------------------------
 
        #region Member Variables
 
        private Int16 _major;             // Major number
        private Int16 _minor;             // Minor number
        
        #endregion Member Variables
 
    }
}