| // https://github.com/dlang/druntime/pull/1781 |
| |
| struct S |
| { |
| int i; |
| static int comparisons; |
| int opCmp(const S s) const { comparisons++; return i - s.i; } |
| } |
| |
| void testStructs() |
| { |
| auto s1 = S(1); |
| auto s2 = S(2); |
| auto s3 = S(3); |
| auto s4 = S(4); |
| |
| // Test lexicographical order |
| |
| assert(s1 < s2 && s2 < s3); |
| assert([s1, s2, s3] < [s1, s3]); |
| assert([s1, s2] < [s1, s2, s3]); |
| |
| // Test number of comparisons for nested types |
| |
| S.comparisons = 0; |
| assert(s1 < s2); |
| assert(S.comparisons == 1); |
| |
| S.comparisons = 0; |
| assert([s1, s2] < [s3, s4]); |
| assert(S.comparisons == 1); |
| |
| S.comparisons = 0; |
| assert([[s1, s2]] < [[s3, s4]]); |
| assert(S.comparisons == 1); |
| } |
| |
| class C |
| { |
| this(int i) { this.i = i; } |
| int i; |
| static int comparisons; |
| override int opCmp(Object c) const { comparisons++; return i - (cast(C)c).i; } |
| } |
| |
| void testClasses() |
| { |
| auto c1 = new C(1); |
| auto c2 = new C(2); |
| auto c3 = new C(3); |
| auto c4 = new C(4); |
| |
| // Test lexicographical order |
| |
| assert(c1 < c2 && c2 < c3); |
| assert([c1, c2, c3] < [c1, c3]); |
| assert([c1, c2] < [c1, c2, c3]); |
| |
| // Test number of comparisons for nested types |
| |
| C.comparisons = 0; |
| assert(c1 < c2); |
| assert(C.comparisons == 1); |
| |
| C.comparisons = 0; |
| assert([c1, c2] < [c3, c4]); |
| assert(C.comparisons == 1); |
| |
| C.comparisons = 0; |
| assert([[c1, c2]] < [[c3, c4]]); |
| assert(C.comparisons == 1); |
| } |
| |
| void main() |
| { |
| testStructs(); |
| testClasses(); |
| } |