Changeset 2098
- Timestamp:
- 10/13/10 00:18:02 (14 years ago)
- Files:
-
- trunk/phobos/std/range.d (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/phobos/std/range.d
r2067 r2098 1073 1073 /** 1074 1074 Initializes the stride. 1075 1075 */ 1076 1076 this(R input, size_t n) 1077 1077 { 1078 1078 _input = input; 1079 1079 _n = n; 1080 1080 static if (hasLength!(R)) 1081 1081 { 1082 1082 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 1084 1095 if (!slack) return; 1085 1096 static if (isRandomAccessRange!(R) && hasSlicing!(R)) 1086 1097 { 1087 1098 _input = _input[0 .. _input.length - slack]; 1088 1099 } 1089 1100 else static if(isBidirectionalRange!(R)) 1090 1101 { 1091 1102 foreach (i; 0 .. slack) 1092 1103 { 1093 1104 if (_input.empty) break; … … 1165 1176 } 1166 1177 else 1167 1178 foreach (i; 0 .. _n) 1168 1179 { 1169 1180 _input.popFront; 1170 1181 if (_input.empty) break; 1171 1182 } 1172 1183 } 1173 1184 1174 1185 /** 1175 Forwards to $(D _input.pop Front).1186 Forwards to $(D _input.popBack). 1176 1187 */ 1177 1188 static if (isBidirectionalRange!(R) && hasLength!(R)) 1178 1189 void popBack() 1179 1190 { 1180 assert(_input.length >= _n);1191 assert(_input.length >= 1); 1181 1192 static if (isRandomAccessRange!(R) && hasSlicing!(R)) 1182 1193 { 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 } 1184 1199 } 1185 1200 else 1186 1201 { 1187 1202 foreach (i; 0 .. _n) 1188 1203 { 1189 1204 if (_input.empty) break; 1190 1205 _input.popBack; 1191 1206 } 1192 1207 } 1193 1208 } … … 1307 1322 assert(equal(s1[1..5], [2, 3, 4, 5])); 1308 1323 assert(s1[1..5].length == 4); 1309 1324 assert(s1[0..0].empty); 1310 1325 1311 1326 auto s2 = stride(arr, 2); 1312 1327 assert(equal(s2[0..2], [1,3])); 1313 1328 assert(s2[0..2].length == 2); 1314 1329 assert(equal(s2[1..5], [3, 5, 7, 9])); 1315 1330 assert(s2[1..5].length == 4); 1316 1331 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 1317 1339 1318 1340 static assert(is(Stride!(immutable int[]))); 1319 1341 1320 1342 // Check for infiniteness propagation. 1321 1343 static assert(isInfinite!(typeof(stride(repeat(1), 3)))); 1322 1344 1323 1345 foreach(DummyType; AllDummyRanges) { 1324 1346 DummyType dummyRange; 1325 1347 dummyRange.reinit(); 1326 1348
