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