What is a short, fast way of testing whether x in [a, b]?

cy via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Feb 7 22:11:14 PST 2016


On Monday, 8 February 2016 at 03:09:53 UTC, Enjoys Math wrote:
> was wondering if there's a D
>> native way of doing it.

That is the D native way of doing it, but you could clean up a 
lot of the boilerplate with some more templates. Also, || tests 
for exclusion, as in whether something is NOT in the range [a,b] 
(it's either above or below).

Also not sure why you have EPS=1 for integers. 1 ∈ [1,1] but 1-1 
is outside of [1,1].

template EPS(T) {
	static if (is(T == double)) {
		T EPS = 0.000_000_001;
	}
	static if (is(T == float)) {
		T EPS = 0.000_001;
	}
	static if (is(T == int)) {
		T EPS = 0;
	}
}

struct DerpRange(T) {
	T low;
	T hi;
}
// because the constructor Range(1,2) can't POSSIBLY be deduced
// to be Range!(int)(1,2)
DerpRange!T Range(T) (T low, T hi) {
	return DerpRange!T(low, hi);
}


bool in_range(T) (T what, DerpRange!T range) {
	return
		what - EPS!T >= range.low &&
		what + EPS!T <= range.hi;
}

bool in_range(T) (T what, T low, T hi) {
	return in_range(what,DerpRange!T(low,hi));
}

void main() {
	import std.stdio: writeln;

	void check(bool success) {
		if(success) {
			writeln("yay!");
		} else {
			throw new Exception("fail...");
		}
	}
	check(!in_range(3,4,5));
	check(in_range(3,3,5));
	check(in_range(3,2,5));
	check(in_range(3,2,3));
	check(!in_range(3,2,2));
	check(in_range(3,Range(0,99)));
	auto r = Range(0,99);
	check(in_range(42,r));

	for(int i=0;i<10;++i) {
		import std.random: uniform;
		int what = uniform!"[]"(0,99);
		check(in_range(what,r));
		check(in_range(what,0,99));
		check(in_range(what,Range(0,99)));
	}
}



More information about the Digitalmars-d-learn mailing list