proj home

Files   Classes   Functions   Hierarchy  

varreplace Class Reference

#include <rpnfunc.h>

Inheritance diagram for varreplace:
Collaboration diagram for varreplace:

List of all members.

Public Member Functions

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


Detailed Description

Definition at line 617 of file rpnfunc.h.


Constructor & Destructor Documentation

varreplace::varreplace (  )  [inline]

Definition at line 621 of file rpnfunc.h.

Referenced by copy().

00621 {}

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

Definition at line 1615 of file rpnfunc.cpp.

References eval().

01616 {
01617   if (evaluate)
01618     eval(ds);
01619   else
01620     ds.push_front(this);
01621 }

varreplace::~varreplace (  )  [inline]

Definition at line 623 of file rpnfunc.h.

00623 {}


Member Function Documentation

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

Reimplemented from rpnfunction.

Definition at line 1623 of file rpnfunc.cpp.

References varreplace().

01624 {
01625   return new varreplace();
01626 }

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

Reimplemented from rpnfunction.

Definition at line 1628 of file rpnfunc.cpp.

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

Referenced by varreplace().

01629 {
01630   if (ds.size()>1)
01631     ds[0]->accept(ds,*this);
01632 
01633   dec();
01634 }

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

Reimplemented from rpnfunction.

Definition at line 629 of file rpnfunc.h.

00629 { return string("="); }

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

Reimplemented from rpnfunction.

Definition at line 1648 of file rpnfunc.cpp.

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

01649 {
01650   if (ds.size()<=3)
01651     return;
01652 
01653   rpnbase* x0 = ds.front();
01654   ds.pop_front();
01655   rpnbase* x1 = ds.front();
01656   ds.pop_front();
01657 
01658   bool restore(false);
01659 
01660   int const sz = ds.size();
01661 
01662   int a;
01663   int b = k.num;
01664   if (! x1->isinteger() )
01665     restore=true;
01666   else
01667   {
01668     a = ((rpninteger*)x1)->num;
01669     if ( (a<0) || (b<0) || (a>=sz) || (b>=sz) || (a==b) )
01670       restore=true;
01671   }
01672 
01673   if (restore)
01674   {
01675     ds.push_front(x1);
01676     ds.push_front(x0);
01677     return;
01678   }
01679 
01680   x0->dec();
01681   x1->dec();
01682 
01683   ds[a]->dec();
01684   ds[a]=ds[b];
01685   ds[b]->inc();
01686 }

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

Reimplemented from rpnfunction.

Definition at line 1636 of file rpnfunc.cpp.

References rpnbase::dec(), and rpnstring::str.

01637 {
01638   rpnbase* x0 = ds.front();
01639   ds.pop_front();
01640   rpnbase* x1 = ds.front();
01641   ds.pop_front();
01642   
01643   rpnprogramstackstate().replace(x1,s.str);
01644 
01645   x0->dec();
01646 }


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

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