On Tue, Apr 09, 2013 at 06:57:08PM +0200, Maksim Zholudev wrote:
> On Tuesday, 9 April 2013 at 14:41:09 UTC, Denis Shelomovskij wrote:
[...]
> >Also, if we are talking about matrices, very sad a solution for
> >enhancement 6798 [1] isn't merged yet.
> >
> >[1] http://d.puremagic.com/issues/show_bug.cgi?id=6798
> 
> Yes, I know about this. At the beginning I tried to implement
> multidimensional slices putting them into different bracket pairs
> like `a[1..2][3..4]`. It was hell.

I worked around that in my own multidimensional array implementation by
using a helper struct for encapsulating a range of indices:

        struct IndexRange {
                int start, end;
        }

Since opSlice couldn't take more than one range, I decided to overload
opIndex instead, so you could write:

        auto arr = Array!(3,int)([3, 4, 5]);

        // Index single element:
        arr[0, 1, 2] = ...;

        // Subdimensional slicing:
        auto brr = arr[IndexRange(0,2), 2, IndexRange(3,4)];

        // opDollar works correctly in all dimensions, even inside
        // IndexRange!
        auto crr = arr[$-1, IndexRange(0,$), IndexRange($-2, $-1)];
        // equivalent to arr[2, IndexRange(0,4), IndexRange(3,4)]

This is implemented by using variadics since int differs from
IndexRange:

        auto opIndex(A...)(A args) {
                foreach (i; args) {
                        static if (is(typeof(i) == int)) {
                                ...
                        } else static if (is(typeof(i) == IndexRange)) {
                                ...
                        }
                }
                return result;
        }

No temporaries are created, unlike the chained opSlice approach, you can
make subdimensional slices in a single opIndex call. (The disadvantage,
though, is that it has template bloat if you do a lot of this.)


> There is pull request [2] that adds everything but strides.
> My code relies on it. It still compiles even without these features
> but one have to construct slices manually: `a[Slice(1,2),
> Slice(3,4)]`.
> 
> Let's hope work on linear algebra support will legitimate the new
> features.
[...]

Yeah, I'm hoping for solid support for linear algebra eventually. D's
generics makes it possible to write generic linear algebra algorithms
that don't depend on exact matrix representation, which in C++ makes it
a pain to interface two different algebra libraries together (you have
to keep converting between representations).


T

-- 
If you look at a thing nine hundred and ninety-nine times, you are
perfectly safe; if you look at it the thousandth time, you are in
frightful danger of seeing it for the first time. -- G. K. Chesterton

Reply via email to