On Wednesday, 22 January 2014 at 15:41:58 UTC, bearophile wrote:
monarch_dodra:

Maybe you confusing the new style lambda for a "greater equal" operator? I can't make sense of your question any other way.

My point was that the shown code doesn't remove only one item in presence of duplicated ones. In this case tid are unique, but in general using that code to remove one item is not a good idea.

Bye,
bearophile

Ah... I see. Yeah, this will remove *all* items that match the TID. I'm not sure that's a problem in this context, but I you did want to remove "at most" 1 item, then this isn't the correct solution.

There's no phobos solution for that, but I guess it would be written something like:

template removeOne(alias pred, SwapStrategy s = SwapStrategy.stable)
{
    Range removeOne(Range)(Range range)
    {
        auto result = range.save;
        auto f = find!pred(range);
        if (f.empty) return result;

        static if (s == SwapStrategy.stable)
        {
            auto ff = f.save;
            f.popFront();
            ff.popBack;
            for ( ; !f.empty; f.popFront(), ff.popFront())
                moveFront(f, ff);
        }
        else
        {
            move(find.back, find.front);
        }
        result.popBack();
        return result;
    }
}

Disclaimer: Not actually tested. May also horribly fail on non-reference ranges.

Reply via email to