Could that bug be catch using D's way?
Simen Kjærås
simen.kjaras at gmail.com
Mon Feb 19 13:24:34 UTC 2018
On Monday, 19 February 2018 at 12:58:45 UTC, Marc wrote:
> I'm pretty sure something could be done with Ada's type range
> but what we could do using D?
We can easily define a range type in D. The simple example below
probably has awful performance and many holes, but outlines the
basic idea. It will not have compile-time bounds checks, but can
be used as an int when it needs to, and enforces at run-time that
the value is within the specified bounds.
import std.format : format;
import std.exception : enforce;
struct Range(T, T min, T max, T defaultValue = 0)
if (defaultValue >= min && defaultValue <= max)
{
private T payload;
this(T value)
{
this = value;
}
T get() { return payload; }
alias get this;
Range opBinary(string op)(T value)
{
return Range(mixin("payload "~op~" value"));
}
ref Range opOpAssing(string op)(T value)
{
this = Range(mixin("payload "~op~" value"));
return this;
}
ref Range opAssign(T value, string file = __FILE__, int line
= __LINE__)
{
enforce(value <= max && value >= min, format("Value needs
to be between %s and %s, not %s.", min, max, value), file, line);
payload = value;
return this;
}
}
unittest
{
Range!(int, 3, 15, 3) a = 4;
a = 16; // foo.d(38): Value needs to be between 3 and 15, not
16.
int n = a;
}
It currently does no sensible testing of what operators it
allows, and does not support unary operators. Other potential
improvements include merging of bounds when the other operand is
a range as well (so Range!(int, 3, 6) + Range!(int, 2, 8) returns
a Range!(int, 5, 14)). Perhaps a more sensible default value
would be min(maxValue, max(0, minValue)).
--
Simen
More information about the Digitalmars-d-learn
mailing list