proj home

Files   Classes   Functions   Hierarchy  

rpnadd Class Reference

#include <rpnfunc.h>

Inheritance diagram for rpnadd:
Collaboration diagram for rpnadd:

List of all members.

Public Member Functions

 rpnadd ()
 rpnadd (deque< rpnbase * > &ds, bool const evaluate=true)
 ~rpnadd ()
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 688 of file rpnfunc.h.


Constructor & Destructor Documentation

rpnadd::rpnadd (  )  [inline]

Definition at line 692 of file rpnfunc.h.

Referenced by copy().

00692 {}

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

Definition at line 1736 of file rpnfunc.cpp.

References eval().

01737 {
01738   if (evaluate)
01739     eval(ds);
01740   else
01741     ds.push_front(this);
01742 }

rpnadd::~rpnadd (  )  [inline]

Definition at line 694 of file rpnfunc.h.

00694 {}


Member Function Documentation

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

Reimplemented from rpnfunction.

Definition at line 1744 of file rpnfunc.cpp.

References rpnadd().

01745 {
01746   return new rpnadd();
01747 }

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

Reimplemented from rpnfunction.

Definition at line 1749 of file rpnfunc.cpp.

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

Referenced by rpnadd().

01750 {
01751   if (ds.size()>1)
01752     ds[0]->accept(ds,*this);
01753 
01754   dec();
01755 }

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

Reimplemented from rpnfunction.

Definition at line 701 of file rpnfunc.h.

00701 { return string("+"); }

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

Reimplemented from rpnfunction.

Definition at line 1757 of file rpnfunc.cpp.

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

01758 {
01759   rpnbase* x0 = ds.front();
01760   ds.pop_front();
01761 
01762   rpnbase* x1 = ds.front();
01763   if (x1->iscomplex())
01764   {
01765     ((rpncomplex*)(x1))->num += n.num;
01766     x0->dec();
01767     return;
01768   }
01769   else if (x1->isreal())
01770   {
01771     ds.pop_front();
01772     ds.push_front(x0);
01773     n.num += ((rpnreal*)x1)->num;
01774     x1->dec();
01775     return;
01776   }
01777   else if (x1->isinteger())
01778   {
01779     ds.pop_front();
01780     ds.push_front(x0);
01781     n.num += ((rpninteger*)x1)->num;
01782     x1->dec();
01783     return;
01784   }
01785 
01786   //Restor the stack.
01787   ds.push_front(x0);
01788 }

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

Reimplemented from rpnfunction.

Definition at line 1790 of file rpnfunc.cpp.

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

01791 {
01792   rpnbase* x0 = ds.front();
01793   ds.pop_front();
01794 
01795   rpnbase* x1 = ds.front();
01796   if (x1->isreal())
01797   {
01798     ((rpnreal*)(x1))->num += n.num;
01799     x0->dec();
01800     return;
01801   }
01802   else if (x1->iscomplex())
01803   {
01804     ((rpncomplex*)(x1))->num += n.num;
01805     x0->dec();
01806     return;
01807   }
01808   else if (x1->isinteger())
01809   {
01810     ds.pop_front();
01811     n.num += ((rpninteger*)x1)->num;
01812     ds.push_front(x0);
01813     x1->dec();
01814     return;
01815   }
01816 
01817   // Restore the stack.
01818   ds.push_front(x0);
01819 }

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

Reimplemented from rpnfunction.

Definition at line 1821 of file rpnfunc.cpp.

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

01822 {
01823   rpninteger* x0 = (rpninteger*)(ds.front());
01824   ds.pop_front();
01825 
01826   rpnbase* x1 = ds.front();
01827   if (x1->isinteger())
01828   {
01829     ((rpninteger*)(x1))->num += n.num;
01830     x0->dec(); 
01831     return;
01832   }
01833   else if (x1->isreal())
01834   {
01835     ((rpnreal*)(x1))->num += n.num;
01836     x0->dec();
01837     return;
01838   }
01839   else if (x1->iscomplex())
01840   {
01841     ((rpncomplex*)(x1))->num += n.num;
01842     x0->dec();
01843     return;
01844   }
01845 
01846   // Restor the stack.
01847   ds.push_front(x0);
01848 }


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

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