Re: More general Cartesian product

2012-02-29 Thread Philippe Sigaud
 I have a need for a Cartesian product of multiple ranges. I see there's
been a discussion here (Dec 2011) as well as a request posted (#7128). It
seems to me that the request deals with a multidimensional product -- which
is what I need -- while the implementation by Timon Gehr deals only with
the two-dimensional case.

I have one in a dsource project:

http://www.dsource.org/projects/dranges

It's in the algorithm.d module, look for 'combinations'

Docs are there:

http://svn.dranges.org/projects/dranges/trunk/dranges/doc/algorithm.html

For a generalization of this, you may want to have a look into the
rangeofranges.d module (docs: same than algorithm, or click on the
'package' tab on the left).

I think a .zip is given on the main page.
Alternatively, it's also on github:

www.github.com/PhilippeSigaud/dranges


Re: More general Cartesian product

2012-02-29 Thread Magnus Lie Hetland

On 2012-02-29 14:24:36 +, Philippe Sigaud said:


[snip]

Thanks for the response.

In the meantime, I also hacked together a simple version of what I 
needed (see below), but I'll look into the references you provided as 
well :)


void forall(alias func, size_t lvl=0, T...)(T args) {
   static if (lvl == args.length) {
   func(args);
   }
   else {
   foreach (e; args[lvl]) {
   forall!(func, lvl+1)
  (args[0..lvl], e, args[lvl+1..$]);
   }
   }
}

--
Magnus Lie Hetland
http://hetland.org