January 19, 2021, 06:10:51 AM

Author Topic: [bmx] Number Class Cluster by N [ 1+ years ago ]  (Read 436 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] Number Class Cluster by N [ 1+ years ago ]
« on: June 29, 2017, 12:28:41 AM »
Title : Number Class Cluster
Author : N
Posted : 1+ years ago

Description : This is probably going to win me the Most Useless Code award, but being able to have a list or map of numbers can be handy at times, however infrequently those times seem to come up.

Anyway, this is based off the same sort of idea for NSNumber, only the implementation is far simpler (if you've ever seen the source for GNUstep, you'd probably understand).

The TNumber subclasses are hidden to completely ensure you're not going to modify the _value field of the object, since the object is supposed to be considered immutable.


Code :
Code: BlitzMax
  1. SuperStrict
  2.  
  3. Public
  4.  
  5. Const DOUBLE_DELTA! = 4.94065645841247e-324!
  6. Const FLOAT_DELTA# = 1.4e-45#
  7.  
  8. ' Used mainly for comparing types
  9. Const TYPE_INVALID:Int = -1
  10. Const TYPE_BOOL:Int = 0
  11. Const TYPE_BYTE:Int = 1
  12. Const TYPE_SHORT:Int = 2
  13. Const TYPE_INT:Int = 3
  14. Const TYPE_LONG:Int = 4
  15. Const TYPE_FLOAT:Int = 5
  16. Const TYPE_DOUBLE:Int = 6
  17.  
  18. Type TNumber Abstract
  19.         Function ForDouble:TNumber(v!)
  20.                 Type TDouble Extends TNumber
  21.                         Field _value:Double
  22.  
  23.                         Method InitWithDouble:TDouble(v!)
  24.                                 _value = v
  25.                                 Return Self
  26.                         End Method
  27.  
  28.                         Method DoubleValue!()
  29.                                 Return _value
  30.                         End Method
  31.  
  32.                         Method FloatValue#()
  33.                                 Return Float(_value)
  34.                         End Method
  35.  
  36.                         Method ByteValue@()
  37.                                 Return Byte(_value)
  38.                         End Method
  39.  
  40.                         Method ShortValue@@()
  41.                                 Return Short(_value)
  42.                         End Method
  43.  
  44.                         Method IntValue%()
  45.                                 Return Int(_value)
  46.                         End Method
  47.  
  48.                         Method LongValue:Long()
  49.                                 Return Long(_value)
  50.                         End Method
  51.  
  52.                         Method BoolValue:Int()
  53.                                 Return Int(_value)>0
  54.                         End Method
  55.  
  56.                         Method GetType:Int()
  57.                                 Return TYPE_DOUBLE
  58.                         End Method
  59.  
  60.                         Method ToString:String()
  61.                                 Return String(_value)
  62.                         End Method
  63.                 End Type
  64.                
  65.                 Return New TDouble.InitWithDouble(v)
  66.         End Function
  67.  
  68.         Function ForFloat:TNumber(v#)
  69.                 Type TFloat Extends TNumber
  70.                         Field _value:Float
  71.  
  72.                         Method InitWithFloat:TFloat(v#)
  73.                                 _value = v
  74.                                 Return Self
  75.                         End Method
  76.  
  77.                         Method DoubleValue!()
  78.                                 Return Double(_value)
  79.                         End Method
  80.  
  81.                         Method FloatValue#()
  82.                                 Return Float(_value)
  83.                         End Method
  84.  
  85.                         Method ByteValue@()
  86.                                 Return Byte(_value)
  87.                         End Method
  88.  
  89.                         Method ShortValue@@()
  90.                                 Return Short(_value)
  91.                         End Method
  92.  
  93.                         Method IntValue%()
  94.                                 Return Int(_value)
  95.                         End Method
  96.  
  97.                         Method LongValue:Long()
  98.                                 Return Long(_value)
  99.                         End Method
  100.  
  101.                         Method BoolValue:Int()
  102.                                 Return Int(_value)>0
  103.                         End Method
  104.  
  105.                         Method GetType:Int()
  106.                                 Return TYPE_FLOAT
  107.                         End Method
  108.  
  109.                         Method ToString:String()
  110.                                 Return String(_value)
  111.                         End Method
  112.                 End Type
  113.                
  114.                 Return New TFloat.InitWithFloat(v)
  115.         End Function
  116.  
  117.         Function ForByte:TNumber(v@)
  118.                 Type TByte Extends TNumber
  119.                         Field _value:Byte
  120.  
  121.                         Method InitWithByte:TByte(v:Byte)
  122.                                 _value = v
  123.                                 Return Self
  124.                         End Method
  125.  
  126.                         Method DoubleValue!()
  127.                                 Return Double(_value)
  128.                         End Method
  129.  
  130.                         Method FloatValue#()
  131.                                 Return Float(_value)
  132.                         End Method
  133.  
  134.                         Method ByteValue@()
  135.                                 Return _value
  136.                         End Method
  137.  
  138.                         Method ShortValue@@()
  139.                                 Return Short(_value)
  140.                         End Method
  141.  
  142.                         Method IntValue%()
  143.                                 Return Int(_value)
  144.                         End Method
  145.  
  146.                         Method LongValue:Long()
  147.                                 Return Long(_value)
  148.                         End Method
  149.  
  150.                         Method BoolValue:Int()
  151.                                 Return _value>0
  152.                         End Method
  153.  
  154.                         Method GetType:Int()
  155.                                 Return TYPE_BYTE
  156.                         End Method
  157.  
  158.                         Method ToString:String()
  159.                                 Return String(_value)
  160.                         End Method
  161.                 End Type
  162.                
  163.                 Return New TByte.InitWithByte(v)
  164.         End Function
  165.  
  166.         Function ForShort:TNumber(v@@)
  167.                 Type TShort Extends TNumber
  168.                         Field _value:Short
  169.  
  170.                         Method InitWithShort:TShort(v:Short)
  171.                                 _value = v
  172.                                 Return Self
  173.                         End Method
  174.  
  175.                         Method DoubleValue!()
  176.                                 Return Double(_value)
  177.                         End Method
  178.  
  179.                         Method FloatValue#()
  180.                                 Return Float(_value)
  181.                         End Method
  182.  
  183.                         Method ByteValue@()
  184.                                 Return Byte(_value)
  185.                         End Method
  186.  
  187.                         Method ShortValue@@()
  188.                                 Return _value
  189.                         End Method
  190.  
  191.                         Method IntValue%()
  192.                                 Return Int(_value)
  193.                         End Method
  194.  
  195.                         Method LongValue:Long()
  196.                                 Return Long(_value)
  197.                         End Method
  198.  
  199.                         Method BoolValue:Int()
  200.                                 Return _value>0
  201.                         End Method
  202.  
  203.                         Method GetType:Int()
  204.                                 Return TYPE_SHORT
  205.                         End Method
  206.  
  207.                         Method ToString:String()
  208.                                 Return String(_value)
  209.                         End Method
  210.                 End Type
  211.                
  212.                 Return New TShort.InitWithShort(v)
  213.         End Function
  214.  
  215.         Function ForInt:TNumber(v%)
  216.                 Type TInt Extends TNumber
  217.                         Field _value:Int
  218.  
  219.                         Method InitWithInt:TInt(v:Int)
  220.                                 _value = v
  221.                                 Return Self
  222.                         End Method
  223.  
  224.                         Method DoubleValue!()
  225.                                 Return Double(_value)
  226.                         End Method
  227.  
  228.                         Method FloatValue#()
  229.                                 Return Float(_value)
  230.                         End Method
  231.  
  232.                         Method ByteValue@()
  233.                                 Return Byte(_value)
  234.                         End Method
  235.  
  236.                         Method ShortValue@@()
  237.                                 Return Short(_value)
  238.                         End Method
  239.  
  240.                         Method IntValue%()
  241.                                 Return _value
  242.                         End Method
  243.  
  244.                         Method LongValue:Long()
  245.                                 Return Long(_value)
  246.                         End Method
  247.  
  248.                         Method BoolValue:Int()
  249.                                 Return _value>0
  250.                         End Method
  251.  
  252.                         Method GetType:Int()
  253.                                 Return TYPE_INT
  254.                         End Method
  255.  
  256.                         Method ToString:String()
  257.                                 Return String(_value)
  258.                         End Method
  259.                 End Type
  260.                
  261.                 Return New TInt.InitWithInt(v)
  262.         End Function
  263.  
  264.         Function ForLong:TNumber(v:Long)
  265.                 Type TLong Extends TNumber
  266.                         Field _value:Long
  267.  
  268.                         Method InitWithLong:TLong(v:Long)
  269.                                 _value = v
  270.                                 Return Self
  271.                         End Method
  272.  
  273.                         Method DoubleValue!()
  274.                                 Return Double(_value)
  275.                         End Method
  276.  
  277.                         Method FloatValue#()
  278.                                 Return Float(_value)
  279.                         End Method
  280.  
  281.                         Method ByteValue@()
  282.                                 Return Byte(_value)
  283.                         End Method
  284.  
  285.                         Method ShortValue@@()
  286.                                 Return Short(_value)
  287.                         End Method
  288.  
  289.                         Method IntValue%()
  290.                                 Return Int(_value)
  291.                         End Method
  292.  
  293.                         Method LongValue:Long()
  294.                                 Return _value
  295.                         End Method
  296.  
  297.                         Method BoolValue:Int()
  298.                                 Return _value>0
  299.                         End Method
  300.  
  301.                         Method GetType:Int()
  302.                                 Return TYPE_LONG
  303.                         End Method
  304.  
  305.                         Method ToString:String()
  306.                                 Return String(_value)
  307.                         End Method
  308.                 End Type
  309.                
  310.                 Return New TLong.InitWithLong(v)
  311.         End Function
  312.  
  313.         Function ForBool:TNumber(b:Int)
  314.                 Type TBool Extends TNumber
  315.                         Field _value:Int
  316.  
  317.                         Method InitWithBool:TBool(v:Int)
  318.                                 _value = v>0
  319.                                 Return Self
  320.                         End Method
  321.  
  322.                         Method DoubleValue!()
  323.                                 Return Double(_value)
  324.                         End Method
  325.  
  326.                         Method FloatValue#()
  327.                                 Return Float(_value)
  328.                         End Method
  329.  
  330.                         Method ByteValue@()
  331.                                 Return Byte(_value)
  332.                         End Method
  333.  
  334.                         Method ShortValue@@()
  335.                                 Return Short(_value)
  336.                         End Method
  337.  
  338.                         Method IntValue%()
  339.                                 Return _value
  340.                         End Method
  341.  
  342.                         Method LongValue:Long()
  343.                                 Return Long(_value)
  344.                         End Method
  345.  
  346.                         Method BoolValue:Int()
  347.                                 Return _value
  348.                         End Method
  349.  
  350.                         Method ToString:String()
  351.                                 Return String(_value)
  352.                         End Method
  353.  
  354.                         Method GetType:Int()
  355.                                 Return TYPE_BOOL
  356.                         End Method
  357.                 End Type
  358.                
  359.                 Return New TBool.InitWithBool(b)
  360.         End Function
  361.  
  362.         Method DoubleValue!() Abstract
  363.         Method FloatValue#() Abstract
  364.         Method ByteValue@() Abstract
  365.         Method ShortValue@@() Abstract
  366.         Method IntValue%() Abstract
  367.         Method LongValue:Long() Abstract
  368.         Method BoolValue:Int() Abstract
  369.         Method ToString:String() Abstract
  370.  
  371.         Method GetType:Int() Abstract
  372.  
  373.         Method Compare:Int(other:Object)
  374.                 Local n:TNumber = TNumber(other)
  375.                 If n Then
  376.                         Local _type:Int, t2:Int
  377.                         _type = GetType()
  378.                         t2 = GetType()
  379.  
  380.                         If _type = TYPE_INVALID Or t2 = TYPE_INVALID Then
  381.                                 Throw "Attempt to compare invalid number"
  382.                         EndIf
  383.  
  384.                         If t2 > _type Then
  385.                                 _type = t2
  386.                         EndIf
  387.  
  388.                         Select _type
  389.                                 Case TYPE_BOOL
  390.                                         Local b1%, b2%
  391.                                         b1 = n.BoolValue()
  392.                                         b2 = n.BoolValue()
  393.                                         If b1 = b2 Then
  394.                                                 Return 0
  395.                                         ElseIf b1 Then
  396.                                                 Return 1
  397.                                         EndIf
  398.                                         Return -1
  399.                                 Case TYPE_DOUBLE
  400.                                         Local d! = DoubleValue()-n.DoubleValue()
  401.                                         If d < -DOUBLE_DELTA Then
  402.                                                 Return -1
  403.                                         ElseIf d > DOUBLE_DELTA then
  404.                                                 Return 1
  405.                                         EndIf
  406.                                         Return 0
  407.                                 Case TYPE_FLOAT
  408.                                         Local f! = FloatValue()-n.FloatValue()
  409.                                         If f < -FLOAT_DELTA Then
  410.                                                 Return -1
  411.                                         ElseIf f > FLOAT_DELTA then
  412.                                                 Return 1
  413.                                         EndIf
  414.                                         Return 0
  415.                                 Case TYPE_LONG
  416.                                         Local l1:Long, l2:Long
  417.                                         l1 = LongValue()
  418.                                         l2 = n.LongValue()
  419.                                         If l1 = l2 Then
  420.                                                 Return 0
  421.                                         ElseIf l1 < l2 Then
  422.                                                 Return -1
  423.                                         EndIf
  424.                                         Return 1
  425.                                 Default ' int and under
  426.                                         Local i1%, i2%
  427.                                         i1 = IntValue()
  428.                                         i2 = n.IntValue()
  429.                                         If i1 = i2 Then
  430.                                                 Return 0
  431.                                         ElseIf i1 < i2 Then
  432.                                                 Return -1
  433.                                         EndIf
  434.                                         Return 1
  435.                         End Select
  436.                 EndIf
  437.                 Return Super.Compare(other)
  438.         End Method
  439. End Type


Comments :


Warpy(Posted 1+ years ago)

 Interesting use of DOUBLE_DELTA and FLOAT_DELTA in the compare method, I wouldn't've thought of that.I prefer to have modified list/map types which take numbers directly, and mark seems happy enough to cast to strings, but horses for courses I suppose.


N(Posted 1+ years ago)

 Suppose I should mention that I just added a sort of bug fix, since previously bools would only be equal if both were true.  Why I thought this was correct when I wrote it is beyond me, but that's fixed.


Otus(Posted 1+ years ago)

 Something looks wrong here:
Code: [Select]
Local _type:Int, t2:Int
_type = GetType()
t2 = GetType()
Am I missing something: why is TNumber not Abstract?


N(Posted 1+ years ago)

 It's not abstract so that you can, for whatever reason you would want to, do New TNumber.InitWithDouble(x).Thinking about it now though, I'll probably just remove those...


Zakk(Posted 1+ years ago)

 I usually use bytes for my bools :) [/i]

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal