import std.exception, std.stdio;
struct CustomInteger(T, T minValue, T maxValue)
{
T value_;
alias value this;
@property T value() const
{
enforce((value_ >= minValue) &&
(value_ <= maxValue));
return value_;
}
@property void value(T v)
{
value_ = v;
}
}
void main()
{
alias Balance = CustomInteger!(int, -32_000, 32_000);
auto b = Balance(42);
// b += 5; // Error: 'b += 5' is not a scalar,
// it is a CustomInteger!(int, -32000, 32000)
writeln(b); // 42
b = 40_000;
writeln(b); // object.Exception@acm.d(11): Enforcement failed
}
aW1wb3J0IHN0ZC5leGNlcHRpb24sIHN0ZC5zdGRpbzsKCnN0cnVjdCBDdXN0b21JbnRlZ2VyKFQsIFQgbWluVmFsdWUsIFQgbWF4VmFsdWUpCnsKCVQgdmFsdWVfOwoJCglhbGlhcyB2YWx1ZSB0aGlzOwoJCglAcHJvcGVydHkgVCB2YWx1ZSgpIGNvbnN0Cgl7CgkJZW5mb3JjZSgodmFsdWVfID49IG1pblZhbHVlKSAmJgoJCQkJKHZhbHVlXyA8PSBtYXhWYWx1ZSkpOwoJCQoJCXJldHVybiB2YWx1ZV87Cgl9CgkKCUBwcm9wZXJ0eSB2b2lkIHZhbHVlKFQgdikKCXsKCQl2YWx1ZV8gPSB2OwoJfQp9Cgp2b2lkIG1haW4oKQp7CglhbGlhcyBCYWxhbmNlID0gQ3VzdG9tSW50ZWdlciEoaW50LCAtMzJfMDAwLCAzMl8wMDApOwoJCglhdXRvIGIgPSBCYWxhbmNlKDQyKTsKCQoJLy8gYiArPSA1OyAvLyBFcnJvcjogJ2IgKz0gNScgaXMgbm90IGEgc2NhbGFyLAoJLy8gaXQgaXMgYSBDdXN0b21JbnRlZ2VyIShpbnQsIC0zMjAwMCwgMzIwMDApCgkKCXdyaXRlbG4oYik7IC8vIDQyCgoJYiA9IDQwXzAwMDsKCgl3cml0ZWxuKGIpOyAvLyBvYmplY3QuRXhjZXB0aW9uQGFjbS5kKDExKTogRW5mb3JjZW1lbnQgZmFpbGVkCn0=