The Labs \ Source Viewer \ SSCLI \ System \ Version

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. /*============================================================
  16. **
  17. ** File:    Version
  18. **
  19. **
  20. ** Purpose:
  21. **
  22. **
  23. ===========================================================*/
  24. namespace System
  25. {
  26.    
  27.     using CultureInfo = System.Globalization.CultureInfo;
  28.    
  29.     // A Version object contains four hierarchical numeric components: major, minor,
  30.     // build and revision. Build and revision may be unspecified, which is represented
  31.     // internally as a -1. By definition, an unspecified component matches anything
  32.     // (both unspecified and specified), and an unspecified component is "less than" any
  33.     // specified component.
  34.    
  35.     [Serializable()]
  36.     [System.Runtime.InteropServices.ComVisible(true)]
  37.     public sealed class Version : ICloneable, IComparable, IComparable<Version>, IEquatable<Version>
  38.     {
  39.         // AssemblyName depends on the order staying the same
  40.         private int _Major;
  41.         private int _Minor;
  42.         private int _Build = -1;
  43.         private int _Revision = -1;
  44.        
  45.         public Version(int major, int minor, int build, int revision)
  46.         {
  47.             if (major < 0)
  48.                 throw new ArgumentOutOfRangeException("major", Environment.GetResourceString("ArgumentOutOfRange_Version"));
  49.            
  50.             if (minor < 0)
  51.                 throw new ArgumentOutOfRangeException("minor", Environment.GetResourceString("ArgumentOutOfRange_Version"));
  52.            
  53.             if (build < 0)
  54.                 throw new ArgumentOutOfRangeException("build", Environment.GetResourceString("ArgumentOutOfRange_Version"));
  55.            
  56.             if (revision < 0)
  57.                 throw new ArgumentOutOfRangeException("revision", Environment.GetResourceString("ArgumentOutOfRange_Version"));
  58.            
  59.             _Major = major;
  60.             _Minor = minor;
  61.             _Build = build;
  62.             _Revision = revision;
  63.         }
  64.        
  65.         public Version(int major, int minor, int build)
  66.         {
  67.             if (major < 0)
  68.                 throw new ArgumentOutOfRangeException("major", Environment.GetResourceString("ArgumentOutOfRange_Version"));
  69.            
  70.             if (minor < 0)
  71.                 throw new ArgumentOutOfRangeException("minor", Environment.GetResourceString("ArgumentOutOfRange_Version"));
  72.            
  73.             if (build < 0)
  74.                 throw new ArgumentOutOfRangeException("build", Environment.GetResourceString("ArgumentOutOfRange_Version"));
  75.            
  76.            
  77.             _Major = major;
  78.             _Minor = minor;
  79.             _Build = build;
  80.         }
  81.        
  82.         public Version(int major, int minor)
  83.         {
  84.             if (major < 0)
  85.                 throw new ArgumentOutOfRangeException("major", Environment.GetResourceString("ArgumentOutOfRange_Version"));
  86.            
  87.             if (minor < 0)
  88.                 throw new ArgumentOutOfRangeException("minor", Environment.GetResourceString("ArgumentOutOfRange_Version"));
  89.            
  90.             _Major = major;
  91.             _Minor = minor;
  92.         }
  93.        
  94.         public Version(string version)
  95.         {
  96.             if ((object)version == null)
  97.                 throw new ArgumentNullException("version");
  98.            
  99.             string[] parsedComponents = version.Split(new char[] {'.'});
  100.             int parsedComponentsLength = parsedComponents.Length;
  101.             if ((parsedComponentsLength < 2) || (parsedComponentsLength > 4))
  102.                 throw new ArgumentException(Environment.GetResourceString("Arg_VersionString"));
  103.             _Major = Int32.Parse(parsedComponents[0], CultureInfo.InvariantCulture);
  104.             if (_Major < 0)
  105.                 throw new ArgumentOutOfRangeException("version", Environment.GetResourceString("ArgumentOutOfRange_Version"));
  106.            
  107.             _Minor = Int32.Parse(parsedComponents[1], CultureInfo.InvariantCulture);
  108.             if (_Minor < 0)
  109.                 throw new ArgumentOutOfRangeException("version", Environment.GetResourceString("ArgumentOutOfRange_Version"));
  110.            
  111.             parsedComponentsLength -= 2;
  112.             if (parsedComponentsLength > 0) {
  113.                 _Build = Int32.Parse(parsedComponents[2], CultureInfo.InvariantCulture);
  114.                 if (_Build < 0)
  115.                     throw new ArgumentOutOfRangeException("build", Environment.GetResourceString("ArgumentOutOfRange_Version"));
  116.                
  117.                 parsedComponentsLength--;
  118.                 if (parsedComponentsLength > 0) {
  119.                     _Revision = Int32.Parse(parsedComponents[3], CultureInfo.InvariantCulture);
  120.                     if (_Revision < 0)
  121.                         throw new ArgumentOutOfRangeException("revision", Environment.GetResourceString("ArgumentOutOfRange_Version"));
  122.                 }
  123.             }
  124.         }
  125.        
  126.         public Version()
  127.         {
  128.             _Major = 0;
  129.             _Minor = 0;
  130.         }
  131.        
  132.         // Properties for setting and getting version numbers
  133.         public int Major {
  134.             get { return _Major; }
  135.         }
  136.        
  137.         public int Minor {
  138.             get { return _Minor; }
  139.         }
  140.        
  141.         public int Build {
  142.             get { return _Build; }
  143.         }
  144.        
  145.         public int Revision {
  146.             get { return _Revision; }
  147.         }
  148.        
  149.         public short MajorRevision {
  150.             get { return (short)(_Revision >> 16); }
  151.         }
  152.        
  153.         public short MinorRevision {
  154.             get { return (short)(_Revision & 65535); }
  155.         }
  156.        
  157.         public object Clone()
  158.         {
  159.             Version v = new Version();
  160.             v._Major = _Major;
  161.             v._Minor = _Minor;
  162.             v._Build = _Build;
  163.             v._Revision = _Revision;
  164.             return (v);
  165.         }
  166.        
  167.         public int CompareTo(object version)
  168.         {
  169.             if (version == null)
  170.                 return 1;
  171.            
  172.             Version v = version as Version;
  173.             if (v == null)
  174.                 throw new ArgumentException(Environment.GetResourceString("Arg_MustBeVersion"));
  175.            
  176.             if (this._Major != v._Major)
  177.                 if (this._Major > v._Major)
  178.                     return 1;
  179.                 else
  180.                     return -1;
  181.            
  182.             if (this._Minor != v._Minor)
  183.                 if (this._Minor > v._Minor)
  184.                     return 1;
  185.                 else
  186.                     return -1;
  187.            
  188.             if (this._Build != v._Build)
  189.                 if (this._Build > v._Build)
  190.                     return 1;
  191.                 else
  192.                     return -1;
  193.            
  194.             if (this._Revision != v._Revision)
  195.                 if (this._Revision > v._Revision)
  196.                     return 1;
  197.                 else
  198.                     return -1;
  199.            
  200.             return 0;
  201.         }
  202.        
  203.         public int CompareTo(Version value)
  204.         {
  205.             if (value == null)
  206.                 return 1;
  207.            
  208.             if (this._Major != value._Major)
  209.                 if (this._Major > value._Major)
  210.                     return 1;
  211.                 else
  212.                     return -1;
  213.            
  214.             if (this._Minor != value._Minor)
  215.                 if (this._Minor > value._Minor)
  216.                     return 1;
  217.                 else
  218.                     return -1;
  219.            
  220.             if (this._Build != value._Build)
  221.                 if (this._Build > value._Build)
  222.                     return 1;
  223.                 else
  224.                     return -1;
  225.            
  226.             if (this._Revision != value._Revision)
  227.                 if (this._Revision > value._Revision)
  228.                     return 1;
  229.                 else
  230.                     return -1;
  231.            
  232.             return 0;
  233.         }
  234.        
  235.         public override bool Equals(object obj)
  236.         {
  237.             Version v = obj as Version;
  238.             if (v == null)
  239.                 return false;
  240.            
  241.             // check that major, minor, build & revision numbers match
  242.             if ((this._Major != v._Major) || (this._Minor != v._Minor) || (this._Build != v._Build) || (this._Revision != v._Revision))
  243.                 return false;
  244.            
  245.             return true;
  246.         }
  247.        
  248.         public bool Equals(Version obj)
  249.         {
  250.             if (obj == null)
  251.                 return false;
  252.            
  253.             // check that major, minor, build & revision numbers match
  254.             if ((this._Major != obj._Major) || (this._Minor != obj._Minor) || (this._Build != obj._Build) || (this._Revision != obj._Revision))
  255.                 return false;
  256.            
  257.             return true;
  258.         }
  259.        
  260.         public override int GetHashCode()
  261.         {
  262.             // Let's assume that most version numbers will be pretty small and just
  263.             // OR some lower order bits together.
  264.            
  265.             int accumulator = 0;
  266.            
  267.             accumulator |= (this._Major & 15) << 28;
  268.             accumulator |= (this._Minor & 255) << 20;
  269.             accumulator |= (this._Build & 255) << 12;
  270.             accumulator |= (this._Revision & 4095);
  271.            
  272.             return accumulator;
  273.         }
  274.        
  275.         public override string ToString()
  276.         {
  277.             if (_Build == -1)
  278.                 return (ToString(2));
  279.             if (_Revision == -1)
  280.                 return (ToString(3));
  281.             return (ToString(4));
  282.         }
  283.        
  284.         public string ToString(int fieldCount)
  285.         {
  286.             switch (fieldCount) {
  287.                 case 0:
  288.                     return (String.Empty);
  289.                 case 1:
  290.                     return (String.Concat(_Major));
  291.                 case 2:
  292.                     return (String.Concat(_Major, ".", _Minor));
  293.                 default:
  294.                     if (_Build == -1)
  295.                         throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("ArgumentOutOfRange_Bounds_Lower_Upper"), "0", "2"), "fieldCount");
  296.                     if (fieldCount == 3)
  297.                         return (_Major + "." + _Minor + "." + _Build);
  298.                    
  299.                     if (_Revision == -1)
  300.                         throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("ArgumentOutOfRange_Bounds_Lower_Upper"), "0", "3"), "fieldCount");
  301.                    
  302.                     if (fieldCount == 4)
  303.                         return (Major + "." + _Minor + "." + _Build + "." + _Revision);
  304.                    
  305.                     throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("ArgumentOutOfRange_Bounds_Lower_Upper"), "0", "4"), "fieldCount");
  306.                     break;
  307.             }
  308.         }
  309.        
  310.         public static bool operator ==(Version v1, Version v2)
  311.         {
  312.             if (Object.ReferenceEquals(v1, null)) {
  313.                 return Object.ReferenceEquals(v2, null);
  314.             }
  315.            
  316.             return v1.Equals(v2);
  317.         }
  318.        
  319.         public static bool operator !=(Version v1, Version v2)
  320.         {
  321.             return !(v1 == v2);
  322.         }
  323.        
  324.         public static bool operator <(Version v1, Version v2)
  325.         {
  326.             if ((object)v1 == null)
  327.                 throw new ArgumentNullException("v1");
  328.             return (v1.CompareTo(v2) < 0);
  329.         }
  330.        
  331.         public static bool operator <=(Version v1, Version v2)
  332.         {
  333.             if ((object)v1 == null)
  334.                 throw new ArgumentNullException("v1");
  335.             return (v1.CompareTo(v2) <= 0);
  336.         }
  337.        
  338.         public static bool operator >(Version v1, Version v2)
  339.         {
  340.             return (v2 < v1);
  341.         }
  342.        
  343.         public static bool operator >=(Version v1, Version v2)
  344.         {
  345.             return (v2 <= v1);
  346.         }
  347.     }
  348. }

Developer Fusion