PageRenderTime 50ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/src/sys/dotnet/fan/sys/Version.cs

https://bitbucket.org/bedlaczech/fan-1.0
C# | 185 lines | 137 code | 26 blank | 22 comment | 32 complexity | af3cf225a80bc3a789c9e3b6141848c9 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. //
  2. // Copyright (c) 2006, Brian Frank and Andy Frank
  3. // Licensed under the Academic Free License version 3.0
  4. //
  5. // History:
  6. // 14 Jan 06 Andy Frank Creation
  7. //
  8. using System.Text;
  9. namespace Fan.Sys
  10. {
  11. /// <summary>
  12. /// Version.
  13. /// </summary>
  14. public sealed class Version : FanObj
  15. {
  16. //////////////////////////////////////////////////////////////////////////
  17. // Construction
  18. //////////////////////////////////////////////////////////////////////////
  19. public static Version fromStr(string s) { return fromStr(s, true); }
  20. public static Version fromStr(string s, bool check)
  21. {
  22. List segments = new List(Sys.IntType, 4);
  23. int seg = -1;
  24. bool valid = true;
  25. int len = s.Length;
  26. for (int i=0; i<len; ++i)
  27. {
  28. int c = s[i];
  29. if (c == '.')
  30. {
  31. if (seg < 0 || i+1>=len) { valid = false; break; }
  32. segments.add(Long.valueOf(seg));
  33. seg = -1;
  34. }
  35. else
  36. {
  37. if ('0' <= c && c <= '9')
  38. {
  39. if (seg < 0) seg = c-'0';
  40. else seg = seg*10 + (c-'0');
  41. }
  42. else
  43. {
  44. valid = false; break;
  45. }
  46. }
  47. }
  48. if (seg >= 0) segments.add(Long.valueOf(seg));
  49. if (!valid || segments.sz() == 0)
  50. {
  51. if (check)
  52. throw ParseErr.make("Version", s).val;
  53. else
  54. return null;
  55. }
  56. return new Version(segments);
  57. }
  58. public static Version make(List segments)
  59. {
  60. bool valid = segments.sz() > 0;
  61. for (int i=0; i<segments.sz(); i++)
  62. if (((Long)segments.get(i)).longValue() < 0) valid = false;
  63. if (!valid) throw ArgErr.make("Invalid Version: '" + segments + "'").val;
  64. return new Version(segments);
  65. }
  66. internal Version(List segments)
  67. {
  68. this.m_segments = segments.ro();
  69. }
  70. //////////////////////////////////////////////////////////////////////////
  71. // Identity
  72. //////////////////////////////////////////////////////////////////////////
  73. public override bool Equals(object obj)
  74. {
  75. if (obj is Version)
  76. return toStr() == ((Version)obj).toStr();
  77. else
  78. return false;
  79. }
  80. public override long compare(object obj)
  81. {
  82. Version that = (Version)obj;
  83. List a = this.m_segments;
  84. List b = that.m_segments;
  85. for (int i=0; i<a.sz() && i<b.sz(); i++)
  86. {
  87. long ai = (a.get(i) as Long).longValue();
  88. long bi = (b.get(i) as Long).longValue();
  89. if (ai < bi) return -1;
  90. if (ai > bi) return +1;
  91. }
  92. if (a.sz() < b.sz()) return -1;
  93. if (a.sz() > b.sz()) return +1;
  94. return 0;
  95. }
  96. public override int GetHashCode()
  97. {
  98. return toStr().GetHashCode();
  99. }
  100. public override long hash()
  101. {
  102. return FanStr.hash(toStr());
  103. }
  104. public override Type @typeof()
  105. {
  106. return Sys.VersionType;
  107. }
  108. public override string toStr()
  109. {
  110. if (m_str == null)
  111. {
  112. StringBuilder s = new StringBuilder();
  113. for (int i=0; i<m_segments.sz(); i++)
  114. {
  115. if (i > 0) s.Append('.');
  116. s.Append(m_segments.get(i));
  117. }
  118. m_str = s.ToString();
  119. }
  120. return m_str;
  121. }
  122. //////////////////////////////////////////////////////////////////////////
  123. // Methods
  124. //////////////////////////////////////////////////////////////////////////
  125. public List segments()
  126. {
  127. return m_segments;
  128. }
  129. public int segment(int index)
  130. {
  131. return ((Long)m_segments.get(index)).intValue();
  132. }
  133. public long major()
  134. {
  135. return ((Long)m_segments.get(0)).longValue();
  136. }
  137. public Long minor()
  138. {
  139. if (m_segments.sz() < 2) return null;
  140. return (Long)m_segments.get(1);
  141. }
  142. public Long build()
  143. {
  144. if (m_segments.sz() < 3) return null;
  145. return (Long)m_segments.get(2);
  146. }
  147. public Long patch()
  148. {
  149. if (m_segments.sz() < 4) return null;
  150. return (Long)m_segments.get(3);
  151. }
  152. //////////////////////////////////////////////////////////////////////////
  153. // Fields
  154. //////////////////////////////////////////////////////////////////////////
  155. public static readonly Version m_defVal = fromStr("0");
  156. private readonly List m_segments;
  157. private string m_str;
  158. }
  159. }