Fix
[mono.git] / mcs / class / corlib / System / Version.cs
1 //
2 // System.Version.cs
3 //
4 // Author:
5 //   Miguel de Icaza (miguel@ximian.com)
6 //
7 // (C) Ximian, Inc.  http://www.ximian.com
8 //
9
10 namespace System {
11
12         public class Version : ICloneable, IComparable {
13                 int major, minor, build, revision;
14
15                 const int MAXINT = int.MaxValue;
16                 
17                 public Version (string version)
18                 {
19                         int n;
20                         string [] vals = version.Split (new Char [] {'.'});
21                         
22                         n = vals.Length;
23                         if (n > 0)
24                                 major = int.Parse (vals [0]);
25                         if (n > 1)
26                                 minor = int.Parse (vals [1]);
27                         if (n > 2)
28                                 build = int.Parse (vals [2]);
29                         if (n > 3)
30                                 revision = int.Parse (vals [3]);
31                 }
32                 
33                 public Version (int major, int minor)
34                 {
35                         this.major = major;
36                         this.minor = minor;
37                         this.build = MAXINT;
38                         this.revision = MAXINT;
39                 }
40
41                 public Version (int major, int minor, int build)
42                 {
43                         this.major = major;
44                         this.minor = minor;
45                         this.build = build;
46                         this.revision = MAXINT;
47                 }
48
49                 public Version (int major, int minor, int build, int revision)
50                 {
51                         this.major = major;
52                         this.minor = minor;
53                         this.build = build;
54                         this.revision = revision;
55                 }
56
57                 public int Build {
58                         get {
59                                 return build;
60                         }
61                 }
62
63                 public int Major {
64                         get {
65                                 return major;
66                         }
67                 }
68
69                 public int Minor {
70                         get {
71                                 return minor;
72                         }
73                 }
74
75                 public int Revision {
76                         get {
77                                 return revision;
78                         }
79                 }
80
81                 public object Clone ()
82                 {
83                         return new Version (major, minor, build, revision);
84                 }
85
86                 public int CompareTo (object version)
87                 {
88                         Version v;
89                         
90                         if (version == null)
91                                 throw new ArgumentNullException ("version");
92                         if (! (version is Version))
93                                 throw new ArgumentException ("version");
94
95                         v = version as Version;
96
97                         if (this.major > v.major)
98                                 return 1;
99                         else if (this.major < v.major)
100                                 return -1;
101
102                         if (this.minor > v.minor)
103                                 return 1;
104                         else if (this.minor < this.minor)
105                                 return -1;
106
107                         if (this.build > v.build)
108                                 return 1;
109                         else if (this.build < this.build)
110                                 return -1;
111
112                         // FIXME: Compare revision or build first?
113                         if (this.revision > v.revision)
114                                 return 1;
115                         else if (this.revision < v.revision)
116                                 return -1;
117
118                         return 0;
119                 }
120
121                 public override bool Equals (object obj)
122                 {
123                         Version x;
124                         
125                         if (obj == null)
126                                 throw new ArgumentNullException ("obj");
127                         if (!(obj is Version))
128                                 return false;
129
130                         x = (Version) obj;
131                         
132                         if ((x.major == major) &&
133                             (x.minor == minor) &&
134                             (x.build == build) &&
135                             (x.revision == revision))
136                                 return true;
137                         return false;
138                 }
139
140                 public override int GetHashCode ()
141                 {
142                         return (revision << 24) | (build << 16) | (minor << 8) | major;
143                 }
144
145                 // <summary>
146                 //   Returns a stringified representation of the version, format:
147                 //   major.minor[.build[.revision]]
148                 // </summary>
149                 public override string ToString ()
150                 {
151                         string mm = major.ToString () + "." + minor.ToString ();
152                         
153                         if (build != MAXINT)
154                                 mm = mm + "." + build.ToString ();
155                         if (revision != MAXINT)
156                                 mm = mm + "." + revision.ToString ();
157
158                         return mm;
159                 }
160
161                 // <summary>
162                 //    LAME: This API is lame, since there is no way of knowing
163                 //    how many fields a Version object has, it is unfair to throw
164                 //    an ArgumentException, but this is what the spec claims.
165                 //
166                 //    ie, Version a = new Version (1, 2);  a.ToString (3) should
167                 //    throw the expcetion.
168                 // </summary>
169                 public string ToString (int fields)
170                 {
171                         if (fields == 0)
172                                 return "";
173                         if (fields == 1)
174                                 return major.ToString ();
175                         if (fields == 2)
176                                 return major.ToString () + "." + minor.ToString ();
177                         if (fields == 3){
178                                 if (build == MAXINT)
179                                         throw new ArgumentException ("fields is larger than the number of components defined in this instance");
180                                 return major.ToString () + "." + minor.ToString () + "." +
181                                         build.ToString ();
182                         }
183                         if (fields == 4){
184                                 if (build == MAXINT || revision == MAXINT)
185                                         throw new ArgumentException ("fields is larger than the number of components defined in this instance");
186                                 return major.ToString () + "." + minor.ToString () + "." +
187                                         build.ToString () + "." + revision.ToString ();
188                         }
189                         throw new ArgumentException ("Invalid fields parameter: " + fields.ToString()); 
190                 }
191         }
192 }
193
194
195