Assign to Array Column

Salih Dincer salihdb at hotmail.com
Thu Feb 2 00:48:32 UTC 2023


On Wednesday, 1 February 2023 at 05:51:31 UTC, Paul wrote:
> Thanks Salih.  Much appreciated.

It's my pleasure to solve this problem...

I have struck upon an idea that would not affect (i think) the 
speed of the processor requesting memory from the heap on a 
page-by-page basis but limited 😀

```d
import std.stdio, std.algorithm, std.range;

enum : size_t {
   ROW = 11,
   COL = 4,
   SUM = ROW * COL
}

void main()
{
   // 4 ushort x 11 ulong:
   auto arr = LimitedArray!COL(ROW);

   assert(arr.cell[0].elements.length >= COL);
   assert(arr.length == SUM);

   alias T = typeof(arr.cell[0].elements[0]);

   auto range = iota!T(T.max/2, T.max, 762).array;
   assert(range.length == SUM);

   range.each!((i, T x) => arr[i] = x);/*
   foreach(i, x; range) {
     arr[i] = x;
     writeln(x);
   }//*/
   arr.print;

   // 8 ubyte x 99 ulong:
   auto minMaxTest = LimitedArray!8(99);
   auto testLength = minMaxTest.length;

   minMaxTest[0] = ubyte.min + 1;
   minMaxTest[testLength - 1] = ubyte.max;
   minMaxTest.print;
}

template LimitedArray(size_t col)
{
     enum error = "Not Possible Capacity!";
     enum size = (col + 1) >> 1;

     static if(size >= 3)
     {
       alias T = ubyte; // min value, but max column

     } else static if(size == 2)
     {
       alias T = ushort;// average array

     } else static if(size == 1)
     {
       alias T = uint;  // max value, but min column
     }
     enum s = ulong.sizeof/T.sizeof;

     struct LimitedArray
     {
       invariant(uint.sizeof > size, error);

     private {
       union Cell {
         ulong element;
         T[s] elements;
       }
       Cell[] cell;
       const size_t row;
     }

     this(size_t row) {
       this.cell = new Cell[row];
       this.row = cell.length;
     }

     ref T opIndex(size_t i)
     in(i < length, "Range overflow!") {
       auto len = cell.length;
       size_t y, x = i % len;
                 y = i / len;
       return cell[x].elements[y];
     }

     auto length() {
       return row * col;
     }

     void print() {
       foreach(i, c; cell) {
         i.writef!"row %2s =>";
         foreach(e; c.elements) e.writef!"%6s";
         writeln(": ", c.element);
       }
     }
   }
}
```

> row  0 => 32767 41149 49531 57913: 16301273062966132735
> row  1 => 33529 41911 50293 58675: 16515760268034671353
> row  2 => 34291 42673 51055 59437: 16730247473103209971
> row  3 => 35053 43435 51817 60199: 16944734678171748589
> row  4 => 35815 44197 52579 60961: 17159221883240287207
> row  5 => 36577 44959 53341 61723: 17373709088308825825
> row  6 => 37339 45721 54103 62485: 17588196293377364443
> row  7 => 38101 46483 54865 63247: 17802683498445903061
> row  8 => 38863 47245 55627 64009: 18017170703514441679
> row  9 => 39625 48007 56389 64771: 18231657908582980297
> row 10 => 40387 48769 57151 65533: 18446145113651518915

@SDB79


More information about the Digitalmars-d-learn mailing list