On Tuesday, 23 August 2016 at 20:40:06 UTC, Andrei Alexandrescu wrote:
* When assigning a Checked to another, should the limits be matched statically or checked dynamically?

The ideal would be implicit cast allowed when widening, explicit required when narrowing. As I think we will have to settle for always explicit, I would say dynamic check. This of course opens the way to many customizations: an user may want to customize what happens when the range check fails. Another user may even want a switch to statically disallow narrowing conversions.

* When composing, do the limits compose meaningfully?

Every layer should build on the limits exposed by the underlying layer, so I don't see what may go wrong.

* How to negotiate when both the user of Checked and the Hook need to customize the limits? (e.g. if you look at WithNaN it needs to reserve a special value, thus limiting the representable range).

The idea is that WithNaN will not see the limits of the underlying types, but the limits set by the user. How to do this, see below.

I think all of these questions have answers, but I wanted to gauge the interest in bounded checked integrals. Would the need for them justify additional complications in the definition?

From what I can see in my experience, saturation with custom min/max pops up once in a while in projects. So it's nice to have, even if it is a slight complication in the definition.

Under consideration:

struct Checkedint(T, Hook = Abort, T min = T.min, T max = T.max);

Can I suggest a different approach? Different bounds implemented as a hook?

alias MyBoundedInt = CheckedInt!(int, WithBounds!(0, 42));

The WithBounds hook would only define min, max and opCast. It may have other optional parameters, like whether to statically disallow narrowing casts, or what to do if a narrowing cast is found impossible at runtime.

What do you think about this?

Reply via email to