H. S. Teoh:
1) To avoid excessive allocations, it would have to be a
transient range.
See the doCopy boolean template argument in my code. Note that
it's true on default. (D Zen: do the safe thing on default, and
the fast thing on request).
2) If the starting range is not sorted, then the permutation
range needs
to make a copy of the original range so that it knows when all
permutations have been enumerated. But there is no generic way
to make a
copy of a range
Isn't it possible to call array() on the input range? (Performing
array() takes a microscopic amount of time compared to computing
its permutations.)
I think this is an unfair comparison: using factorial assumes
that all array elements are unique.
It's a fair comparison because it tests a common usage case in my
code.
I'm not asking to remove nextPermutation from Phobos. I think
nextPermutation is useful, but in many cases my items are unique
(example: I make them unique before giving them to
permutations()). (And I think it's not good to slow down this
very common case because in general they aren't unique.)
The advantage of nextPermutation is that it
correctly handles duplicated elements, producing only distinct
permutations of them. It's no surprise that if you sacrifice
handling of
duplicated elements, the code will be faster.
...
(Not to mention, using factorial is limited because its value
grows too
quickly, and once your range is large enough, you will be
needing to use
BigInt to be able to deal with the factorial values without
overflow.
The current implementation of nextPermutation doesn't suffer
from this
problem.)
See above.
Bye,
bearophile