Implicit conversions for AA keys
H. S. Teoh
hsteoh at quickfur.ath.cx
Fri Mar 23 11:35:34 PDT 2012
On Fri, Mar 23, 2012 at 07:18:05PM +0100, Timon Gehr wrote:
> On 03/23/2012 07:10 PM, H. S. Teoh wrote:
> >On Fri, Mar 23, 2012 at 07:01:46PM +0100, Timon Gehr wrote:
> >>Why do you not just do the conversion and then compute the hash,
> >>even if the representation is the same?
> >
> >Because Andrei says that the .idup shouldn't be performed unless it's
> >necessary (e.g., you should be able to lookup char[] in a
> >string-keyed AA without incurring the overhead of an .idup each
> >time). The conversion is not needed if the hash computation doesn't
> >change and we don't need to create a new entry.
[...]
>
> That does not apply to your example with double and int. (I'd argue
> that actually the other overload should be chosen in that case,
> because the conversion is implicit)
Sorry, I didn't understand that... which other overload?
> For implicit .idup, one solution would be to compare immutable(Key)
> and immutable(T). If they are the same, then the representation is the
> same.
Excellent idea! I didn't think about using qualifier collapsing to check
for representation equivalence. Thanks! :-)
I think this issue is now solvable: if a key is implicitly convertible
to the AA key but it's *not* equivalent, then convert it first.
Otherwise, convert it later via .idup or some analogous mechanism.
template isEquiv(T,U) {
enum isEquiv = is(immutable(T)==immutable(U));
}
...
static if (is(InputKey : Key) && !isEquiv!(InputKey,Key))
// convert now
else
// convert later
T
--
The irony is that Bill Gates claims to be making a stable operating
system and Linus Torvalds claims to be trying to take over the world. --
Anonymous
More information about the Digitalmars-d
mailing list