Changeset 1690
- Timestamp:
- 06/23/10 15:50:01 (14 years ago)
- Files:
-
- trunk/phobos/std/range.d (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/phobos/std/range.d
r1689 r1690 2169 2169 this.pastLast = pastLast - 1; 2170 2170 this.pastLast -= (this.pastLast - current) % step; 2171 2171 } 2172 2172 else 2173 2173 { 2174 2174 this.pastLast = pastLast + 1; 2175 2175 this.pastLast += (this.pastLast - current) % step; 2176 2176 } 2177 2177 this.pastLast += step; 2178 2178 } 2179 bool empty() const { return current == pastLast; } 2180 N front() { return current; } 2179 /// Ditto 2180 @property bool empty() const { return current == pastLast; } 2181 /// Ditto 2182 @property N front() { return current; } 2183 /// Ditto 2181 2184 alias front moveFront; 2185 /// Ditto 2182 2186 void popFront() 2183 2187 { 2184 2188 current += step; 2185 2189 } 2186 N back() { return pastLast - step; } 2190 /// Ditto 2191 @property N back() { return pastLast - step; } 2192 /// Ditto 2187 2193 alias back moveBack; 2194 /// Ditto 2188 2195 void popBack() 2189 2196 { 2190 2197 pastLast -= step; 2191 2198 } 2192 Iota save() { return this; } 2199 /// Ditto 2200 @property Iota save() { return this; } 2201 /// Ditto 2193 2202 N opIndex(size_t n) 2194 2203 { 2195 2204 return current + step * n; 2196 2205 } 2197 size_t length() 2206 /// Ditto 2207 @property Select!(max(N.sizeof, S.sizeof) > size_t.sizeof, ulong, size_t) 2208 length() const 2198 2209 { 2199 2210 return (pastLast - current) / step; 2200 2211 } 2201 2212 } 2202 2213 2203 2214 // Iota for floating-point numbers 2204 2215 /// Ditto 2205 2216 struct Iota(N, S) if (isFloatingPoint!N && isNumeric!S) { 2206 2217 private N start; 2207 2218 private S step; 2208 2219 private size_t index, count; 2209 2220 this(N start, N end, S step) 2210 2221 { 2211 2222 this.start = start; 2212 2223 this.step = step; 2213 enforce(step != 0 2214 && (start <= end && step > 0 || start >= end && step < 0)); 2224 enforce(step != 0); 2215 2225 immutable fcount = (end - start) / step; 2216 2226 enforce(fcount >= 0, "iota: incorrect startup parameters"); 2217 2227 count = to!size_t(fcount); 2218 2228 auto pastEnd = start + count * step; 2219 2229 if (step > 0) 2220 2230 { 2221 2231 if (pastEnd < end) ++count; 2222 assert(start + count * step >= end , text(count));2232 assert(start + count * step >= end); 2223 2233 } 2224 2234 else 2225 2235 { 2226 2236 if (pastEnd > end) ++count; 2227 2237 assert(start + count * step <= end); 2228 2238 } 2229 2239 } 2230 bool empty() const { return index == count; } 2231 N front() { return start + step * index; } 2240 /// Range primitives 2241 @property bool empty() const { return index == count; } 2242 /// Ditto 2243 @property N front() { return start + step * index; } 2244 /// Ditto 2232 2245 alias front moveFront; 2246 /// Ditto 2233 2247 void popFront() 2234 2248 { 2235 2249 enforce(!empty); 2236 2250 ++index; 2237 2251 } 2238 N back() 2252 /// Ditto 2253 @property N back() 2239 2254 { 2240 2255 enforce(!empty); 2241 2256 return start + step * (count - 1); 2242 2257 } 2258 /// Ditto 2243 2259 alias back moveBack; 2260 /// Ditto 2244 2261 void popBack() 2245 2262 { 2246 2263 enforce(!empty); 2247 2264 --count; 2248 2265 } 2249 Iota save() { return this; } 2266 /// Ditto 2267 @property Iota save() { return this; } 2268 /// Ditto 2250 2269 N opIndex(size_t n) 2251 2270 { 2252 2271 enforce(n < count); 2253 2272 return start + step * n; 2254 2273 } 2255 size_t length() 2274 /// Ditto 2275 @property size_t length() const 2256 2276 { 2257 2277 return count; 2258 2278 } 2259 2279 } 2260 2280 2261 2281 unittest 2262 2282 { 2263 2283 auto r = iota(0, 10, 1); 2264 2284 assert(equal(r, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9][])); 2265 2285 auto rr = iota(10); … … 2282 2302 //foreach (e; rf) writeln(e); 2283 2303 assert(approxEqual(rf, [0.0, 0.1, 0.2, 0.3, 0.4, 0.5][])); 2284 2304 2285 2305 // going down 2286 2306 rf = iota(0.0, -0.5, -0.1); 2287 2307 //foreach (e; rf) writeln(e); 2288 2308 assert(approxEqual(rf, [0.0, -0.1, -0.2, -0.3, -0.4][])); 2289 2309 rf = iota(0.0, nextDown(-0.5), -0.1); 2290 2310 //foreach (e; rf) writeln(e); 2291 2311 assert(approxEqual(rf, [0.0, -0.1, -0.2, -0.3, -0.4, -0.5][])); 2312 2313 // iota of longs 2314 auto rl = iota(5_000_000L); 2315 assert(rl.length == 5_000_000L); 2292 2316 } 2293 2317 2294 2318 unittest 2295 2319 { 2296 2320 auto idx = new size_t[100]; 2297 2321 copy(iota(0, idx.length), idx); 2298 2322 } 2299 2323 2300 2324 /** 2301 2325 Options for the $(D FrontTransversal) and $(D Transversal) ranges
