[GiNaC-list] extending the symbol

Krishna Mohan Gundu gkmohan at gmail.com
Sun Oct 5 03:58:25 CEST 2008


Hi,

> Is there a better way to test if a symbol is a vector? If not what is
> the simplest way to extend symbol?

I looked at the implementation of realsymb and have come to the
conclusion that the current implementation of symbol is not
extensible. Should we change domain to be a type_info class (or a
lighter version if required)? This we we can make symbol extensible.
For example

class symbol_base : class basic
{
   ...
   symbol_base(const std::string & initname, type_info* ti);
   ...
   type_info const& get_domain_type() const
   {
      return *pti;
   }
   ...
private:
   type_info const* pti;
   ...
};

template<class domain_type>
class domain_symbol : public symbol_base
{
public:
   domain_symbol(const std::string & initname)
   : symbol_base(initname, typeid(domain_type))
   {
   }
};

struct real_domain {};
struct complex_domain {};
struct vector_domain {};

typedef domain_symbol<real_domain> real_symbol;
typedef domain_symbol<complex_domain> complex_symbol;
typedef domain_symbol<vector_domain> vector_symbol;
typedef complex_symbol symbol;

template<class domain_type>
bool is_domain_a(const basic& obj)
{
   if (obj.tinfo() != &symbol::tinfo_static)
      return false;
   return type_info(domain_type) == static_cast<const symbol
&>(obj).get_domain_type();
}

Now things like
   is_domain_a<real_domain>(e)
   is_domain_a<vector_domain>(e)
makes sense.

There is one thing I did not understand though. symbol definition has
    friend class realsymbol;
If this is required my approach (so is any other solution) is doomed,
as friend cannot be a template.

Let me know if you think of any simpler alternatives.

cheers,
Krishna.


More information about the GiNaC-list mailing list