Files Classes Functions Hierarchy
#include <rpnfunc.h>
Public Member Functions | |
| rpnvectorpointermake () | |
| rpnvectorpointermake (deque< rpnbase * > &ds, bool const evaluate=false) | |
| ~rpnvectorpointermake () | |
| rpnbase * | copy () 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) |
Definition at line 1132 of file rpnfunc.h.
| rpnvectorpointermake::rpnvectorpointermake | ( | ) | [inline] |
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] |
| 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().
| string const rpnvectorpointermake::name | ( | ) | const [inline, virtual] |
| 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 }
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 }
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 }
1.5.8