1 module uim.oop.datatypes.integer;
2 
3 import uim.oop;
4 
5 /**
6 * The Integer class wraps a value of the primitive type int in an object. 
7 **/
8 class DInteger : DDatatype {
9   this() { super(); }
10   this(int newValue) { this(); this.value(newValue); }
11 
12   mixin(OProperty!("int", "value"));
13   unittest{
14     assert(Integer(2) == 2);
15     assert(Integer(2).value(1) == 1);
16   }
17 
18   O add(this O)(int opValue) { _value += opValue; return cast(O)this; }
19   unittest{
20     assert(Integer(2).add(2) == 4);
21     assert(Integer(2).add(2).add(2) == 6);
22   }
23 
24   O add(this O)(DInteger opValue) { _value += opValue.value; return cast(O)this; }
25   unittest{
26     assert(Integer(2).add(Integer(2)) == 4);
27   }
28 
29   O sub(this O)(int opValue) { _value -= opValue; return cast(O)this; }
30   unittest{
31     assert(Integer(2).sub(2) == 0);
32     assert(Integer(2).sub(2).sub(2) == -2);
33   }
34 
35   O sub(this O)(DInteger opValue) { _value -= opValue.value; return cast(O)this; }
36   unittest{
37     assert(Integer(2).sub(Integer(2)) == 0);
38   }
39 
40   O mul(this O)(int opValue) { _value *= opValue; return cast(O)this; }
41   unittest{
42     assert(Integer(2).mul(2) == 4);
43   }
44 
45   O mul(this O)(DInteger opValue) { _value *= opValue.value; return cast(O)this; }
46   unittest{
47     assert(Integer(2).mul(Integer(2)) == 4);
48   }
49 
50   O div(this O)(int opValue) { _value /= opValue; return cast(O)this; }
51   unittest{
52     assert(Integer(2).div(2) == 1);
53   }
54 
55   O div(this O)(DInteger opValue) { _value /= opValue.value; return cast(O)this; }
56   unittest{
57     assert(Integer(2).div(Integer(2)) == 1);
58   }
59 
60   DInteger opBinary(string op)(int opValue)
61   {
62       auto result = Integer(_value);
63       static if (op == "+") return result.add(opValue);
64       else static if (op == "-") return result.sub(opValue);
65       else static if (op == "*") return result.mul(opValue);
66       else static if (op == "/") return result.div(opValue);
67       else static assert(0, "Operator "~op~" not implemented");
68   }
69   unittest{
70     assert((Integer(2) + 2) == 4);
71     assert((Integer(2) - 2) == 0);
72     assert((Integer(2) * 2) == 4);
73     assert((Integer(2) / 2) == 1);
74   }
75 
76   DInteger opBinary(string op)(DInteger opValue)
77   {
78       auto result = Integer(_value);
79       static if (op == "+") return result.add(opValue);
80       else static if (op == "-") return result.sub(opValue);
81       else static if (op == "*") return result.mul(opValue);
82       else static if (op == "/") return result.div(opValue);
83       else static assert(0, "Operator "~op~" not implemented");
84   }
85   unittest{
86     assert((Integer(2) + Integer(2)) == 4);
87     assert((Integer(2) - Integer(2)) == 0);
88     assert((Integer(2) * Integer(2)) == 4);
89     assert((Integer(2) / Integer(2)) == 1);
90   }
91 
92   bool opEquals(int check) { return _value == check; }
93 //  bool opEquals(DInteger check) { return _value == check.value; }
94 
95   override string toString() {
96     return to!string(_value);
97   }
98   unittest{
99     assert(Integer(2).toString == "2");
100   }
101 }
102 auto Integer() { return new DInteger; }
103 auto Integer(int value) { return new DInteger(value); }