TypeInfo.next implementation
Benjamin Thaut
code at benjamin-thaut.de
Tue Feb 19 22:10:33 PST 2013
While working on my TypeInfo comparison pull request I came across the
following issue:
TypeInfo.next currently is implemented in such a way that elements in
the cain that come right after a TypeInfo_Const, TypeInfo_Shared or
TypeInfo_Immutable are jumped. This was quite confusing to me, as I
assume that next simply returns the next element in the cain. For some
situations walking the chain without jumping any elements is neccessary
(e.g. comparing TypeInfo objects, formating functions).
First consider the following type const(const(int)[])
The type chain will look as follows: const -> array -> const -> int
Calling next once with the current behavior will return: const -> int
Calling next with the jumping removed will return: array -> const -> int
Now I'm currently thinking which of the following options would be the best:
For all options I would implement a "unqualified" property for TypeInfo
which will return this in all cases but shared, const and immutable. For
these it will return the internal base member and thus unqualify the
given TypeInfo.
Option 1:
Leave the old behavior and make the iterating logic more complex. e.g:
void iterateTypeInfoChain(const TypeInfo info)
{
writefln("%s", to!string(info.type));
switch(info.type)
{
case TypeInfo.Type._const:
case TypeInfo.Type._immutable:
case TypeInfo.Type._shared:
iterateTypeInfoChain(info.unqualified);
break;
default:
iterateTypeInfoChain(info.next);
break;
}
}
Option 2:
Change the behavior of TypeInfo.next to always return the next element
in the chain and then find and fix all places that rely on the old
behavior by replacing ".next" with ".unqualified.next"
Option 3:
Add a "nextTypeInfo" property that will return the next element in the
chain and leave the "next" property as is. Iterating logic would then be:
void iterateTypeInfoChain(const TypeInfo info)
{
writefln("%s", to!string(info.type));
iterateTypeInfoChain(info.nextTypeInfo);
}
For anyone wondering: The iterating logic presented here uses tail
recursion because next currently returns a const(TypeInfo).
Kind Regards
Benjamin Thaut
More information about the Digitalmars-d
mailing list