Changeset 788

Show
Ignore:
Timestamp:
07/07/08 23:12:47 (5 months ago)
Author:
andrei
Message:

$(Simplified $(B std.algorithm) by fusing together higher-order functions taking an alias and their counterparts taking a string.)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/phobos/std/algorithm.d

    r743 r788  
    332332} 
    333333 
    334 version (wyda) unittest 
     334unittest 
    335335{ 
    336336    int[] a = [ 3, 4 ]; 
     
    376376} 
    377377 
    378 version(wyda) unittest 
     378unittest 
    379379{ 
    380380    int[] a = [ 10, 11, 12, 13, 14 ]; 
     
    421421Ranges[0] filter(alias pred, Ranges...)(Ranges rs) 
    422422{ 
     423    alias unaryFun!(pred) fun; 
    423424    typeof(return) result; 
    424425    // Accumulate 
     
    427428        foreach (it; begin(range) .. end(range)) // current input 
    428429        { 
    429             if (pred(*it)) result ~= *it; 
     430            if (fun(*it)) result ~= *it; 
    430431        } 
    431432    } 
     
    433434} 
    434435 
    435 Ranges[0] filter(string pred, Ranges...)(Ranges rs) 
    436 
    437     return .filter!(unaryFun!(pred), Ranges)(rs); 
    438 
    439  
    440 version (wyda) unittest 
     436unittest 
    441437{ 
    442438    int[] a = [ 3, 4 ]; 
     
    471467// void inPlace(alias fun, Ranges...)(Ranges rs) 
    472468{ 
    473     alias unaryFun!(fun) f
    474     foreach (j; begin(r) .. end(r)) f(*j); 
     469    alias unaryFun!(fun, true) todo
     470    foreach (j; begin(r) .. end(r)) todo(*j); 
    475471    foreach (i, x; rs) 
    476472    { 
    477         foreach (j; begin(x) .. end(x)) f(*j); 
    478     } 
    479 } 
    480  
    481 version (wyda) unittest 
     473        foreach (j; begin(x) .. end(x)) todo(*j); 
     474    } 
     475} 
     476 
     477unittest 
    482478{ 
    483479    // fill with 42 
     
    528524} 
    529525 
    530 version (wyda) unittest 
     526unittest 
    531527{ 
    532528    Object obj1 = new Object; 
     
    622618} 
    623619 
    624 version (wyda) unittest 
     620unittest 
    625621{ 
    626622    int[] arr = [ 1, 2, 2, 2, 2, 3, 4, 4, 4, 5 ]; 
     
    656652---- 
    657653*/ 
    658 Iterator!(Range) find(alias pred, Range, E)(Range haystack, E needle) 
    659 
     654Iterator!(Range) find(alias pred = "a == b", Range, E)(Range haystack, E needle) 
     655
     656    alias binaryFun!(pred) test; 
     657    // @@@BUG@@@ 
    660658    //foreach (i; begin(haystack) .. end(haystack)) 
    661659    for (auto i = begin(haystack); i != end(haystack); ++i) 
    662660    { 
    663         if (pred(*i, needle)) return i; 
     661        if (test(*i, needle)) return i; 
    664662    } 
    665663    return end(haystack); 
    666664} 
    667665 
    668 /// Ditto 
    669 Iterator!(Range) find(string pred = "a == b", Range, E)( 
    670     Range haystack, E needle) 
    671 
    672     return .find!(binaryFun!(pred), Range, E)(haystack, needle); 
    673 
    674  
    675 version (wyda) unittest 
     666unittest 
    676667{ 
    677668    int[] a = [ 1, 2, 3 ]; 
     
    691682    string[] s = [ "Hello", "world", "!" ]; 
    692683    assert(find!("toupper(a) == toupper(b)")(s, "hello") == begin(s)); 
    693 
    694  
    695 version (wyda) unittest 
     684 
     685    static bool f(string a, string b) { return toupper(a) == toupper(b); } 
     686    assert(find!(f)(s, "hello") == begin(s)); 
     687
     688 
     689unittest 
    696690{ 
    697691    int[] a = [ 1, 2, 3, 2, 6 ]; 
     
    730724Iterator!(Range) find(alias pred, Range)(Range haystack) 
    731725{ 
     726    alias unaryFun!(pred) predFun; 
    732727    foreach (i; begin(haystack) .. end(haystack)) 
    733728    { 
    734         if (pred(*i)) return i; 
     729        if (predFun(*i)) return i; 
    735730    } 
    736731    return end(haystack); 
    737732} 
    738733 
    739 /// Ditto 
    740 Iterator!(Range) find(string pred, Range)(Range haystack) 
    741 
    742     return find!(unaryFun!(pred), Range)(haystack); 
    743 
    744  
    745 version (wyda) unittest 
     734unittest 
    746735{ 
    747736    auto a = [ 1, 2, 3 ]; 
     
    768757---- 
    769758*/ 
    770 Iterator!(Range1) findRange(alias pred, Range1, Range2)( 
    771     Range1 seq, Range2 subseq) 
     759Iterator!(Range1) findRange(alias pred = "a == b", Range1, Range2) 
     760    (Range1 seq, Range2 subseq) 
    772761{ 
    773762    auto e1 = end(seq); 
     
    783772} 
    784773 
    785 /// Ditto 
    786 Iterator!(Range1) findRange( 
    787     string pred = q{a == b}, Range1, Range2)(Range1 seq, Range2 subseq) 
    788 
    789     return .findRange!(binaryFun!(pred), Range1, Range2)(seq, subseq); 
    790 
    791  
    792 version (wyda) unittest 
     774unittest 
    793775{ 
    794776    int[] a = [ -1, 0, 1, 2, 3, 4, 5 ]; 
     
    913895thread-safe storage so it is not rebuilt repeatedly. 
    914896*/ 
    915 Iterator!(Range) findBoyerMoore(alias pred, Range)(Range seq, 
    916                                                    Range subseq) 
    917 
    918     return BoyerMooreFinder!(pred, Range)(subseq).inspect(seq); 
    919 
    920  
    921 /// Ditto 
    922 Iterator!(Range) findBoyerMoore(string pred = q{a == b}, Range)( 
    923     Range seq, Range subseq) 
    924 
    925     return .findBoyerMoore!(binaryFun!(pred), Range)(seq, subseq); 
    926 
    927  
    928 version (wyda) unittest 
    929 
    930     debug(string) writefln("Boyer-Moore implementation version (wyda) unittest\n"); 
     897Iterator!(Range) findBoyerMoore(alias pred = "a == b", Range) 
     898    (Range seq, Range subseq) 
     899
     900    return BoyerMooreFinder!(binaryFun!(pred), Range)(subseq).inspect(seq); 
     901
     902 
     903unittest 
     904
    931905    string h = "/homes/aalexand/d/dmd/bin/../lib/libphobos.a(dmain2.o)" 
    932906        "(.gnu.linkonce.tmain+0x74): In function `main' undefined reference" 
     
    960934---- 
    961935*/ 
    962 Iterator!(Range) findAdjacent(alias pred, Range)(Range r) 
     936Iterator!(Range) findAdjacent(alias pred = "a == b", Range)(Range r) 
    963937{ 
    964938    auto first = begin(r), last = end(r); 
     
    967941    { 
    968942        for (++next; next != last; ++first, ++next) 
    969             if (pred(*first, *next)) return first; 
     943            if (binaryFun!(pred)(*first, *next)) return first; 
    970944    } 
    971945    return last; 
    972946} 
    973947 
    974 /// Ditto 
    975 Iterator!(Range) findAdjacent(string pred = q{a == b}, Range)(Range r) 
    976 
    977     return .findAdjacent!(binaryFun!(pred), Range)(r); 
    978 
    979  
    980 version (wyda) unittest 
     948unittest 
    981949{ 
    982950    int[] a = [ 11, 10, 10, 9, 8, 8, 7, 8, 9 ]; 
     
    1003971---- 
    1004972*/ 
    1005 Iterator!(Range1) findAmong(alias pred, Range1, Range2)( 
     973Iterator!(Range1) findAmong(alias pred = "a == b", Range1, Range2)( 
    1006974    Range1 seq, Range2 choices) 
    1007975{ 
     
    1013981} 
    1014982 
    1015 /// Ditto 
    1016 Iterator!(Range1) findAmong( 
    1017     string pred = q{a == b}, Range1, Range2)(Range1 seq, Range2 choices) 
    1018 
    1019     return .findAmong!(binaryFun!(pred), Range1, Range2)(seq, choices); 
    1020 
    1021  
    1022 version (wyda) unittest 
     983unittest 
    1023984{ 
    1024985    int[] a = [ -1, 0, 2, 1, 2, 3, 4, 5 ]; 
     
    1026987    assert(findAmong(a, b) == begin(a) + 2); 
    1027988    assert(findAmong(b, [ 4, 6, 7 ]) == end(b)); 
     989    assert(findAmong!("a==b")(a, b) == begin(a) + 2); 
     990    assert(findAmong!("a==b")(b, [ 4, 6, 7 ]) == end(b)); 
    1028991} 
    1029992 
     
    10491012---- 
    10501013*/ 
    1051 Iterator!(Range1) findAmongSorted(alias less, Range1, Range2)( 
     1014Iterator!(Range1) findAmongSorted(alias less = "a < b", Range1, Range2)( 
    10521015    Range1 seq, in Range2 choices) 
    10531016{ 
    1054     assert(isSorted!(less)(choices)); 
     1017    alias binaryFun!(less) lessFun; // pun not intended 
     1018    assert(isSorted!(lessFun)(choices)); 
    10551019    foreach (i, e; seq) 
    10561020    { 
    1057         if (canFindSorted!(less)(choices, e)) return begin(seq) + i; 
     1021        if (canFindSorted!(lessFun)(choices, e)) return begin(seq) + i; 
    10581022    } 
    10591023    return end(seq); 
    10601024} 
    10611025 
    1062 /// Ditto 
    1063 Iterator!(Range1) findAmongSorted( 
    1064     string less = q{a < b}, Range1, Range2)(Range1 seq, in Range2 subseq) 
    1065 
    1066     return .findAmongSorted!(binaryFun!(less), Range1, Range2)(seq, subseq); 
    1067 
    1068  
    1069 version (wyda) unittest 
     1026unittest 
    10701027{ 
    10711028    int[] a = [ -1, 0, 2, 1, 2, 3, 4, 5 ]; 
     
    10921049---- 
    10931050*/ 
    1094 bool canFind(alias pred, Range, E)(Range haystack, E needle) 
     1051bool canFind(alias pred = "a == b", Range, E)(Range haystack, E needle) 
    10951052{ 
    10961053    return find!(pred)(haystack, needle) != end(haystack); 
    1097 } 
    1098  
    1099 /// Ditto 
    1100 bool canFind(string pred = q{a == b}, Range, E)(Range haystack, E needle) 
    1101 { 
    1102     return find!(binaryFun!(pred), Range, E)(haystack, needle) != end(haystack); 
    11031054} 
    11041055 
     
    11101061 
    11111062/// Ditto 
    1112 bool canFind(string pred, Range)(Range haystack) 
    1113 { 
    1114     return find!(unaryFun!(pred))(haystack) != end(haystack); 
    1115 } 
    1116  
    1117 /// Ditto 
    11181063bool canFindAmong(alias pred, Range1, Range2)(Range1 seq, Range2 choices) 
    11191064{ 
    11201065    return findAmong!(pred)(seq, choices) != end(seq); 
    1121 } 
    1122  
    1123 /// Ditto 
    1124 bool canFindAmong(string pred, Range1, Range2)(Range1 seq, Range2 choices) 
    1125 { 
    1126     return findAmong!(binaryFun!(pred))(seq, choices) != end(seq); 
    11271066} 
    11281067 
     
    11301069bool canFindAmongSorted(alias pred, Range1, Range2)(Range1 seq, Range2 choices) 
    11311070{ 
    1132     return canFindAmongSorted!(pred)(seq, choices) != end(seq); 
    1133 
    1134  
    1135 /// Ditto 
    1136 bool canFindAmongSorted(string pred, Range1, Range2)( 
    1137     Range1 seq, Range2 choices) 
    1138 
    1139     return canFindAmongSorted!(pred)(seq, choices) != end(seq); 
     1071    return findAmongSorted!(pred)(seq, choices) != end(seq); 
    11401072} 
    11411073 
     
    11541086*/ 
    11551087 
    1156 size_t count(alias pred, Range, E)(Range r, E value) 
    1157 { 
    1158     bool pred2(typeof(*begin(r)) a) { return pred(a, value); } 
     1088size_t count(alias pred = "a == b", Range, E)(Range r, E value) 
     1089{ 
     1090    bool pred2(typeof(*begin(r)) a) { return binaryFun!(pred)(a, value); } 
    11591091    return count!(pred2)(r); 
    11601092} 
    11611093 
    1162 /// Ditto 
    1163 size_t count(string pred = "a == b", Range, E)( 
    1164     Range r, E value) 
    1165 
    1166     return count!(binaryFun!(pred), Range, E)(r, value); 
    1167 
    1168  
    1169 version (wyda) unittest 
     1094unittest 
    11701095{ 
    11711096    int[] a = [ 1, 2, 4, 3, 2, 5, 3, 2, 4 ]; 
     
    11891114    foreach (i; begin(r) .. end(r)) 
    11901115    { 
    1191         if (pred(*i)) ++result; 
     1116        if (unaryFun!(pred)(*i)) ++result; 
    11921117    } 
    11931118    return result; 
    11941119} 
    11951120 
    1196 /// Ditto 
    1197 size_t count(string pred, Range)(Range r) 
    1198 
    1199     return count!(unaryFun!(pred), Range)(r); 
    1200 
    1201  
    1202 version (wyda) unittest 
     1121unittest 
    12031122{ 
    12041123    int[] a = [ 1, 2, 4, 3, 2, 5, 3, 2, 4 ]; 
     
    12311150---- 
    12321151*/ 
    1233 bool equal(alias pred, Range1, Range2)(Range1 r1, Range2 r2) 
     1152bool equal(alias pred = "a == b", Range1, Range2)(Range1 r1, Range2 r2) 
    12341153{ 
    12351154    if (r1.length != r2.length) return false; 
     
    12381157} 
    12391158 
    1240 /// Ditto 
    1241 bool equal(string pred = q{a == b}, Range1, Range2)(Range1 r1, Range2 r2) 
    1242 
    1243     return equal!(binaryFun!(pred), Range1, Range2)(r1, r2); 
    1244 
    1245  
    1246 version (wyda) unittest 
     1159unittest 
    12471160{ 
    12481161    int[] a = [ 1, 2, 4, 3]; 
     
    13071220} 
    13081221 
    1309 version (wyda) unittest 
     1222unittest 
    13101223{ 
    13111224    int a = 5; 
     
    13821295} 
    13831296 
    1384 version (wyda) unittest 
     1297unittest 
    13851298{ 
    13861299    int a = 5; 
     
    14201333 
    14211334Tuple!(Iterator!(Range1), Iterator!(Range2)) 
    1422 mismatch(alias pred, Range1, Range2)(Range1 r1, Range2 r2) 
     1335mismatch(alias pred = "a == b", Range1, Range2)(Range1 r1, Range2 r2) 
    14231336{ 
    14241337    auto i1 = begin(r1), i2 = begin(r2), e1 = end(r1), e2 = end(r2); 
    14251338    for (; i1 != e1 && i2 != e2; ++i1, ++i2) 
    14261339    { 
    1427         if (!pred(*i1, *i2)) break; 
     1340        if (!binaryFun!(pred)(*i1, *i2)) break; 
    14281341    } 
    14291342    return tuple(i1, i2); 
    14301343} 
    14311344 
    1432 /// Ditto 
    1433 Tuple!(Iterator!(Range1), Iterator!(Range2)) 
    1434 mismatch(string pred = q{a == b}, Range1, Range2)(Range1 r1, Range2 r2) 
    1435 
    1436     return .mismatch!(binaryFun!(pred), Range1, Range2)(r1, r2); 
    1437 
    1438  
    1439 version (wyda) unittest 
     1345unittest 
    14401346{ 
    14411347    // doc example 
     
    16601566} 
    16611567 
    1662 version (wyda) unittest 
     1568unittest 
    16631569{ 
    16641570    assert(levenshteinDistance("a", "a") == 0); 
     
    17201626} 
    17211627 
    1722 version (wyda) unittest 
     1628unittest 
    17231629{ 
    17241630    int[] a = [ 1, 5 ]; 
     
    17631669    foreach (s; begin(source) .. end(source)) 
    17641670    { 
    1765         if (!pred(*s)) continue; 
     1671        if (!unaryFun!(pred)(*s)) continue; 
    17661672        if (t == te) enforce(false, 
    17671673                             "copyIf: insufficient space in target range"); 
     
    17721678} 
    17731679 
    1774 Range2 copyIf(string pred, Range1, Range2)(Range1 source, Range2 target) 
    1775 
    1776     return .copyIf!(unaryFun!(pred), Range1, Range2)(source, target); 
    1777 
    1778  
    1779 version (wyda) unittest 
     1680unittest 
    17801681{ 
    17811682    int[] a = [ 1, 5 ]; 
     
    18531754} 
    18541755 
    1855 version (wyda) unittest 
     1756unittest 
    18561757{ 
    18571758    int[] range = null; 
     
    19261827} 
    19271828 
    1928 version (wyda) unittest 
     1829unittest 
    19291830{ 
    19301831    // doc example 
     
    20331934} 
    20341935 
    2035 version (wyda) unittest 
     1936unittest 
    20361937{ 
    20371938    int[] arr = [ 1, 2, 3, 4, 5 ]; 
     
    20541955---- 
    20551956*/ 
    2056 Range eliminate(alias pred
     1957Range eliminate(alias pred = "a == b"
    20571958                SwapStrategy ss = SwapStrategy.semistable, 
    20581959                Range, Value)(Range r, Value v) 
    20591960{ 
    20601961    alias Iterator!(Range) It; 
    2061     bool comp(typeof(*It) a) { return !pred(a, v); } 
     1962    bool comp(typeof(*It) a) { return !binaryFun!(pred)(a, v); } 
    20621963    static void assignIterB(It a, It b) { *a = *b; } 
    20631964    return range(begin(r),  
    2064                  partition!(comp, 
    2065                             ss, assignIterB, Range)(r)); 
    2066 
    2067  
    2068 /// Ditto 
    2069 Range eliminate(string pred = "a == b", 
    2070                 SwapStrategy ss = SwapStrategy.semistable, 
    2071                 Range, Value)(Range r, Value v) 
    2072 
    2073     return .eliminate!(binaryFun!(pred), ss, Range, Value)(r, v); 
    2074 
    2075  
    2076 version (wyda) unittest 
     1965            partition!(comp, 
     1966                    ss, assignIterB, Range)(r)); 
     1967
     1968 
     1969unittest 
    20771970{ 
    20781971    int[] arr = [ 1, 2, 3, 2, 4, 5, 2 ]; 
     
    22292122} 
    22302123 
    2231 version (wyda) unittest // partition 
     2124unittest // partition 
    22322125{ 
    22332126    auto Arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 
     
    24082301BUGS: 
    24092302 
    2410 stable topN has not been implemented yet. 
    2411 */ 
    2412 void topN(alias less
     2303Stable topN has not been implemented yet. 
     2304*/ 
     2305void topN(alias less = "a < b"
    24132306                SwapStrategy ss = SwapStrategy.unstable, 
    24142307                alias iterSwap = .iterSwap, Range, It)(Range r, It nth) 
     
    24232316        auto pivot = b + (e - b) / 2; 
    24242317        auto pivotVal = *pivot; 
    2425         bool pred(ElementType!(Range) a) { return a < pivotVal; } 
     2318        bool pred(ElementType!(Range) a) 
     2319        { 
     2320            return binaryFun!(less)(a, pivotVal); 
     2321        } 
    24262322        iterSwap(pivot, e - 1); 
    24272323        pivot = partition!(pred, ss, iterSwap)(range(b, e)); 
     
    24332329} 
    24342330 
    2435 /// Ditto 
    2436 void topN(string less = q{a < b}, 
    2437                 SwapStrategy ss = SwapStrategy.unstable, 
    2438                 alias iterSwap = .iterSwap, Range, It)(Range r, It nth) 
    2439 
    2440     return .topN!(binaryFun!(less), ss, iterSwap, Range, It)(r, nth); 
    2441 
    2442  
    2443 version (wyda) unittest 
     2331unittest 
    24442332{ 
    24452333    scope(failure) writeln(stderr, "Failure testing algorithm"); 
     
    25002388*/ 
    25012389 
    2502 void sort(alias less, SwapStrategy ss = SwapStrategy.unstable, 
     2390void sort(alias less = "a < b", SwapStrategy ss = SwapStrategy.unstable, 
    25032391          alias iterSwap = .iterSwap, Range)(Range r) 
    25042392{ 
    2505     static if (is(typeof(less(*begin(r), *end(r))) == bool)) 
    2506     { 
    2507         sortImpl!(less, ss, iterSwap)(r); 
    2508         assert(isSorted!(less)(r)); 
     2393    alias binaryFun!(less) lessFun; 
     2394    static if (is(typeof(lessFun(*begin(r), *end(r))) == bool)) 
     2395    { 
     2396        sortImpl!(lessFun, ss, iterSwap)(r); 
     2397        assert(isSorted!(lessFun)(r)); 
    25092398    } 
    25102399    else 
    25112400    { 
    2512         static assert(false, typeof(&less).stringof); 
    2513     } 
    2514 
    2515  
    2516 /// Ditto 
    2517 void sort(string less = q{a < b}, SwapStrategy ss = SwapStrategy.unstable, 
    2518           alias iterSwap = .iterSwap, Range)(Range r) 
    2519 
    2520     return .sort!(binaryFun!(less), ss, iterSwap, Range)(r); 
    2521 
    2522  
    2523 version (wyda) unittest 
     2401        static assert(false, "Invalid predicate passed to sort"); 
     2402    } 
     2403
     2404 
     2405unittest 
    25242406{ 
    25252407    // sort using delegate 
     
    26992581created. 
    27002582*/ 
    2701 void schwartzSort(alias transform, alias less
     2583void schwartzSort(alias transform, alias less = "a < b"
    27022584                  SwapStrategy ss = SwapStrategy.unstable, Range)(Range r) 
    27032585{ 
     
    27202602} 
    27212603 
    2722 /// Ditto 
    2723 void schwartzSort(alias transform, string less = q{a < b}, 
    2724                   SwapStrategy ss = SwapStrategy.unstable, Range)(Range r) 
    2725 
    2726     return .schwartzSort!(transform, binaryFun!(less), ss, Range)(r); 
    2727 
    2728  
    2729 version (wyda) unittest 
     2604unittest 
    27302605{ 
    27312606    static double entropy(double[] probs) { 
     
    27762651---- 
    27772652*/ 
    2778 void partialSort(alias less, SwapStrategy ss = SwapStrategy.unstable, 
     2653void partialSort(alias less = "a < b", SwapStrategy ss = SwapStrategy.unstable, 
    27792654    alias iterSwap = .iterSwap, Range, It)(Range r, It mid) 
    27802655{ 
     
    27832658} 
    27842659 
    2785 /// Ditto 
    2786 void partialSort(string less = "a < b", 
    2787     SwapStrategy ss = SwapStrategy.unstable, 
    2788     alias iterSwap = .iterSwap, Range, It)(Range r, It mid) 
    2789 
    2790     return .partialSort!(binaryFun!(less), ss, iterSwap, Range, It)(r, mid); 
    2791 
    2792  
    2793 version (wyda) unittest 
     2660unittest 
    27942661{ 
    27952662    int[] a = [ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 ]; 
     
    28942761    SRange, TRange)(SRange source, TRange target) 
    28952762{ 
     2763    alias binaryFun!(less) lessFun; 
    28962764    static assert(ss == SwapStrategy.unstable, 
    28972765                  "Stable indexing not yet implemented"); 
     
    29162784    bool indirectLess(TElem a, TElem b) 
    29172785    { 
    2918         return less(*index2iter(a), *index2iter(b)); 
     2786        return lessFun(*index2iter(a), *index2iter(b)); 
    29192787    } 
    29202788    void indirectCopy(SIter from, ref TElem to) 
     
    29522820        for (; sb != se; ++sb) 
    29532821        { 
    2954             if (!less(*sb, *index2iter(*tb))) continue; 
     2822            if (!lessFun(*sb, *index2iter(*tb))) continue; 
    29552823            // copy the source over the smallest 
    29562824            indirectCopy(sb, *tb); 
     
    30272895} 
    30282896 
    3029 /// Ditto 
    3030 void partialIndex( 
    3031     string less, 
    3032     SwapStrategy ss = SwapStrategy.unstable, 
    3033     alias iterSwap = .iterSwap, 
    3034     SRange, TRange)(SRange source, TRange target) 
    3035 
    3036     return .topNIndexImpl!(binaryFun!(less), true, ss, iterSwap)(source, target); 
    3037 
    3038  
    3039 version (wyda) unittest 
     2897unittest 
    30402898{ 
    30412899    invariant arr = [ 2, 3, 1 ]; 
     
    30462904} 
    30472905 
    3048 version (wyda) unittest 
     2906unittest 
    30492907{ 
    30502908    static bool less(int a, int b) { return a < b; } 
     
    32243082---- 
    32253083*/ 
    3226 Iterator!(Range) lowerBound(alias less, Range, V)(Range r, V value) 
    3227 
    3228     //assert(isSorted!(less)(r)); 
     3084Iterator!(Range) lowerBound(alias less = "a < b", Range, V)(Range r, V value) 
     3085
    32293086    auto first = begin(r); 
    32303087    auto count = end(r) - first; 
     
    32333090        invariant step = count / 2; 
    32343091        auto it = first + step; 
    3235         if (less(*it, value)) 
     3092        if (binaryFun!(less)(*it, value)) 
    32363093        { 
    32373094            first = it + 1; 
     
    32463103} 
    32473104 
    3248 /// Ditto 
    3249 Iterator!(Range) lowerBound(string less = q{a < b}, Range, V)(Range r, V value) 
    3250 
    3251     return .lowerBound!(binaryFun!(less), Range, V)(r, value); 
    3252 
    3253  
    3254 version (wyda) unittest 
     3105unittest 
    32553106{ 
    32563107    int[] a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]; 
     
    32833134---- 
    32843135*/ 
    3285 Iterator!(Range) upperBound(alias less, Range, V)(Range r, V value) 
    3286 
    3287     //assert(isSorted!(less)(r)); 
     3136Iterator!(Range) upperBound(alias less = "a < b", Range, V)(Range r, V value) 
     3137
    32883138    auto first = begin(r); 
    32893139    size_t count = end(r) - first; 
     
    32923142        auto step = count / 2; 
    32933143        auto it = first + step; 
    3294         if (!less(value,*it)) 
     3144        if (!binaryFun!(less)(value,*it)) 
    32953145        { 
    32963146            first = it + 1; 
     
    33023152} 
    33033153 
    3304 /// Ditto 
    3305 Iterator!(Range) upperBound(string less = q{a < b}, Range, V)(Range r, V value) 
    3306 
    3307     return .upperBound!(binaryFun!(less), Range, V)(r, value); 
    3308 
    3309  
    3310 version (wyda) unittest 
     3154unittest 
    33113155{ 
    33123156    auto a = [ 1, 2, 3, 3, 3, 4, 4, 5, 6 ]; 
     
    33383182---- 
    33393183*/ 
    3340 Range equalRange(alias less, Range, V)(Range r, V value) 
    3341 { 
    3342     //assert(isSorted!(less)(r))
     3184Range equalRange(alias less = "a < b", Range, V)(Range r, V value) 
     3185{ 
     3186    alias binaryFun!(less) lessFun
    33433187    auto first = begin(r), last = end(r); 
    33443188    for (size_t count = last - first; count > 0; ) 
     
    33463190        auto step = count / 2; 
    33473191        auto middle = first + step; 
    3348         if (less(*middle, value)) 
     3192        if (lessFun(*middle, value)) 
    33493193        { 
    33503194            first = middle + 1; 
    33513195            count -= step + 1; 
    33523196        } 
    3353         else if (less(value, *middle)) 
     3197        else if (lessFun(value, *middle)) 
    33543198        { 
    33553199            count = step; 
     
    33673211} 
    33683212 
    3369 /// Ditto 
    3370 Range equalRange(string less = q{a < b}, Range, V)(Range r, V value) 
    3371 
    3372     return .equalRange!(binaryFun!(less), Range, V)(r, value); 
    3373 
    3374  
    3375 version (wyda) unittest 
     3213unittest 
    33763214{ 
    33773215    int[] a = [ 1, 2, 3, 3, 3, 4, 4, 5, 6 ]; 
     
    33923230*/ 
    33933231 
    3394 bool canFindSorted(alias less, T, V)(T range, V value) 
     3232bool canFindSorted(alias less = "a < b", T, V)(T range, V value) 
    33953233{ 
    33963234    auto p = lowerBound!(less)(range, value); 
    3397     return p != end(range) && !less(value, *p); 
    3398 
    3399  
    3400 bool canFindSorted(string less = q{a < b}, T, V)(T range, V value) 
    3401 
    3402     return .canFindSorted!(binaryFun!(less), T, V)(range, value); 
    3403 
    3404  
    3405 version (wyda) unittest 
     3235    return p != end(range) && !binaryFun!(less)(value, *p); 
     3236
     3237 
     3238unittest 
    34063239{ 
    34073240    auto a = rndstuff!(int); 
     
    34193252*/ 
    34203253 
    3421 void makeHeap(alias less, alias iterSwap = .iterSwap, Range)(Range r) 
     3254void makeHeap(alias less = "a < b", alias iterSwap = .iterSwap, Range)(Range r) 
    34223255{ 
    34233256    if (r.length < 2) return; 
     
    34303263} 
    34313264 
    3432 version (wyda) unittest 
     3265unittest 
    34333266{ 
    34343267    // example from "Introduction to Algorithms" Cormen et al., p 146 
     
    34613294} 
    34623295 
    3463 version (wyda) unittest 
     3296unittest 
    34643297{ 
    34653298    // example from "Introduction to Algorithms" Cormen et al., p 143 
     
    35293362} 
    35303363 
    3531 version (wyda) unittest 
     3364unittest 
    35323365{ 
    35333366    auto r = Random(unpredictableSeed); 
     
    35423375// Internal random array generators 
    35433376 
    3544 version (wyda) version(unittest) 
     3377version(unittest) 
    35453378{ 
    35463379    private enum size_t maxArraySize = 50;