class FastPermutation
{
public:
typedef function ENUMERATOR;
static void Enum(int base, ENUMERATOR enumerator)
{
FastPermutation permutation;
permutation.CalculateAtLevel(base, enumerator);
}
private:
void CalculateAtLevel(int level, ENUMERATOR enumerator)
{
if (level == 1)
{
int sequence[] = { 0 };
enumerator(sequence);
return;
}
int* sequence = new int[level];
this->
CalculateAtLevel(level - 1, [level, sequence, enumerator](int* s)
{
int* key = sequence + (level - 1);
*key = level - 1;
for (int i = 0; i < level - 1; i++) sequence[i] = s[i];
enumerator(sequence);
while (key != sequence)
{
*key = *(key - 1);
*(--key) = level - 1;
enumerator(sequence);
}
});
delete[] sequence;
}
};