SymOps.cpp

00001 /*          
00002  *             Copyright (C) 2005 Maarten Keijzer
00003  *
00004  *          This program is free software; you can redistribute it and/or modify
00005  *          it under the terms of version 2 of the GNU General Public License as 
00006  *          published by the Free Software Foundation. 
00007  *
00008  *          This program is distributed in the hope that it will be useful,
00009  *          but WITHOUT ANY WARRANTY; without even the implied warranty of
00010  *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00011  *          GNU General Public License for more details.
00012  *
00013  *          You should have received a copy of the GNU General Public License
00014  *          along with this program; if not, write to the Free Software
00015  *          Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00016  */
00017 
00018 #include "FunDef.h"
00019 #include "SymOps.h"
00020 #include "Sym.h"
00021 
00022 using namespace std;
00023 
00024 void collect(token_t t, Sym a, SymVec& args) {
00025     
00026     if (a.token() == t) {
00027         const SymVec& a_args = a.args();
00028         for (unsigned i = 0; i < a_args.size(); ++i) {
00029             collect(t, a_args[i], args);
00030         }
00031         return;
00032     }
00033      
00034     args.push_back(a);
00035 }
00036 
00037 Sym operator+(Sym a, Sym b) {
00038     
00039     SymVec args;
00040 
00041     collect(sum_token, a, args);
00042     collect(sum_token, b, args);
00043     
00044     return Sym(sum_token, args);
00045 }
00046 
00047 Sym operator*(Sym a, Sym b) {
00048     
00049     SymVec args;
00050 
00051     collect(prod_token, a, args);
00052     collect(prod_token, b, args);
00053     
00054     return Sym(prod_token, args);
00055 }
00056 
00057 Sym operator/(Sym a, Sym b) {
00058     
00059     SymVec args;
00060 
00061     collect(prod_token, a, args);
00062     
00063     SymVec args2;
00064     collect(prod_token, b, args2);
00065     
00066     SymVec inv;
00067     inv.push_back(Sym(prod_token, args2));
00068     
00069     args.push_back( Sym(inv_token, inv) );
00070 
00071     return Sym(prod_token, args);
00072 }
00073 
00074 Sym operator-(Sym a, Sym b) {
00075     
00076     SymVec args;
00077 
00078     collect(sum_token, a, args);
00079     
00080     SymVec args2;
00081     collect(sum_token, b, args2);
00082     
00083     SymVec min;
00084     min.push_back(Sym(sum_token, args2));
00085     
00086     args.push_back( Sym(min_token, min) );
00087 
00088     return Sym(sum_token, args);
00089 }
00090 
00091 Sym operator-(Sym a) {
00092     return Sym(min_token, a);
00093 }
00094 
00095 Sym pow(Sym a, Sym b) {
00096     SymVec args;
00097     args.push_back(a);
00098     args.push_back(b);
00099     return Sym(pow_token, args);
00100 }
00101 
00102 Sym ifltz(Sym a, Sym b, Sym c) {
00103     SymVec args;
00104     args.push_back(a);
00105     args.push_back(b);
00106     args.push_back(c);
00107     return Sym(ifltz_token, args);
00108 }
00109 

Generated on Thu Oct 19 05:06:42 2006 for EO by  doxygen 1.3.9.1