Thread overview
Switching rows with columns
Jul 04, 2015
Tanel Tagaväli
Jul 04, 2015
Marc Schütz
Jul 05, 2015
Tanel Tagaväli
Jul 05, 2015
Marc Schütz
Jul 05, 2015
Tanel Tagaväli
July 04, 2015
I have a range of ranges and need to change it so the elements are column-aligned instead of row-aligned.

For example,
[[1, 2, 3],
 [4, 5, 6],
 [7, 8, 9]]
would change into
[[1, 4, 7],
 [2, 5, 8],
 [3, 6, 0]].

Can I even do this with ranges, and if so, how?
July 04, 2015
On Saturday, 4 July 2015 at 15:28:56 UTC, Tanel Tagaväli wrote:
> I have a range of ranges and need to change it so the elements are column-aligned instead of row-aligned.
>
> For example,
> [[1, 2, 3],
>  [4, 5, 6],
>  [7, 8, 9]]
> would change into
> [[1, 4, 7],
>  [2, 5, 8],
>  [3, 6, 0]].
>
> Can I even do this with ranges, and if so, how?

Try std.range.transposed:
http://dlang.org/phobos/std_range.html#.transposed
July 05, 2015
On Saturday, 4 July 2015 at 16:29:44 UTC, Marc Schütz wrote:
> Try std.range.transposed:
> http://dlang.org/phobos/std_range.html#.transposed

Does this work with user-defined types?

I defined two structs that implement the InputRange(possibly ForwardRange) interface, an integer range and a range of those integer ranges.

DMD tells me the "transposed" template cannot deduce function from the arguments, which is a range of integer ranges.
The template does, however, work on a two-dimensional array.

The "save" method is implemented using a simple "return this", could this be to blame?
July 05, 2015
On Sunday, 5 July 2015 at 00:18:18 UTC, Tanel Tagaväli wrote:
> On Saturday, 4 July 2015 at 16:29:44 UTC, Marc Schütz wrote:
>> Try std.range.transposed:
>> http://dlang.org/phobos/std_range.html#.transposed
>
> Does this work with user-defined types?
>
> I defined two structs that implement the InputRange(possibly ForwardRange) interface, an integer range and a range of those integer ranges.
>
> DMD tells me the "transposed" template cannot deduce function from the arguments, which is a range of integer ranges.
> The template does, however, work on a two-dimensional array.
>
> The "save" method is implemented using a simple "return this", could this be to blame?

This should be fine. Which of the ranges is the ForwardRange? It should be the range-of-ranges.

You can check which of the template constraints fails:

import std.range;
alias RangeOfRanges = typeof(myRangeOfRanges);
pragma(msg, isForwardRange!RangeOfRanges);
pragma(msg, isInputRange!(ElementType!RangeOfRanges));
pragma(msg, hasAssignableElements!RangeOfRanges);

Maybe it's the last condition, `hasAssignableElements`. I don't know whether that one is really necessary...
July 05, 2015
On Sunday, 5 July 2015 at 11:35:14 UTC, Marc Schütz wrote:
> Maybe it's the last condition, `hasAssignableElements`. I don't know whether that one is really necessary...

It probably is. The last check returned false.
Since I already would have to implement "r.front = ", I'll just use arrays.

Thanks for the help.