std.range.iota enhancement: supporting more types (AKA issue 10762)

H. S. Teoh hsteoh at quickfur.ath.cx
Fri Dec 27 12:32:03 PST 2013


On Wed, Dec 25, 2013 at 02:30:45PM +0000, Francesco Cattoglio wrote:
> On Wednesday, 25 December 2013 at 10:58:53 UTC, bearophile wrote:
[...]
> >(A less important enhancement is issue 11252).
> On the other hand, I have honestly no idea whatsoever about how to
> implement this
[...]

It should only be supported for numeric types (i.e., that support
+, *, /). Here's a crude attempt at it:

	struct Iota(S,T,U) {
		S start;
		T end;
		U step;

		... // other stuff here

		bool opBinaryRight(string op)(V val)
			if (op=="in" &&
				is(V.init < S.init) &&
				is((V.init - S.init) % U.init) &&
				is(T.init >= V.init))
		{
			if (val < start || val >= end)
				return false;

			// Surprisingly, x%y actually appears to work
			// like fmod(x,y) in D for floating point types!
			// Not sure how to represent 0 in a generic way
			// though.
			return ((val - start) % step == 0);
		}
	}


T

-- 
What is Matter, what is Mind? Never Mind, it doesn't Matter.


More information about the Digitalmars-d mailing list