]> www.ginac.de Git - ginac.git/blobdiff - ginac/ex.cpp
Add support for Texinfo-5.0.
[ginac.git] / ginac / ex.cpp
index ea4176eea61bf8b7c5e2ee01cf07b5689a7aeb4d..21cb140aa8e0291c531612b571f291a0cde17002 100644 (file)
@@ -3,7 +3,7 @@
  *  Implementation of GiNaC's light-weight expression handles. */
 
 /*
- *  GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2011 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
  *
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <iostream>
-#include <stdexcept>
-
 #include "ex.h"
 #include "add.h"
 #include "mul.h"
 #include "ncmul.h"
 #include "numeric.h"
+#include "matrix.h"
 #include "power.h"
 #include "lst.h"
 #include "relational.h"
-#include "input_lexer.h"
 #include "utils.h"
 
+#include <iostream>
+#include <stdexcept>
+
 namespace GiNaC {
 
 //////////
@@ -73,7 +73,7 @@ void ex::dbgprinttree() const
 ex ex::expand(unsigned options) const
 {
        if (options == 0 && (bp->flags & status_flags::expanded)) // The "expanded" flag only covers the standard options; someone might want to re-expand with different options
-               return *bp;
+               return *this;
        else
                return bp->expand(options);
 }
@@ -94,7 +94,7 @@ ex ex::diff(const symbol & s, unsigned nth) const
 /** Check whether expression matches a specified pattern. */
 bool ex::match(const ex & pattern) const
 {
-       lst repl_lst;
+       exmap repl_lst;
        return bp->match(pattern, repl_lst);
 }
 
@@ -102,12 +102,10 @@ bool ex::match(const ex & pattern) const
  *  the "found" list. If the expression itself matches the pattern, the
  *  children are not further examined. This function returns true when any
  *  matches were found. */
-bool ex::find(const ex & pattern, lst & found) const
+bool ex::find(const ex & pattern, exset& found) const
 {
        if (match(pattern)) {
-               found.append(*this);
-               found.sort();
-               found.unique();
+               found.insert(*this);
                return true;
        }
        bool any_found = false;
@@ -240,6 +238,31 @@ ex ex::rhs() const
        return bp->op(1);
 }
 
