disabling unary "-" for unsigned types
Adam D. Ruppe
destructionator at gmail.com
Tue Feb 16 10:03:41 PST 2010
On Tue, Feb 16, 2010 at 11:26:37AM -0600, Ellery Newcomer wrote:
> OT: has anyone written a wrapper for int/long/etc that throws exceptions
> on overflow/underflow? Maybe such a thing should exist in the standard
> library?
Something along these lines should work (pasted at bottom of message).
I'd like it a lot more if it could just be opBinary!(string)() -- the struct
would be tiny.
Suckily, assigning an it to it when declaring it doesn't work. I think there's
a way around this, but I don't know.
The opPow's are commented out since my dmd is too old, so I couldn't test it.
========
import std.stdio;
struct NoOverflow(T) {
T _payload;
alias _payload this;
T opAdd(T a) {
T tmp = _payload + a;
asm { jo overflow; }
return tmp;
overflow:
throw new Exception("Overflow");
}
T opSub(T a) {
T tmp = _payload - a;
asm { jo overflow; }
return tmp;
overflow:
throw new Exception("Overflow");
}
T opMul(T a) {
T tmp = _payload * a;
asm { jo overflow; }
return tmp;
overflow:
throw new Exception("Overflow");
}
T opDiv(T a) {
T tmp = _payload / a;
asm { jo overflow; }
return tmp;
overflow:
throw new Exception("Overflow");
}
/+
T opPow(T a) {
T tmp = _payload ^^ a;
asm { jo overflow; }
return tmp;
overflow:
throw new Exception("Overflow");
}
+/
T opAddAssign(T a) {
_payload += a;
asm { jo overflow; }
return this;
overflow:
throw new Exception("Overflow");
}
T opSubAssign(T a) {
_payload -= a;
asm { jo overflow; }
return this;
overflow:
throw new Exception("Overflow");
}
T opMulAssign(T a) {
_payload *= a;
asm { jo overflow; }
return this;
overflow:
throw new Exception("Overflow");
}
T opDivAssign(T a) {
_payload /= a;
asm { jo overflow; }
return this;
overflow:
throw new Exception("Overflow");
}
T opPowAssign(T a) {
//_payload ^^= a;
asm { jo overflow; }
return this;
overflow:
throw new Exception("Overflow");
}
T opPostInc() {
_payload++;
asm { jo overflow; }
return this;
overflow:
throw new Exception("Overflow");
}
T opPostDec() {
_payload--;
asm { jo overflow; }
return this;
overflow:
throw new Exception("Overflow");
}
}
void main() {
alias NoOverflow!(int) oint;
oint a;
a = int.max;
a--;
writefln("%d", a);
a++;
writefln("%d", a);
a++; // should throw
writefln("%d", a);
}
=======
--
Adam D. Ruppe
http://arsdnet.net
More information about the Digitalmars-d
mailing list