// 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(); }