using System; using System.Collections.Generic; using System.Text.RegularExpressions; namespace Wayne.Lib { /// /// Class representing a version number. /// public class VersionNumber : IComparable, IEquatable { #region Fields private const char Dot = '.'; private static readonly Regex re = new Regex(@"^\d+(\.\d+)*$"); private readonly string versionString; #endregion #region Construction /// /// Constructor /// /// Version string that is on a proper version number format. /// If versionString is not on correct Version number format. public VersionNumber(string versionString) { if (!re.IsMatch(versionString)) { throw new ArgumentException(versionString + " is not a valid version string"); } this.versionString = versionString; } #endregion #region Methods /// /// CompareTo method /// /// /// public int CompareTo(VersionNumber other) { Stack ps = Convert(this.ToString()); Stack qs = Convert(other.ToString()); // Continue while they are equal while (ps.Count > 0 && qs.Count > 0) { int p = ps.Pop(); int q = qs.Pop(); if (p < q) { return -1; } if (p > q) { return 1; } } // Check who ran out if (ps.Count == 0 && qs.Count == 0) { // both ran out, they are equal return 0; } if (ps.Count > 0 && qs.Count == 0) { // right ran out, so left must be bigger return 1; } if (ps.Count == 0 && qs.Count > 0) { // left ran out, so right must be bigger return -1; } // Should never end up here... throw new ArgumentException("this cannot happen"); } private static Stack Convert(string fullString) { List list = new List(); foreach (string number in fullString.Split(Dot)) { list.Add(int.Parse(number)); } list.Reverse(); return new Stack(list); } /// /// ToString method /// /// public override string ToString() { return versionString; } /// /// Equals method /// /// /// public override bool Equals(object obj) { VersionNumber otherVersionNumber = obj as VersionNumber; if (otherVersionNumber != null) return this.Equals(otherVersionNumber); else return false; } /// /// Equals method /// /// /// public bool Equals(VersionNumber other) { return this.CompareTo(other) == 0; } /// /// Hash code generation /// /// public override int GetHashCode() { return versionString.GetHashCode(); } #endregion } }