X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?a=blobdiff_plain;f=ginac%2Fpower.h;h=46acef9773395f30cda05179af51fd0a88e97c4e;hb=cb83832adc13e5cca268c8fe0c6c0c98f0cc821e;hp=d13463af714df83e7a167fee4265f752e69b0d16;hpb=276f1bc79bd0f41a12fb45ece6c7857e13c6668e;p=ginac.git diff --git a/ginac/power.h b/ginac/power.h index d13463af..46acef97 100644 --- a/ginac/power.h +++ b/ginac/power.h @@ -3,7 +3,7 @@ * Interface to GiNaC's symbolic exponentiation (basis^exponent). */ /* - * GiNaC Copyright (C) 1999-2001 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -43,10 +43,10 @@ class power : public basic // other ctors public: - power(const ex & lh, const ex & rh); - power(const ex & lh, const numeric & rh); + power(const ex & lh, const ex & rh) : inherited(TINFO_power), basis(lh), exponent(rh) {} + template power(const ex & lh, const T & rh) : inherited(TINFO_power), basis(lh), exponent(rh) {} - // functions overriding virtual functions from bases classes + // functions overriding virtual functions from base classes public: void print(const print_context & c, unsigned level = 0) const; unsigned precedence(void) const {return 60;} @@ -80,9 +80,6 @@ protected: ex expand_add(const add & a, int n) const; ex expand_add_2(const add & a) const; ex expand_mul(const mul & m, const numeric & n) const; - //ex expand_commutative_3(const ex & basis, const numeric & exponent, - // unsigned options) const; - //ex expand_noncommutative(const ex & basis, const numeric & exponent, unsigned options) const; // member variables @@ -92,9 +89,11 @@ protected: }; // utility functions -inline const power &ex_to_power(const ex &e) + +/** Efficient specialization of is_exactly_a(obj) for power objects. */ +template<> inline bool is_exactly_a(const basic & obj) { - return static_cast(*e.bp); + return obj.tinfo()==TINFO_power; } // wrapper functions @@ -107,9 +106,18 @@ inline ex pow(const ex & b, const ex & e) { return power(b, e); } +template +inline ex pow(const T1 & b, const T2 & e) +{ + return power(ex(b), ex(e)); +} /** Square root expression. Returns a power-object with exponent 1/2. */ -ex sqrt(const ex & a); +inline ex sqrt(const ex & a) +{ + extern const ex _ex1_2; + return power(a,_ex1_2); +} } // namespace GiNaC