Working with arrays (flatten, transpose, verfify rectangular)

Salih Dincer salihdb at hotmail.com
Wed Jul 20 16:15:33 UTC 2022


On Wednesday, 20 July 2022 at 09:18:29 UTC, anonymouse wrote:
>     Given an array of arbitrary dimensions, I would like to 
> accomplish three things:
>         1) verify that it is rectangular (e.g. all elements 
> have the same length, all sub-elements have the same length, 
> etc.)
>         2) flatten and return the flattened copy
>         3) transpose and return the transposed copy

Yesterday, I published an example of a lesson we developed with 
Ali.  It's same `transpose()` when I add extra `swap()` for you.  
I hope it works for you.

```d
import std.stdio;

struct Arrayish(T) {
   T[] element;
   size_t row, column;

   this(size_t row, size_t column) {
     this.element = new T[row * column];
     this.row = row;
     this.column = column;
   }

   ref T opIndex(size_t row, size_t column) {
     size_t first = row * this.column;
     size_t index = first + column;

     return element[index];
   }

   auto opCast(R : T[][])() {
     T[][] d;
     foreach(i; 0..row)
       d ~= slice(i);
     return d;
   }

   auto slice(size_t i) {
     size_t n = i * column;
     return element[n..n + column];
   }

   @property {
     auto length() {
       return row * column;
     }

     auto dup() {
       T[][] d;
       foreach(i; 0..row)
         d ~= slice(i).dup;
       return d;
     }
     void swap() {
       auto tmp = row;
       row = column;
       column = tmp;
     }
   }
}

enum { row = 2, col = 4 }

void main() {
   auto arrayish = Arrayish!int(row, col);

   foreach(r; 0..row) {
     foreach(c; 0..col) {
       const value = r * 1000 + c;
       arrayish[r, c] = value;
     }
   }
   //arrayish.swap();
   const array = cast(int[][])arrayish;
   arrayish[1, 0] = 100;
   typeid(array).writeln(": ", array.length);
   array.writefln!"%(%s\n%)";

   arrayish.length.writeln(" total items");
   
   auto arrayCopy = arrayish.dup;
   arrayish[1, 0] = 1000;
   typeid(arrayCopy).writeln(": ", array.length);
   arrayCopy.writefln!"%(%s\n%)";
}
```

SDB at 79


More information about the Digitalmars-d-learn mailing list