code_junkie

How to I create my own primitive data type in .NET?

Nov 13th, 2011
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.98 KB | None | 0 0
  1. [Serializable, StructLayout(LayoutKind.Sequential), ComVisible(true)]
  2. public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<int>, IEquatable<int>
  3.  
  4. Structure LimitedInt
  5. Implements IComparable(Of LimitedInt)
  6. Implements IEquatable(Of LimitedInt)
  7.  
  8. Private m_Value As Integer 'treat the default, 0 as being really 1'
  9.  
  10. Public ReadOnly Property Value() As Integer
  11. Get
  12. Return If(m_Value = 0, 1, m_Value)
  13. End Get
  14. End Property
  15.  
  16. Public Sub New(ByVal value As Integer)
  17. If value < 1 Or value > 10 Then
  18. Throw New ArgumentOutOfRangeException("value")
  19. End If
  20. m_Value = value
  21. End Sub
  22.  
  23. Public Function CompareTo(ByVal other As LimitedInt) As Integer _
  24. Implements System.IComparable(Of LimitedInt).CompareTo
  25. Return Me.Value - other.Value
  26. End Function
  27.  
  28. Public Overloads Function Equals(ByVal other As LimitedInt) As Boolean _
  29. Implements System.IEquatable(Of LimitedInt).Equals
  30. Return Me.Value = other.Value
  31. End Function
  32.  
  33. Public Overrides Function GetHashCode() As Integer
  34. Return Value.GetHashCode
  35. End Function
  36.  
  37. Public Overrides Function Equals(ByVal obj As Object) As Boolean
  38. If TypeOf obj Is LimitedInt Then Return CType(obj, LimitedInt) = Me
  39. End Function
  40.  
  41. Public Shared Operator =(ByVal left As LimitedInt, _
  42. ByVal right As LimitedInt) As Boolean
  43. Return left.Equals(right)
  44. End Operator
  45.  
  46. Public Shared Operator <>(ByVal left As LimitedInt, _
  47. ByVal right As LimitedInt) As Boolean
  48. Return Not (left = right)
  49. End Operator
  50.  
  51. Public Shared Operator +(ByVal left As LimitedInt, _
  52. ByVal right As LimitedInt) As LimitedInt
  53. Dim temp As Integer = left.Value + right.Value
  54. Select Case temp
  55. Case 1 To 10 : Return New LimitedInt(temp)
  56. Case Else : Throw New OverflowException
  57. End Select
  58. End Operator
  59.  
  60. Public Shared Operator -(ByVal left As LimitedInt, _
  61. ByVal right As LimitedInt) As LimitedInt
  62. Dim temp As Integer = left.Value - right.Value
  63. Select Case temp
  64. Case 1 To 10 : Return New LimitedInt(temp)
  65. Case Else : Throw New OverflowException
  66. End Select
  67. End Operator
  68.  
  69. Public Shared Operator *(ByVal left As LimitedInt, _
  70. ByVal right As LimitedInt) As LimitedInt
  71. Dim temp As Integer = left.Value * right.Value
  72. Select Case temp
  73. Case 1 To 10 : Return New LimitedInt(temp)
  74. Case Else : Throw New OverflowException
  75. End Select
  76. End Operator
  77.  
  78. Public Shared Operator /(ByVal left As LimitedInt, _
  79. ByVal right As LimitedInt) As Double
  80. Return left.Value / right.Value
  81. End Operator
  82.  
  83. Public Shared Operator (ByVal left As LimitedInt, _
  84. ByVal right As LimitedInt) As LimitedInt
  85. Dim temp As Integer = left.Value right.Value
  86. Select Case temp
  87. Case 1 To 10 : Return New LimitedInt(temp)
  88. Case Else : Throw New OverflowException
  89. End Select
  90. End Operator
  91.  
  92. Public Shared Operator Mod(ByVal left As LimitedInt, _
  93. ByVal right As LimitedInt) As LimitedInt
  94. Dim temp As Integer = left.Value Mod right.Value
  95. Select Case temp
  96. Case 1 To 10 : Return New LimitedInt(temp)
  97. Case Else : Throw New OverflowException
  98. End Select
  99. End Operator
  100.  
  101. Public Shared Operator And(ByVal left As LimitedInt, _
  102. ByVal right As LimitedInt) As LimitedInt
  103. Dim temp As Integer = left.Value And right.Value
  104. Select Case temp
  105. Case 1 To 10 : Return New LimitedInt(temp)
  106. Case Else : Throw New OverflowException
  107. End Select
  108. End Operator
  109.  
  110. Public Shared Operator Or(ByVal left As LimitedInt, _
  111. ByVal right As LimitedInt) As LimitedInt
  112. Dim temp As Integer = left.Value Or right.Value
  113. Select Case temp
  114. Case 1 To 10 : Return New LimitedInt(temp)
  115. Case Else : Throw New OverflowException
  116. End Select
  117. End Operator
  118.  
  119. Public Shared Operator Xor(ByVal left As LimitedInt, _
  120. ByVal right As LimitedInt) As LimitedInt
  121. Dim temp As Integer = left.Value Xor right.Value
  122. Select Case temp
  123. Case 1 To 10 : Return New LimitedInt(temp)
  124. Case Else : Throw New OverflowException
  125. End Select
  126. End Operator
  127.  
  128. Public Shared Operator ^(ByVal left As LimitedInt, _
  129. ByVal right As LimitedInt) As Double
  130. Return left.Value ^ right.Value
  131. End Operator
  132.  
  133. Public Shared Operator <(ByVal left As LimitedInt, _
  134. ByVal right As LimitedInt) As Boolean
  135. Return left.Value < right.Value
  136. End Operator
  137.  
  138. Public Shared Operator >(ByVal left As LimitedInt, _
  139. ByVal right As LimitedInt) As Boolean
  140. Return left.Value > right.Value
  141. End Operator
  142.  
  143. Public Shared Operator <=(ByVal left As LimitedInt, _
  144. ByVal right As LimitedInt) As Boolean
  145. Return left.Value <= right.Value
  146. End Operator
  147.  
  148. Public Shared Operator >=(ByVal left As LimitedInt, _
  149. ByVal right As LimitedInt) As Boolean
  150. Return left.Value >= right.Value
  151. End Operator
  152.  
  153. Public Shared Widening Operator CType(ByVal left As LimitedInt) As Integer
  154. Return left.Value
  155. End Operator
  156.  
  157. Public Shared Narrowing Operator CType(ByVal left As Integer) As LimitedInt
  158. Return New LimitedInt(left)
  159. End Operator
  160.  
  161.  
  162. End Structure
  163.  
  164. MyAge : 0..120;
  165. NumOfFingersAfterNewYear : 0..10;
Add Comment
Please, Sign In to add comment