+/** Check whether expression is a polynomial. */
+bool ex::is_polynomial(const ex & vars) const
+{
+       if (is_a<lst>(vars)) {
+               const lst & varlst = ex_to<lst>(vars);
+               for (lst::const_iterator i=varlst.begin(); i!=varlst.end(); ++i)
+                       if (!bp->is_polynomial(*i))
+                               return false;
+               return true;
+       }
+       else
+               return bp->is_polynomial(vars);
+}
+
+/** Check whether expression is zero or zero matrix. */
+bool ex::is_zero_matrix() const
+{
+       if (is_zero())
+               return  true;
+       else {
+               ex e = evalm();
+               return is_a<matrix>(e) && ex_to<matrix>(e).is_zero_matrix();
+       }
+}
+
 // private
 
 /** Make this ex writable (if more than one ex handle the same basic) by 
@@ -252,7 +275,7 @@ void ex::makewriteable()
 }
 
 /** Share equal objects between expressions.
- *  @see ex::compare(const basic &) */
+ *  @see ex::compare(const ex &) */
 void ex::share(const ex & other) const
 {
        if ((bp->flags | other.bp->flags) & status_flags::not_shareable)
@@ -329,55 +352,55 @@ basic & ex::construct_from_int(int i)
 {
        switch (i) {  // prefer flyweights over new objects
        case -12:
-               return const_cast<numeric &>(_num_12);
+               return *const_cast<numeric *>(_num_12_p);
        case -11:
-               return const_cast<numeric &>(_num_11);
+               return *const_cast<numeric *>(_num_11_p);
        case -10:
-               return const_cast<numeric &>(_num_10);
+               return *const_cast<numeric *>(_num_10_p);
        case -9:
-               return const_cast<numeric &>(_num_9);
+               return *const_cast<numeric *>(_num_9_p);
        case -8:
-               return const_cast<numeric &>(_num_8);
+               return *const_cast<numeric *>(_num_8_p);
        case -7:
-               return const_cast<numeric &>(_num_7);
+               return *const_cast<numeric *>(_num_7_p);
        case -6:
-               return const_cast<numeric &>(_num_6);
+               return *const_cast<numeric *>(_num_6_p);
        case -5:
-               return const_cast<numeric &>(_num_5);
+               return *const_cast<numeric *>(_num_5_p);
        case -4:
-               return const_cast<numeric &>(_num_4);
+               return *const_cast<numeric *>(_num_4_p);
        case -3:
-               return const_cast<numeric &>(_num_3);
+               return *const_cast<numeric *>(_num_3_p);
        case -2:
-               return const_cast<numeric &>(_num_2);
+               return *const_cast<numeric *>(_num_2_p);
        case -1:
-               return const_cast<numeric &>(_num_1);
+               return *const_cast<numeric *>(_num_1_p);
        case 0:
-               return const_cast<numeric &>(_num0);
+               return *const_cast<numeric *>(_num0_p);
        case 1:
-               return const_cast<numeric &>(_num1);
+               return *const_cast<numeric *>(_num1_p);
        case 2:
-               return const_cast<numeric &>(_num2);
+               return *const_cast<numeric *>(_num2_p);
        case 3:
-               return const_cast<numeric &>(_num3);
+               return *const_cast<numeric *>(_num3_p);
        case 4:
-               return const_cast<numeric &>(_num4);
+               return *const_cast<numeric *>(_num4_p);
        case 5:
-               return const_cast<numeric &>(_num5);
+               return *const_cast<numeric *>(_num5_p);
        case 6:
-               return const_cast<numeric &>(_num6);
+               return *const_cast<numeric *>(_num6_p);
        case 7:
-               return const_cast<numeric &>(_num7);
+               return *const_cast<numeric *>(_num7_p);
        case 8:
-               return const_cast<numeric &>(_num8);
+               return *const_cast<numeric *>(_num8_p);
        case 9:
-               return const_cast<numeric &>(_num9);
+               return *const_cast<numeric *>(_num9_p);
        case 10:
-               return const_cast<numeric &>(_num10);
+               return *const_cast<numeric *>(_num10_p);
        case 11:
-               return const_cast<numeric &>(_num11);
+               return *const_cast<numeric *>(_num11_p);
        case 12:
-               return const_cast<numeric &>(_num12);
+               return *const_cast<numeric *>(_num12_p);
        default:
                basic *bp = new numeric(i);
                bp->setflag(status_flags::dynallocated);
@@ -390,31 +413,31 @@ basic & ex::construct_from_uint(unsigned int i)
 {
        switch (i) {  // prefer flyweights over new objects
        case 0:
-               return const_cast<numeric &>(_num0);
+               return *const_cast<numeric *>(_num0_p);
        case 1:
-               return const_cast<numeric &>(_num1);
+               return *const_cast<numeric *>(_num1_p);
        case 2:
-               return const_cast<numeric &>(_num2);
+               return *const_cast<numeric *>(_num2_p);
        case 3:
-               return const_cast<numeric &>(_num3);
+               return *const_cast<numeric *>(_num3_p);
        case 4:
-               return const_cast<numeric &>(_num4);
+               return *const_cast<numeric *>(_num4_p);
        case 5:
-               return const_cast<numeric &>(_num5);
+               return *const_cast<numeric *>(_num5_p);
        case 6:
-               return const_cast<numeric &>(_num6);
+               return *const_cast<numeric *>(_num6_p);
        case 7:
-               return const_cast<numeric &>(_num7);
+               return *const_cast<numeric *>(_num7_p);
        case 8:
-               return const_cast<numeric &>(_num8);
+               return *const_cast<numeric *>(_num8_p);
        case 9:
-               return const_cast<numeric &>(_num9);
+               return *const_cast<numeric *>(_num9_p);
        case 10:
-               return const_cast<numeric &>(_num10);
+               return *const_cast<numeric *>(_num10_p);
        case 11:
-               return const_cast<numeric &>(_num11);
+               return *const_cast<numeric *>(_num11_p);
        case 12:
-               return const_cast<numeric &>(_num12);
+               return *const_cast<numeric *>(_num12_p);
        default:
                basic *bp = new numeric(i);
                bp->setflag(status_flags::dynallocated);
@@ -427,55 +450,55 @@ basic & ex::construct_from_long(long i)
 {
        switch (i) {  // prefer flyweights over new objects
        case -12:
-               return const_cast<numeric &>(_num_12);
+               return *const_cast<numeric *>(_num_12_p);
        case -11:
-               return const_cast<numeric &>(_num_11);
+               return *const_cast<numeric *>(_num_11_p);
        case -10:
-               return const_cast<numeric &>(_num_10);
+               return *const_cast<numeric *>(_num_10_p);
        case -9:
-               return const_cast<numeric &>(_num_9);
+               return *const_cast<numeric *>(_num_9_p);
        case -8:
-               return const_cast<numeric &>(_num_8);
+               return *const_cast<numeric *>(_num_8_p);
        case -7:
-               return const_cast<numeric &>(_num_7);
+               return *const_cast<numeric *>(_num_7_p);
        case -6:
-               return const_cast<numeric &>(_num_6);
+               return *const_cast<numeric *>(_num_6_p);
        case -5:
-               return const_cast<numeric &>(_num_5);
+               return *const_cast<numeric *>(_num_5_p);
        case -4:
-               return const_cast<numeric &>(_num_4);
+               return *const_cast<numeric *>(_num_4_p);
        case -3:
-               return const_cast<numeric &>(_num_3);
+               return *const_cast<numeric *>(_num_3_p);
        case -2:
-               return const_cast<numeric &>(_num_2);
+               return *const_cast<numeric *>(_num_2_p);
        case -1:
-               return const_cast<numeric &>(_num_1);
+               return *const_cast<numeric *>(_num_1_p);
        case 0:
-               return const_cast<numeric &>(_num0);
+               return *const_cast<numeric *>(_num0_p);
        case 1:
-               return const_cast<numeric &>(_num1);
+               return *const_cast<numeric *>(_num1_p);
        case 2:
-               return const_cast<numeric &>(_num2);
+               return *const_cast<numeric *>(_num2_p);
        case 3:
-               return const_cast<numeric &>(_num3);
+               return *const_cast<numeric *>(_num3_p);
        case 4:
-               return const_cast<numeric &>(_num4);
+               return *const_cast<numeric *>(_num4_p);
        case 5:
-               return const_cast<numeric &>(_num5);
+               return *const_cast<numeric *>(_num5_p);
        case 6:
-               return const_cast<numeric &>(_num6);
+               return *const_cast<numeric *>(_num6_p);
        case 7:
-               return const_cast<numeric &>(_num7);
+               return *const_cast<numeric *>(_num7_p);
        case 8:
-               return const_cast<numeric &>(_num8);
+               return *const_cast<numeric *>(_num8_p);
        case 9:
-               return const_cast<numeric &>(_num9);
+               return *const_cast<numeric *>(_num9_p);
        case 10:
-               return const_cast<numeric &>(_num10);
+               return *const_cast<numeric *>(_num10_p);
        case 11:
-               return const_cast<numeric &>(_num11);
+               return *const_cast<numeric *>(_num11_p);
        case 12:
-               return const_cast<numeric &>(_num12);
+               return *const_cast<numeric *>(_num12_p);
        default:
                basic *bp = new numeric(i);
                bp->setflag(status_flags::dynallocated);
@@ -488,31 +511,31 @@ basic & ex::construct_from_ulong(unsigned long i)
 {
        switch (i) {  // prefer flyweights over new objects
        case 0:
-               return const_cast<numeric &>(_num0);
+               return *const_cast<numeric *>(_num0_p);
        case 1:
-               return const_cast<numeric &>(_num1);
+               return *const_cast<numeric *>(_num1_p);
        case 2:
-               return const_cast<numeric &>(_num2);
+               return *const_cast<numeric *>(_num2_p);
        case 3:
-               return const_cast<numeric &>(_num3);
+               return *const_cast<numeric *>(_num3_p);
        case 4:
-               return const_cast<numeric &>(_num4);
+               return *const_cast<numeric *>(_num4_p);
        case 5:
-               return const_cast<numeric &>(_num5);
+               return *const_cast<numeric *>(_num5_p);
        case 6:
-               return const_cast<numeric &>(_num6);
+               return *const_cast<numeric *>(_num6_p);
        case 7:
-               return const_cast<numeric &>(_num7);
+               return *const_cast<numeric *>(_num7_p);
        case 8:
-               return const_cast<numeric &>(_num8);
+               return *const_cast<numeric *>(_num8_p);
        case 9:
-               return const_cast<numeric &>(_num9);
+               return *const_cast<numeric *>(_num9_p);
        case 10:
-               return const_cast<numeric &>(_num10);
+               return *const_cast<numeric *>(_num10_p);
        case 11:
-               return const_cast<numeric &>(_num11);
+               return *const_cast<numeric *>(_num11_p);
        case 12:
-               return const_cast<numeric &>(_num12);
+               return *const_cast<numeric *>(_num12_p);
        default:
                basic *bp = new numeric(i);
                bp->setflag(status_flags::dynallocated);
@@ -529,17 +552,6 @@ basic & ex::construct_from_double(double d)
        return *bp;
 }
 
-ptr<basic> ex::construct_from_string_and_lst(const std::string &s, const ex &l)
-{
-       set_lexer_string(s);
-       set_lexer_symbols(l);
-       ginac_yyrestart(NULL);
-       if (ginac_yyparse())
-               throw (std::runtime_error(get_parser_error()));
-       else
-               return parsed_ex.bp;
-}
-       
 //////////
 // static member variables
 //////////