On 2/14/2017 8:25 AM, Andrei Alexandrescu wrote:
Range remove
(SwapStrategy s = SwapStrategy.stable, Range, Offset...)
(Range range, Offset offset)
if (s != SwapStrategy.stable
    && isBidirectionalRange!Range
    && hasLvalueElements!Range
    && hasLength!Range
    && Offset.length >= 1);

The function name is on the first line.

It could be improved slightly using indentation:

Range remove
    (SwapStrategy s = SwapStrategy.stable, Range, Offset...)
    (Range range, Offset offset)
    if (s != SwapStrategy.stable
        && isBidirectionalRange!Range
        && hasLvalueElements!Range
        && hasLength!Range
        && Offset.length >= 1);

But there's another issue here. remove() has other overloads:

Range remove
    (SwapStrategy s = SwapStrategy.stable, Range, Offset...)
    (Range range, Offset offset)
    if (s == SwapStrategy.stable
        && isBidirectionalRange!Range
        && hasLvalueElements!Range
        && Offset.length >= 1)

Range remove(alias pred, SwapStrategy s = SwapStrategy.stable, Range)
    (Range range)
    if (isBidirectionalRange!Range
        && hasLvalueElements!Range)

Two constraints are common to all three, those are the only ones that actually need to be in the constraint. The others can go in the body under `static if`, as the user need not be concerned with them.

This is a general issue in Phobos that too many constraints are user-facing when they don't need to be.

A further improvement in the documentation would be to add links to isBidirectionalRange and hasLvalueElements.

Reply via email to