On Thu, Oct 11, 2012 at 10:39 PM, Xinliang David Li <davi...@google.com> wrote:
> On Thu, Oct 11, 2012 at 1:23 PM, Lawrence Crowl <cr...@googlers.com> wrote:
>> On 10/10/12, Xinliang David Li <davi...@google.com> wrote:
>>> In a different thread, I proposed the following alternative to 'try_xxx':
>>>
>>> template<typename T> T* symbol::cast_to(symbol* p) {
>>>    if (p->is<T>())
>>>       return static_cast<T*>(p);
>>>    return 0;
>>>  }
>>>
>>> cast:
>>>
>>> template<typename T> T& symbol:as(symbol* p) {
>>>    assert(p->is<T>())
>>>    return static_cast<T&>(*p);
>>>
>>>  }
>>
>> My concern here was never the technical feasibility, nor the
>> desirability of having the facility for generic code, but the amount
>> of the amount of typing in non-generic contexts.  That is
>>
>>   if (cgraph_node *q = p->try_function ())
>>
>> versus
>>
>>   if (cgraph_node *q = p->cast_to <cgraph_node *> ())
>>
>> I thought the latter would generate objections.  Does anyone object
>> to the extra typing?
>>
>> If not, I can make that change.
>
> Think about a more complex class hierarchy and interface consistency.
> I believe you don't want this:
>
> tree::try_decl () { .. }
> tree::try_ssa_name () { ..}
> tree::try_type() {...}
> tree::try_int_const () {..}
> tree::try_exp () { ...}
>  ..
>
> Rather one (or two with the const_cast version).
>
> template <T> T *tree::cast_to ()
> {
>    if (kind_ == kind_traits<T>::value)
>     return static_cast<T*> (this);
>
>  return 0;
> }

I also think that instead of

>>   if (cgraph_node *q = p->cast_to <cgraph_node *> ())

we want

  if ((q = cast_to <cgraph_node *> (p))

I see absolutely no good reason to make cast_to a member, given
that the language has static_cast, const_cast and stuff.  cast_to
would simply be our equivalent to dynamic_cast within our OO model.

Then I'd call it *_cast instead of cast_*, so, why not gcc_cast < >?
Or dyn_cast <> ().  That way

  if ((q = dyn_cast <function *> (p))

would be how to use it.  Small enough, compared to

  if ((q = p->try_function ()))

and a lot more familiar to folks knowing C++ (and probably doesn't make
a difference to others).

Thus, please re-use or follow existing concepts.

As for the example with tree we'd then have

  if ((q = dyn_cast <INTEGER_CST> (p)))

if we can overload on the template parameter kind (can we? typename vs. enum?)
or use tree_cast <> (no I don't want dyn_cast <tree_common> all around the
code).

Thanks,
Richard.

>
> thanks,
>
> David
>
>
>>
>> --
>> Lawrence Crowl

Reply via email to