[GiNaC-list] new tinfo method makes is_a less efficient
Sheplyakov Alexei
varg at theor.jinr.ru
Mon Sep 10 18:24:47 CEST 2007
Hello!
First of all, it would be nice to see the actual code which proves $subject.
On Mon, Sep 10, 2007 at 04:26:49PM +0200, Diego Conti wrote:
> Unfortunately, the new tinfo mechanism in version 1.4.0 breaks my code,
> and I am not sure how to fix that. Basically, what I need is an
> efficient version of is_a (actually, is_a<ncmul>) that does not rely on
> dynamic_cast.
> With the old tinfo method, I could simply redefine:
>
> template<> inline bool is_a<ncmul>(const basic & obj)
> {
> return (obj.tinfo()&TINFO_MASK)==TINFO_ncmul;
> }
I think such a redifinition might break some GiNaC classes...
> where TINFO_MASK is the constant 0x001fffffU, and the classes I derived
> from ncmul had appropriate tinfo constants.
... but anyway, is it really faster?
> With the new method, where the tinfo_key is a pointer, the above code
> does not work. One obvious alternative is the following:
>
> struct tinfo_static_t
> <http://www.ginac.de/reference/structGiNaC_1_1tinfo__static__t.html>
> {
> const tinfo_static_t* derives_from; //NULL if derived from void,
> otherwise points to tinfo_static member in superclass
> <http://www.ginac.de/reference/structGiNaC_1_1tinfo__static__t.html>
> };
Ugh, now every object (even a symbol) carries information about relationship
between _all_ GiNaC classes. Not so nice.
> typedef const tinfo_static_t * tinfo_t;
>
> and then
>
> template <class T>
> inline bool is_a(const basic &obj)
> {
> const tinfo_static_t* tinfo=obj.tinfo();
> do
> {
> if (tinfo==&T::tinfo_static) return true;
> tinfo = tinfo->derives_from
> <http://www.ginac.de/reference/structGiNaC_1_1tinfo__static__t.html>;
> } while (tinfo!=NULL);
> return false;
> }
>
> This appears reasonably efficient,
Yes, but I doubt it will be any better than dynamic_cast. It uses very similar
technique (see e.g. <cxxabi.h> from GNU libstdc++).
Best regards,
Alexei.
--
All science is either physics or stamp collecting.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 827 bytes
Desc: Digital signature
Url : http://www.cebix.net/pipermail/ginac-list/attachments/20070910/dae185a1/attachment.pgp
More information about the GiNaC-list
mailing list