help on cartesianProduct()

Era Scarecrow via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Dec 11 15:07:16 PST 2016


On Sunday, 11 December 2016 at 18:05:19 UTC, Era Scarecrow wrote:
> On Sunday, 11 December 2016 at 16:34:38 UTC, Orut wrote:
>> I need to be able to vary the number of ranges to feed into 
>> cartesianProduct() at run time.
>
>  Hmmm... what kind of ranges? Are they going to be arrays? Or 
> something else?


Well, with the assumption of using arrays (since you kinda need a 
length for it to work) I've thrown together a quick struct that 
does the job. Not fully tested, but will do the same thing with a 
varying number of inputs.

[code]
struct MultiCart(T) {
     T[][] data;
     int iteration;
     int max;

     this(T[][] _d, int iter=0) {
         data = _d;
         iteration = iter;

         max = 1;
         foreach(a; _d) {
             if (a.length)
                 max *= a.length;
         }
     }

     T[] front() {
         int i = iteration;
         T[] val;

         foreach(d; data) {
             if (d.length) {
                 val ~= d[i % d.length];
                 i /= d.length;
             }
         }

         return val;
     }

     void popFront() {
         iteration++;
     }

     bool empty() {
         return iteration >= max;
     }
}

unittest {
     import std.stdio;
     alias CartInt = MultiCart!int;

     int[] a=[1,2,3],b=[4,5],c=[6,7];
     foreach(x; CartInt([a,b,c]))
         writeln(x);

     foreach(x; CartInt([a,b]))
         writeln(x);
}
[/code]


More information about the Digitalmars-d-learn mailing list