Cartesian product of ranges?

Timon Gehr timon.gehr at
Wed Dec 14 13:21:30 PST 2011

On 12/14/2011 09:14 PM, Justin Whear wrote:
> I've looked through std.algorithm and std.range, but haven't found anything
> to compute the Cartesian product of several ranges. I have the nagging
> feeling that this can be accomplished by combining several of the range
> transformations in the standard library.
> What I'm after is something like this:
> alias Tuple!(int, string) P;
> assert(equal(
> 	cartesianProduct([1, 2], ["a", "b"]),
> 	[ P(1, "a"), P(1, "b"), P(2, "a"), P(2, "b") ]
> ));

auto cartesianProduct(R,S)(R r, S s)if(isInputRange!R && isForwardRange!S){
     struct CartesianProduct{
         private{R r; S s, startS;}
         this(R r, S s){this.r=r; this.s=s;;}
         @property auto front(){return tuple(r.front, s.front);}
         @property bool empty(){return r.empty;}
         void popFront(){
                     s =;
         static if(isForwardRange!R):
         @property auto save(){return typeof(this)(,;}
     return CartesianProduct(r,s);

More information about the Digitalmars-d-learn mailing list