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); }