How about a Hash template?

Denis Koroskin 2korden at gmail.com
Fri Apr 29 06:50:26 PDT 2011


On Thu, 28 Apr 2011 03:10:15 +0400, Andrej Mitrovic  
<andrej.mitrovich at gmail.com> wrote:

> I often see code written like this:
>
> if (value == somevalue ||
>    value == someothervalue ||
>    value == yetanothervalue);
>
> You could use the switch statement. But that introduces indentation,
> and is rarely used for a couple of values.
>
> I really like the "in" keyword, and I also like hashes since they can
> potentially speed up look-ups compared to conventional arrays. So I
> thought it would be cool to have a Hash template that constructs an
> associative array which you can use especially in if statements when
> you just want to know if a runtime value matches some predetermined
> value.
>
> Here's my attempt at writing it:
> http://codepad.org/c4sYDSyR
>
> Whaddya think?

Try this:


import std.stdio;

struct Set(Keys...)
{
	bool opIn_r(Key)(Key key)
	{
		// TODO: Sort!(Keys)?
		foreach (k; Keys) {
			if (k == key) {
				return true;
			}
		}
		
		return false;
	}
}

Set!(Keys) set(Keys...)() {
	return Set!(Keys)();
}

void main()
{
	int needle = 42;
	bool result = needle in set!(1, 2, 3, 4, 5); // as opposed to needle == 1  
|| needle == 2 || ...
	
	writeln(result); // prints false
	
However, this only works with compile-time constants. Here is an extension  
to that (albeit probably less efficient):

	int k = 42;
	
	result = 1 in dynset(1, k, 3, 4, 5);
	writeln(result); // prints true
}

struct DynSet(Keys...)
{
	this(Keys keys)
	{
		this.keys = keys;
	}
	
	bool opIn_r(Key)(Key key)
	{
		foreach (k; keys) {
			if (k == key) {
				return true;
			}
		}
		
		return false;
	}
	
	private Keys keys;
}

DynSet!(Keys) dynset(Keys...)(Keys keys) {
	return DynSet!(Keys)(keys);
}


More information about the Digitalmars-d mailing list