[Issue 1861] (D1 only) .sort fails if opCmp takes a ref param

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sun Feb 5 01:01:48 PST 2012


http://d.puremagic.com/issues/show_bug.cgi?id=1861


Yao Gomez <yao.gomez at gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |yao.gomez at gmail.com
            Version|1.027                       |D1
            Summary|.sort fails if opCmp takes  |(D1 only) .sort fails if
                   |a ref param                 |opCmp takes a ref param


--- Comment #4 from Yao Gomez <yao.gomez at gmail.com> 2012-02-05 01:01:46 PST ---
Marking this as D1 only, as the built-in, AA.sort method is going to be
deprecated.

With a slight modification, your test example passes and prints the correct
result with the std.algorithm.sort function (D2 only).

------
module opcmpref;

import std.stdio, std.algorithm;

struct Pair
{
    int a, b;
    // Sort by b first then a
    //  Sorting fails if rhs is a 'ref' param.  Ok if ref removed.
    int opCmp(ref Pair rhs) {
        if (b!=rhs.b) return b-rhs.b;
        return a-rhs.a;
    }
    @property string toString()
    {
        return std.string.format("(%s,%s)",a,b);
    }
}
void main()
{
    // Single comparisons are all fine
    assert( !(Pair(0,0)<Pair(0,0)) );
    assert( !(Pair(1,0)<Pair(0,0)) );
    assert( !(Pair(0,1)<Pair(0,0)) );
    assert( !(Pair(1,1)<Pair(0,0)) );
    assert(  (Pair(0,0)<Pair(1,0)) );
    assert( !(Pair(1,0)<Pair(1,0)) );
    assert( !(Pair(0,1)<Pair(1,0)) );
    assert( !(Pair(1,1)<Pair(1,0)) );

    assert(  (Pair(0,0)<Pair(0,1)) );
    assert(  (Pair(1,0)<Pair(0,1)) );
    assert( !(Pair(0,1)<Pair(0,1)) );
    assert( !(Pair(1,1)<Pair(0,1)) );
    assert(  (Pair(0,0)<Pair(1,1)) );
    assert(  (Pair(1,0)<Pair(1,1)) );
    assert(  (Pair(0,1)<Pair(1,1)) );
    assert( !(Pair(1,1)<Pair(1,1)) );

    auto p = [Pair(0,0), Pair(3,0), Pair(2,1), Pair(1,4)];
    std.algorithm.sort(p);
    // prints 'p=[(0,0), (3,0), (2,1), (1,4)]'
    writefln("p=%s",p);

    assert(p[0] == Pair(0,0));
    assert(p[1] == Pair(3,0));
    assert(p[2] == Pair(2,1));
    assert(p[3] == Pair(1,4));
}
------

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list