Assign the value of that to this SmartInt instance.
See smartOp.
See smartOp.
Assign the value of that to this SmartInt instance.
See smartOp.
Convert this value to floating-point. This always succeeds, although some loss of precision may occur if M.sizeof <= N.sizeof.
this != 0
Convert this value to type M using checkedint.to() for bounds checking. An IntFlag will be raised if M cannot represent the current value of this SmartInt.
Perform a mathematically correct comparison to right.
Returns true if this value is mathematically precisely equal to right.
See smartOp.
See smartOp.
Count the number of set bits using core.bitop.popcnt().
Raise this to the exp power using std.math.pow().
See smartOp.
Get a simple hashcode for this value.
Get a string representation of this value.
Get a view of this SmartInt that allows bitwise operations.
Convert this value to a type suitable for indexing an array:
checkedint.to() is used for bounds checking.
The basic integral value of this SmartInt. Accessing this directly may be useful for:
The most positive possible value of this SmartInt type.
The most negative possible value of this SmartInt type.
The error signalling policy used by this SmartInt type.
// Mixing standard signed and unsigned types is dangerous, but... int ba = -1; uint bb = 0; assert(ba > bb); auto bc = ba + bb; assert(is(typeof(bc) == uint)); assert(bc == 4294967295u); // ...with SmartInt, mixed signed/unsigned operations "just work": import checkedint.throws : SmartInt; // use IntFlagPolicy.throws SmartInt!int ma = -1; SmartInt!uint mb = 0; assert(ma < mb); auto mc = ma + mb; assert(is(typeof(mc) == SmartInt!int)); assert(mc != 4294967295u); assert(mc == -1);
// When IntFlagPolicy.throws is used, failed SmartInt operations will throw a CheckedIntException. import checkedint.throws : SmartInt; SmartInt!uint ma = 1; SmartInt!uint mb = 0; bool overflow = false; try { SmartInt!uint mc = mb - ma; assert(false); } catch(CheckedIntException e) { assert(e.intFlags == IntFlag.negOver); overflow = true; } assert(overflow); bool div0 = false; try { // With standard integers, this would crash the program with an unrecoverable FPE... SmartInt!uint mc = ma / mb; assert(false); } catch(CheckedIntException e) { // ...but with SmartInt, it just throws a normal Exception. assert(e.intFlags == IntFlag.div0); div0 = true; } assert(div0);
// When IntFlagPolicy.noex is used, failed SmartInt operations set one or more bits in IntFlags.local. import checkedint.noex : SmartInt; SmartInt!uint ma = 1; SmartInt!uint mb = 0; SmartInt!uint mc; mc = mb - ma; assert(IntFlags.local == IntFlag.negOver); // With standard integers, this would crash the program with an unrecoverable FPE... mc = ma / mb; // ...but with SmartInt, it just sets a bit in IntFlags.local. assert(IntFlags.local & IntFlag.div0); // Each flag will remain set until cleared: assert(IntFlags.local.clear() == (IntFlag.negOver | IntFlag.div0)); assert(!IntFlags.local);
Wrapper for any basic integral type N that uses the checked operations from smartOp and bounds checks assignments with checkedint.to().