proj home

Files   Classes   Functions   Hierarchy  

rpngcd Class Reference

#include <rpnfunc.h>

Inheritance diagram for rpngcd:
Collaboration diagram for rpngcd:

List of all members.

Public Member Functions

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


Detailed Description

Definition at line 1403 of file rpnfunc.h.


Constructor & Destructor Documentation

rpngcd::rpngcd (  )  [inline]

Definition at line 1407 of file rpnfunc.h.

Referenced by copy().

01407 {}

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

Definition at line 4294 of file rpnfunc.cpp.

References eval().

04295 {
04296   if (evaluate)
04297     eval(ds);
04298   else
04299     ds.push_front(this);
04300 }

rpngcd::~rpngcd (  )  [inline]

Definition at line 1409 of file rpnfunc.h.

01409 {}


Member Function Documentation

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

Reimplemented from rpnfunction.

Definition at line 4302 of file rpnfunc.cpp.

References rpngcd().

04303 {
04304   return new rpngcd();
04305 }

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

Reimplemented from rpnfunction.

Definition at line 4307 of file rpnfunc.cpp.

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

Referenced by rpngcd().

04308 {
04309   if(ds.size()>1)
04310     ds[0]->accept(ds,*this);
04311 
04312   dec();
04313 }

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

Reimplemented from rpnfunction.

Definition at line 1414 of file rpnfunc.h.

01414 { return string("gcd"); }

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

Reimplemented from rpnfunction.

Definition at line 4315 of file rpnfunc.cpp.

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

04316 {
04317   if (!ds[1]->isinteger())
04318     return;
04319   if (n.num<1)
04320     return;
04321 
04322   rpnbase* x0 = ds.front();
04323   ds.pop_front();
04324 
04325   rpninteger* x1 = (rpninteger *)(ds.front());
04326 
04327   long int a = x1->num;
04328   if (a<1)
04329   {
04330     ds.push_front(x0);
04331     return;
04332   }
04333 
04334   long int b = n.num;
04335 
04336   if (a<b)
04337   {
04338     long int c = a;
04339     a = b;
04340     b = c;
04341   }
04342 
04343   if (a!=b)
04344   {
04345     for (long int c=a%b;c!=0;)
04346     {
04347       a = b;
04348       b = c;
04349       c = a%b;
04350     }
04351 
04352   }
04353   
04354   x1->num = b;
04355 
04356   x0->dec();
04357 }


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

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