Note: This website is archived. For up-to-date information about D projects and development, please visit wiki.dlang.org.

Changeset 2098

Show
Ignore:
Timestamp:
10/13/10 00:18:02 (14 years ago)
Author:
dsimcha
Message:

Bug 5035: Schrödinger's Stride

Files:

Legend:

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

    r2067 r2098  
    10731073/** 
    10741074Initializes the stride. 
    10751075 */ 
    10761076    this(R input, size_t n) 
    10771077    { 
    10781078        _input = input; 
    10791079        _n = n; 
    10801080        static if (hasLength!(R)) 
    10811081        { 
    10821082            auto slack = _input.length % _n; 
    1083             if (slack) slack--; 
     1083 
     1084            if (slack) 
     1085            { 
     1086                slack--; 
     1087            } else if(input.length > 0) 
     1088            { 
     1089                slack = min(n, input.length) - 1; 
     1090            } else 
     1091            { 
     1092                slack = 0; 
     1093            } 
     1094 
    10841095            if (!slack) return; 
    10851096            static if (isRandomAccessRange!(R) && hasSlicing!(R)) 
    10861097            { 
    10871098                _input = _input[0 .. _input.length - slack]; 
    10881099            } 
    10891100            else static if(isBidirectionalRange!(R)) 
    10901101            { 
    10911102                foreach (i; 0 .. slack) 
    10921103                { 
    10931104                    if (_input.empty) break; 
     
    11651176        } 
    11661177        else 
    11671178            foreach (i; 0 .. _n) 
    11681179            { 
    11691180                _input.popFront; 
    11701181                if (_input.empty) break; 
    11711182            } 
    11721183    } 
    11731184 
    11741185/** 
    1175 Forwards to $(D _input.popFront). 
     1186Forwards to $(D _input.popBack). 
    11761187 */ 
    11771188    static if (isBidirectionalRange!(R) && hasLength!(R)) 
    11781189        void popBack() 
    11791190        { 
    1180             assert(_input.length >= _n); 
     1191            assert(_input.length >= 1); 
    11811192            static if (isRandomAccessRange!(R) && hasSlicing!(R)) 
    11821193            { 
    1183                 _input = _input[0 .. _input.length - _n]; 
     1194                if(_input.length < _n) { 
     1195                    _input = _input[0 .. 0]; 
     1196                } else { 
     1197                    _input = _input[0 .. _input.length - _n]; 
     1198                } 
    11841199            } 
    11851200            else 
    11861201            { 
    11871202                foreach (i; 0 .. _n) 
    11881203                { 
    11891204                    if (_input.empty) break; 
    11901205                    _input.popBack; 
    11911206                } 
    11921207            } 
    11931208        } 
     
    13071322    assert(equal(s1[1..5], [2, 3, 4, 5])); 
    13081323    assert(s1[1..5].length == 4); 
    13091324    assert(s1[0..0].empty); 
    13101325 
    13111326    auto s2 = stride(arr, 2); 
    13121327    assert(equal(s2[0..2], [1,3])); 
    13131328    assert(s2[0..2].length == 2); 
    13141329    assert(equal(s2[1..5], [3, 5, 7, 9])); 
    13151330    assert(s2[1..5].length == 4); 
    13161331    assert(s2[0..0].empty); 
     1332 
     1333    // Test fix for Bug 5035 
     1334    auto m = [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]; // 3 rows, 4 columns 
     1335    auto col = stride(m, 4); 
     1336    assert(equal(col, [1, 1, 1])); 
     1337    assert(equal(retro(col), [1, 1, 1])); 
     1338 
    13171339 
    13181340    static assert(is(Stride!(immutable int[]))); 
    13191341 
    13201342    // Check for infiniteness propagation. 
    13211343    static assert(isInfinite!(typeof(stride(repeat(1), 3)))); 
    13221344 
    13231345    foreach(DummyType; AllDummyRanges) { 
    13241346        DummyType dummyRange; 
    13251347        dummyRange.reinit(); 
    13261348