Cartesian product of immutable ranges

Jakob Ovrum jakobovrum at gmail.com
Sun Jan 26 14:52:54 PST 2014


On Sunday, 26 January 2014 at 22:32:32 UTC, matovitch wrote:
> You mean that two input ranges are created from the immutable 
> arrays when I call the function ?
>
> Zip doesn't compiles while zip compile. :/

`Zip` must be explicitly instantiated, which allows you to 
attempt to instantiate it with head-immutable slices, which isn't 
allowed because head-immutable slices aren't input ranges due to 
a lack of working `popFront()`.

> Here is the implementation of zip :
>
> auto zip(Ranges...)(Ranges ranges)
>     if (Ranges.length && allSatisfy!(isInputRange, Ranges))
> {
>     return Zip!Ranges(ranges);
> }

`zip` is a range constructor function. These are used to allow 
IFTI (Implicit Function Template Instantiation) to infer template 
arguments, so the user doesn't have to provide them explicitly.

With IFTI, head-immutable and head-const are stripped from slice 
types, so even though you pass immutable(int[]), the parameter 
type is set to be immutable(int)[], i.e. an mutable slice of 
immutable integers. Only the latter is a valid input range.


More information about the Digitalmars-d-learn mailing list