Implicit conversions for AA keys

Timon Gehr timon.gehr at gmx.ch
Fri Mar 23 14:53:10 PDT 2012


On 03/23/2012 10:07 PM, Timon Gehr wrote:
>
> I see. An alternative solution (one that does not make AAs depend on
> Phobos and is more slick) would be to use the const qualified key type
> for lookup (that is what const is for) and to have immutable keys for
> stores. For types that define .idup, there would be another overload of
> opIndexAssign that can take a const qualified key.

Proof of concept:

// ctfe-able simple and stupid replace
string replace(string str, string from, string to){
	string r = "";
	foreach(i; 0..str.length){
		if(i+from.length<=str.length &&
		   str[i..i+from.length]==from){
			r~=to;
			i+=from.length-1;
		}else r~=str[i];
	}
	return r;
}

template getConstQual(T){ // hack
	static if(is(T==string)) alias const(char)[] getConstQual;
	else alias const(typeof(mixin(`(`~T.stringof.
	  replace("immutable","const")~`).init`))) getConstQual;
}

int numidup = 0;

struct AA(Key, Value) if(is(Key:immutable(Key))){
	Value[Key] payload;
	auto opIndex(getConstQual!Key k){return payload[cast(immutable)k];}
	auto opIndexAssign(Value v, Key k){return payload[cast(immutable)k]=v;}
	static if(is(typeof(getConstQual!Key.init.idup))){
		auto opIndexAssign(Value v, getConstQual!Key k){
			if(auto p = (cast(immutable)k) in payload) return *p=v;
			numidup++;
			return payload[k.idup]=v;
		}
	}
}

void main() {
	AA!(string, int) aa;
	aa["123"] = 123;
	char[3] ch = "123";
	assert(aa[ch] == 123);
	ch[1]='3';
	assert(numidup == 0);
	aa[ch]=133;
	assert(numidup == 1);
	assert(aa["133"]==133);
	ch[0]='3';
	assert(aa["133"]==133);
	assert(numidup == 1);
}


More information about the Digitalmars-d mailing list