Multidimensional arrays for D

Denis Shelomovskij verylonglogin.reg at gmail.com
Tue Oct 25 04:52:04 PDT 2011


What does D already have: build-in rectangular static arrays, dynamic 
arrays of arrays, std.range.frontTransversal, std.range.transversal.

Some time ago I was told that "FORTRAN is good for its arrays" and heard 
me saying "it is easy to implement in C++ or D, but in D it will have 
more convenient syntax". But than I have understood that I 
underestimated the problem and it isn't easy to implement in D and looks 
much more harder to implement in C++. In spite of this I decided to 
implement it in D. So, my implementation is ready for test/use but still 
has some TODO-s because it is just a straightforward implementation of 
basic multidimensional array operations with no optimisations. And I 
think it is valuable enough to be added in Phobos in future (tell me if 
it isn't).

Documentation and sources:
http://deoma-cmd.ru/d/docs/src/my/rarray.html

Sources will be at GitHub as soon as I am asked for it.

I have some questions about my array:
* Should such array be a part of Phobos or Druntime?
* Now my array has CT dimensions and RT lengths, should there be a 
version with RT dimensions (or maybe it is the only needed version)?
* Some (or most) of element names should be changed (like 
RectangularArray, because is isn't a rectangular array in the general 
case). So if one knows better names, tell me please (at least 
RectangularArray -> MultidimensionalArray, rectArray -> multiArray?).
* Have I misused some terminology (top dimension etc.)?
* What `Throwable` types should be thrown and when? Currently I use 
`AssertError` for my own mistakes and user incorrect ranges using and 
`Exception` for user incorrect array using, all are in debug mode only.
And I don't understand Druntime exceptions: it uses `Exception` for 
"lengths don't match for array copy" and `core.exception.RangeError` if 
array index is out of bounds and calls it "Range violation" (all are in 
debug mode only). It looks inconsistent.
* For `int a = b / c, d = b % c;` will compiler optimize it or should I 
add there an inline assembly to get `d` from `EDX` on x86 after division?

I also have some questions about other files (my.typetuple and my.traits):
* I was confused with Phobos TypeTuple because it isn't a type tuple. 
Should it be replaced with some modification of my variant?
* Have any additions in my.traits a general use? IMHO ArrayElementType, 
isType and staticRange have.

I also have some ideas (TODO-s) for my array which looks good:
* opSliceAssign with an array or a RectangularArray as its operand 
should use array copy for as much tail dimensions as possible (if data 
has no copy constructor because of dmd bug 6470).
* byElementRandomAccess should also look at all packed tail dimensions 
if they are one dimension for faster indexing.
* Special optimized case for 2^^n-lengths.


Thanks everybody for reading such a big post!


More information about the Digitalmars-d mailing list