[challenge] Bounded types

Denis Koroskin 2korden at gmail.com
Sun Oct 10 15:19:32 PDT 2010


On Mon, 11 Oct 2010 01:16:05 +0400, Philippe Sigaud  
<philippe.sigaud at gmail.com> wrote:

> Hi,
>
> there is a long discussion about a date/time module on the Phobos mailing
> list, and among other very interesting things, it was suggested to add a
> Bounded template to Phobos. I'll extract this as a challenge to the D  
> community.
>
> Bounded takes a type, a min value and a max value and gives back a type  
> that
> can hold only values between min and max (tested at runtime). Otherwise,  
> I
> gather it throws an exception.
>
> for example:
>
> Bounded!(char, 'a','z') can only hold lowercase letters.
> Bounded!(double, 0.0, 1.0) is a bit like a double, but can only hold  
> doubles
> between 0.0 and 1.0.
>
> As you can see, an "open or closed for both ends" policy could be  
> interesting
> to add. In the previous example, is 1.0 a correct value?
> Another policy could be if it internally uses 'alias this' or not, and if
> opAssign is defined. That is, given
>
> alias Bounded!(int, 0, 9) Digit;
> Digit d;
> int foo(int i) { return i*i;}
>
> can you do:
>
> d = 9;
>
> or do you have to do:
>
> d = Digit(9);
>
> And can you call foo with d?
>
> As for all type-wrapper templates, this raises issues already seen on  
> typedef
> threads: subtype, parallel type, totally distinct type?
>
> The challenge is: implement Bounded.
>
>
> Philippe
>
>
> PS: clever (or perverse) readers may wonder what happens when Bounded  
> uses a
> type that has no obvious ordering. Like: Bounded!(int function(int),  
> ...). In
> that case, I suggest passing a ordering template that will test if a  
> given
> value is between min and max. The default would be BinaryFun!"a < b".  
> Another
> possibility is to restrict Bounded to types defining opCmp.

Also, one should be able to define CheckedInt type as follows:

alias Bounded!(int, int.min, int.max) CheckedInt;

CheckedInt would allow easy integer overflow detection. Smart compiler  
would also optimize all the (int.min <= value  && value <= int.max) checks  
as redundant, and the type would be very slim and efficient.


More information about the Digitalmars-d mailing list