proj home

Files   Classes   Functions   Hierarchy  

rpnmultiply Class Reference

#include <rpnfunc.h>

Inheritance diagram for rpnmultiply:
Collaboration diagram for rpnmultiply:

List of all members.

Public Member Functions

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


Constructor & Destructor Documentation

rpnmultiply::rpnmultiply (  )  [inline]

Definition at line 711 of file rpnfunc.h.

Referenced by copy().

00711 {}

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

Definition at line 1851 of file rpnfunc.cpp.

References eval().

01852 {
01853   if (evaluate)
01854     eval(ds);
01855   else
01856     ds.push_front(this);
01857 }

rpnmultiply::~rpnmultiply (  )  [inline]

Definition at line 713 of file rpnfunc.h.

00713 {}


Member Function Documentation

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

Reimplemented from rpnfunction.

Definition at line 1859 of file rpnfunc.cpp.

References rpnmultiply().

01860 {
01861   return new rpnmultiply();
01862 }

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

Reimplemented from rpnfunction.

Definition at line 1864 of file rpnfunc.cpp.

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

Referenced by rpnmultiply().

01865 {
01866   if (ds.size()>1)
01867     ds[0]->accept(ds,*this);
01868 
01869   dec();
01870 }

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

Reimplemented from rpnfunction.

Definition at line 720 of file rpnfunc.h.

00720 { return string("*"); }

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

Reimplemented from rpnfunction.

Definition at line 1932 of file rpnfunc.cpp.

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

01933 {
01934   rpnbase* x0 = ds.front();
01935   ds.pop_front();
01936 
01937   rpnbase* x1 = ds.front();
01938   if (x1->iscomplex())
01939   {
01940     ((rpncomplex*)(x1))->num *= n.num;
01941     x0->dec();
01942     return;
01943   }
01944   else if (x1->isreal())
01945   {
01946     ds.pop_front();
01947     ds.push_front(x0);
01948     n.num *= ((rpnreal*)x1)->num;
01949     x1->dec();
01950     return;
01951   }
01952   else if (x1->isinteger())
01953   {
01954     ds.pop_front();
01955     ds.push_front(x0);
01956     n.num *= ((rpninteger*)x1)->num;
01957     x1->dec();
01958     return;
01959   }
01960 
01961   //Restor the stack.
01962   ds.push_front(x0);
01963 }

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

Reimplemented from rpnfunction.

Definition at line 1872 of file rpnfunc.cpp.

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

01873 {
01874   rpnbase* x0 = ds.front();
01875   ds.pop_front();
01876 
01877   rpnbase* x1 = ds.front();
01878   if (x1->isreal())
01879   {
01880     ((rpnreal*)(x1))->num *= n.num;
01881     x0->dec();
01882     return;
01883   }
01884   else if (x1->iscomplex())
01885   {
01886     ((rpncomplex*)(x1))->num *= n.num;
01887     x0->dec();
01888     return;
01889   }
01890   else if (x1->isinteger())
01891   {
01892     ds.pop_front();
01893     n.num *= ((rpninteger*)x1)->num;
01894     ds.push_front(x0);
01895     x1->dec();
01896     return;
01897   }
01898 
01899   // Restore the stack.
01900   ds.push_front(x0);
01901 }

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

Reimplemented from rpnfunction.

Definition at line 1903 of file rpnfunc.cpp.

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

01904 {
01905   rpninteger* x0 = (rpninteger*)(ds.front());
01906   ds.pop_front();
01907 
01908   rpnbase* x1 = ds.front();
01909   if (x1->isinteger())
01910   {
01911     ((rpninteger*)(x1))->num *= n.num;
01912     x0->dec(); 
01913     return;
01914   }
01915   else if (x1->isreal())
01916   {
01917     ((rpnreal*)(x1))->num *= n.num;
01918     x0->dec();
01919     return;
01920   }
01921   else if (x1->iscomplex())
01922   {
01923     ((rpncomplex*)(x1))->num *= n.num;
01924     x0->dec();
01925     return;
01926   }
01927 
01928   // Restor the stack.
01929   ds.push_front(x0);
01930 }


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

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