
Untitled
By: a guest on
Jun 11th, 2012 | syntax:
D | size: 1.65 KB | hits: 32 | expires: Never
module test;
import std.algorithm;
import std.stdio;
import std.traits;
import std.range;
struct Permutations(R) {
ElementType!R[] _input, _perm;
size_t k, n;
this(R r) {
_input = array(r);
_perm = array(r);
n = _perm.length;
k = n;
}
this(R r, size_t elems) {
_input = array(r);
_perm = array(r);
n = min(elems, _perm.length);
k = n;
}
ElementType!R[] front() { return _perm;}
bool empty() { return (n == 1 && k == 0 )|| (n>1 && k <=1);}
@property Permutations save() { return this;}
void popFront() {
k = n;
if (k==0) { n=1;} // permutation of an empty range or of zero elements
else {
C3: _perm = _perm[1..k] ~ _perm[0] ~ _perm[k..$];
if (_perm[k-1] == _input[k-1]) {
k--;
if (k > 1) goto C3;
}
}
}
}
/// ditto
Permutations!R permutations(R)(R r) if (isDynamicArray!R) {
return Permutations!R(r);
}
/// ditto
Permutations!R permutations(R)(R r, size_t n) if (isDynamicArray!R) {
return Permutations!R(r, n);
}
/// ditto
Permutations!(ElementType!R[]) permutations(R)(R r) if (!isDynamicArray!R && isForwardRange!R && !isInfinite!R) {
return Permutations!(ElementType!R[])(array(r));
}
/// ditto
Permutations!(ElementType!R[]) permutations(R)(R r, size_t n) if (!isDynamicArray!R && isForwardRange!R && !isInfinite!R) {
return Permutations!(ElementType!R[])(array(r), n);
}
void main()
{
string[] words = ["foo", "bar", "doo"];
auto p1 = permutations(words);
writeln(p1);
}