Static Length Propagation of Ranges

Meta via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Oct 19 11:56:35 PDT 2016


On Wednesday, 19 October 2016 at 13:59:29 UTC, Nordlöw wrote:
> Is there a generic way to do
>
>
> typeof(fn(E.init))[] map1(alias fn, E, size_t n)(E[n] container)
> {
>   import std.algorithm.iteration : map;
>   import std.array : array;
>   return container[].map!fn.array;
> }
>
> @safe pure nothrow unittest
> {
>   int[42] c;
>   auto result = map1!(_ => _^2)(c);
> }
>
>
> but with propagation of length of return value of `f` to a 
> static array instead, without having to specialize each range 
> separately?
>
> One less elegant way would be to replace the call to `array` 
> with an overload of `std.container.util.make` for static 
> arrays, that checks at run-time that the length of the output 
> static array matches the length of the input range?

Couldn't you do this? Mind you I'm not able to test the code 
right now, but I think it can work with some tweaking.

typeof(fn(E.init))[n] map1(alias fn, E, size_t n)(E[n] container)
{
     import std.algorithm.iteration : map;
     import std.array : array;

     typeof(return) sres;
     return container[].map!fn.copy(sres[]);
}

@safe pure nothrow unittest
{
    int[42] c;
    //result should be a static array of length 42
    auto result = map1!(_ => _^2)(c);
}


More information about the Digitalmars-d-learn mailing list