proj home

Files   Classes   Functions   Hierarchy  

rpnsubtract Class Reference

#include <rpnfunc.h>

Inheritance diagram for rpnsubtract:
Collaboration diagram for rpnsubtract:

List of all members.

Public Member Functions

 rpnsubtract ()
 rpnsubtract (deque< rpnbase * > &ds, bool const evaluate=true)
 ~rpnsubtract ()
rpnbasecopy () const
void visit (deque< rpnbase * > &ds, rpninteger &n)
void visit (deque< rpnbase * > &ds, rpnreal &n)
void visit (deque< rpnbase * > &ds, rpncomplex &n)
string const name () const
void eval (deque< rpnbase * > &ds)


Detailed Description

Definition at line 895 of file rpnfunc.h.


Constructor & Destructor Documentation

rpnsubtract::rpnsubtract (  )  [inline]

Definition at line 899 of file rpnfunc.h.

Referenced by copy().

00899 {}

rpnsubtract::rpnsubtract ( deque< rpnbase * > &  ds,
bool const   evaluate = true 
)

Definition at line 2643 of file rpnfunc.cpp.

References eval().

02644 {
02645   if (evaluate)
02646     eval(ds);
02647   else
02648     ds.push_front(this);
02649 }

rpnsubtract::~rpnsubtract (  )  [inline]

Definition at line 901 of file rpnfunc.h.

00901 {}


Member Function Documentation

rpnbase * rpnsubtract::copy (  )  const [virtual]

Reimplemented from rpnfunction.

Definition at line 2651 of file rpnfunc.cpp.

References rpnsubtract().

02652 {
02653   return new rpnsubtract();
02654 }

void rpnsubtract::eval ( deque< rpnbase * > &  ds  )  [virtual]

Reimplemented from rpnfunction.

Definition at line 2656 of file rpnfunc.cpp.

References rpnbase::accept(), and rpnbase::dec().

Referenced by rpnsubtract().

02657 {
02658   if (ds.size()>1)
02659     ds[0]->accept(ds,*this);
02660 
02661   dec();
02662 }

string const rpnsubtract::name (  )  const [inline, virtual]

Reimplemented from rpnfunction.

Definition at line 908 of file rpnfunc.h.

00908 { return string("-"); }

void rpnsubtract::visit ( deque< rpnbase * > &  ds,
rpncomplex n 
) [virtual]

Reimplemented from rpnfunction.

Definition at line 2664 of file rpnfunc.cpp.

References rpnbase::dec(), rpnbase::iscomplex(), rpnbase::isinteger(), rpnbase::isreal(), and rpncomplex::num.

02665 {
02666   rpnbase* x0 = ds.front();
02667   ds.pop_front();
02668   rpnbase* x1 = ds.front();
02669   ds.pop_front();
02670 
02671   if (x1->iscomplex())
02672   {
02673     ((rpncomplex*)x1)->num -= n.num;
02674     ds.push_front(x1);
02675     x0->dec();
02676     return;
02677   }
02678   else
02679   if (x1->isreal())
02680   {
02681     n.num *= -1;
02682     n.num += ((rpnreal*)x1)->num;
02683     ds.push_front(x0);
02684     x1->dec();
02685     return;
02686   }
02687   else
02688   if (x1->isinteger())
02689   {
02690     n.num *= -1;
02691     n.num += ((rpninteger*)x1)->num;
02692     ds.push_front(x0);
02693     x1->dec();
02694     return;
02695   }
02696 
02697   // Error so restore stack 
02698   ds.push_front(x1);
02699   ds.push_front(x0);
02700 }

void rpnsubtract::visit ( deque< rpnbase * > &  ds,
rpnreal n 
) [virtual]

Reimplemented from rpnfunction.

Definition at line 2702 of file rpnfunc.cpp.

References rpnbase::dec(), rpnbase::iscomplex(), rpnbase::isinteger(), rpnbase::isreal(), and rpnreal::num.

02703 {
02704   rpnbase* x0 = ds.front();
02705   ds.pop_front();
02706   rpnbase* x1 = ds.front();
02707   ds.pop_front();
02708 
02709   if (x1->isreal())
02710   {
02711     ((rpnreal*)x1)->num -= n.num;
02712     ds.push_front(x1);
02713     x0->dec();
02714     return;
02715   }
02716   else
02717   if (x1->iscomplex())
02718   {
02719     ((rpncomplex*)x1)->num -= n.num;
02720     ds.push_front(x1);
02721     x0->dec();
02722     return;
02723   }
02724   else
02725   if ( x1->isinteger())
02726   {
02727     n.num *= -1;
02728     n.num += ((rpninteger*)x1)->num;
02729     ds.push_front(x0);
02730     x1->dec();
02731     return;
02732   }
02733 
02734   // Error so restore stack 
02735   ds.push_front(x1);
02736   ds.push_front(x0);
02737 }

void rpnsubtract::visit ( deque< rpnbase * > &  ds,
rpninteger n 
) [virtual]

Reimplemented from rpnfunction.

Definition at line 2739 of file rpnfunc.cpp.

References rpnbase::dec(), rpnbase::iscomplex(), rpnbase::isinteger(), rpnbase::isreal(), and rpninteger::num.

02740 {
02741   rpnbase* x0 = ds.front();
02742   ds.pop_front();
02743   rpnbase* x1 = ds.front();
02744 
02745   if ( x1->isreal() )
02746   {
02747     ((rpnreal*)x1)->num -= n.num;
02748     x0->dec();
02749     return;
02750   }
02751   else
02752   if ( x1->isinteger() )
02753   {
02754     ((rpninteger*)x1)->num -= n.num;
02755     x0->dec();
02756     return;
02757   }
02758   else
02759   if ( x1->iscomplex() )
02760   {
02761     ((rpncomplex*)x1)->num -= n.num;
02762     x0->dec();
02763     return;
02764   }
02765 
02766   // Restore the stack. 
02767   ds.push_front(x0);
02768 }


The documentation for this class was generated from the following files:

Generated on Fri Mar 4 00:50:16 2011 for Chelton Evans Source by  doxygen 1.5.8