proj home

Files   Classes   Functions   Hierarchy  

rpnvectorpointermake Class Reference

#include <rpnfunc.h>

Inheritance diagram for rpnvectorpointermake:
Collaboration diagram for rpnvectorpointermake:

List of all members.

Public Member Functions

 rpnvectorpointermake ()
 rpnvectorpointermake (deque< rpnbase * > &ds, bool const evaluate=false)
 ~rpnvectorpointermake ()
rpnbasecopy () const
void visit (deque< rpnbase * > &ds, rpnvector &v)
void visit (deque< rpnbase * > &ds, rpnstring &s)
void visit (deque< rpnbase * > &ds, rpninteger &k)
string const name () const
void eval (deque< rpnbase * > &ds)


Detailed Description

Definition at line 1132 of file rpnfunc.h.


Constructor & Destructor Documentation

rpnvectorpointermake::rpnvectorpointermake (  )  [inline]

Definition at line 1136 of file rpnfunc.h.

Referenced by copy().

01136 {}

rpnvectorpointermake::rpnvectorpointermake ( deque< rpnbase * > &  ds,
bool const   evaluate = false 
)

Definition at line 3559 of file rpnfunc.cpp.

03560 {
03561   if (evaluate)
03562     eval(ds);
03563   else
03564     ds.push_front(this);
03565 }

rpnvectorpointermake::~rpnvectorpointermake (  )  [inline]

Definition at line 1139 of file rpnfunc.h.

01139 {}


Member Function Documentation

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

Reimplemented from rpnfunction.

Definition at line 3567 of file rpnfunc.cpp.

References rpnvectorpointermake().

03568 {
03569   return new rpnvectorpointermake(); 
03570 }

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

Reimplemented from rpnfunction.

Definition at line 3572 of file rpnfunc.cpp.

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

03573 {
03574   if (!ds.empty())
03575     ds[0]->accept(ds,*this);
03576 
03577   dec();
03578 }

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

Reimplemented from rpnfunction.

Definition at line 1146 of file rpnfunc.h.

01146 { return string("->[]"); }

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

Reimplemented from rpnfunction.

Definition at line 3617 of file rpnfunc.cpp.

References rpnbase::dec(), rpnbase::inc(), rpnbase::isvector(), and rpninteger::num.

03618 {
03619   if (ds.size()<=2)
03620     return;
03621 
03622   rpnbase* x0 = ds.front();
03623   rpnbase* x1 = ds[1];
03624 
03625   if (!x1->isvector())
03626     return;
03627 
03628 //  int n = ((rpninteger*)x1)->num;
03629 
03630   long int n(k.num);
03631 
03632   ds.pop_front();
03633   ds.pop_front();
03634 
03635 
03636   int n2 = ((rpnvector*)x1)->index();
03637   n += n2;
03638 
03639 
03640   if ( (n<0) || !(n<(int)ds.size()) )
03641   {
03642     ds.push_front(x1);
03643     ds.push_front(x0);
03644     return;
03645   }
03646 
03647   x0->dec();
03648   x1->dec();
03649 
03650   rpnbase* w = ds[n];
03651   w->inc();
03652   ds.push_front(w);
03653 }

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

Reimplemented from rpnfunction.

Definition at line 3657 of file rpnfunc.cpp.

References rpnbase::dec(), rpnbase::inc(), rpnvector::index(), rpnbase::isinteger(), rpnbase::isvector(), and rpnstring::str.

03658 {
03659   if (ds.size()<=2)
03660     return;
03661 
03662   rpnbase* x0 = ds.front();
03663   rpnbase* x1 = ds[1];
03664 
03665   if (!x1->isinteger())
03666     return;
03667 
03668   int n = ((rpninteger*)x1)->num;
03669 
03670   unsigned int sz0 = ds.size();
03671   rpnprogramstackstate().recallpointer(ds,s.str);
03672   unsigned int sz1 = ds.size();
03673   if (sz0==sz1)
03674     return;
03675 
03676   rpnbase* x2 = ds.front();
03677 
03678   if( ! x2->isvector() )
03679   {
03680     x2->dec();
03681     ds.pop_front();
03682     return;
03683   }
03684 
03685   rpnvector& v = *((rpnvector*)x2);
03686 
03687   ds.pop_front();
03688   ds.pop_front();
03689   ds.pop_front();
03690 
03691   int n2 = v.index();
03692   x2->dec();
03693   n += n2;
03694 
03695   if ( (n<0) || !(n<(int)ds.size()) )
03696   {
03697     ds.push_front(x1);
03698     ds.push_front(x0);
03699     return;
03700   }
03701 
03702   x0->dec();
03703   x1->dec();
03704 
03705   rpnbase* w = ds[n];
03706   w->inc();
03707   ds.push_front(w);
03708 }

void rpnvectorpointermake::visit ( deque< rpnbase * > &  ds,
rpnvector v 
) [virtual]

Reimplemented from rpnfunction.

Definition at line 3580 of file rpnfunc.cpp.

References rpnbase::dec(), rpnbase::inc(), rpnvector::index(), and rpnbase::isinteger().

03581 {
03582   if (ds.size()<=2)
03583     return;
03584 
03585   rpnbase* x0 = ds.front();
03586   rpnbase* x1 = ds[1];
03587 
03588   if (!x1->isinteger())
03589     return;
03590 
03591   long int n = ((rpninteger*)x1)->num;
03592 
03593   ds.pop_front();
03594   ds.pop_front();
03595 
03596 
03597   int n2 = v.index();
03598   n += n2;
03599 
03600   if ( (n<0) || !(n<(int)ds.size()) )
03601   {
03602     ds.push_front(x1);
03603     ds.push_front(x0);
03604     return;
03605   }
03606 
03607   x0->dec();
03608   x1->dec();
03609 
03610   rpnbase* w = ds[n];
03611   w->inc();
03612   ds.push_front(w);
03613 }


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