On Thursday, February 07, 2013 21:46:20 Andrej Mitrovic wrote:
> On 2/7/13, Jonathan M Davis <jmdavisp...@gmx.com> wrote:
> > I don't think that such a function exists
> > though.
> 
> UFCS would do it:
> 
> import std.traits;
> 
> auto ref set(Hash, Key, Val)(Hash hash, Key key, Val val)
> if (isAssociativeArray!Hash &&
> is(Key : KeyType!Hash) &&
> is(Val : ValueType!Hash))
> {
> if (auto res = key in hash)
> {
> return res;
> }
> else
> {
> hash[key] = val;
> return key in hash;
> }
> }
> ...
> 
> auto exists = _dataMap.set(k, init);
> 
> Note the use of "is(Val : ValueType!Hash)" which checks if Val can be
> implicitly converted to the value type, it's to allow e.g. assigning
> integrals to double.

I'd probably just make it return Val*. I don't know what you gain by making it 
return auto ref.

But regardless, your function is just doing the same thing that the OP's code 
is doing except that it's encapsulating it nicely. So, it improves upon the 
OP's code but doesn't solve the primary complaint about efficiency. It should 
be 
possible for the AA to implement set so that it doesn't require more than one 
lookup, whereas this does up to three.

- Jonathan M Davis

Reply via email to