void stackCheck(IStack<int> &stack){ cout << "Testing stack interface:" << endl; for (int i = 0; i < 3; i++){ cout << " pushing value: " << i << endl; stack.push(i); } while(stack.size()){ cout << " popped value: " << stack.pop() << endl; } }
int CalcStack::calculate(string const &inputString) { IStack<int> *stack = new LinkedStack<int>(); vector<string> tokens = separate(inputString); for(const string &token : tokens) { if (isOperator(token)) { int second = stack->pop(); int first = stack->pop(); stack->push(doOperation(token[0], first, second)); } else if (isNumber(token)) { stack->push(stoi(token)); } } int result = stack->top(); delete stack; return result; }
bool IsoSurface::All_Intersections(const Ray& ray, IStack& Depth_Stack, TraceThreadData *Thread) { int Side1 = 0, Side2 = 0, itrace = 0; DBL Depth1 = 0.0, Depth2 = 0.0; BasicRay New_Ray; Vector3d IPoint; Vector3d Plocal, Dlocal; DBL tmax = 0.0, tmin = 0.0, tmp = 0.0; DBL maxg = max_gradient; int i = 0 ; /* count of intervals in stack - 1 */ int IFound = false; int begin = 0, end = 0; bool in_shadow_test = false; Vector3d VTmp; Thread->Stats()[Ray_IsoSurface_Bound_Tests]++; if(container->Intersect(ray, Trans, Depth1, Depth2, Side1, Side2)) /* IsoSurface_Bound_Tests */ { Thread->Stats()[Ray_IsoSurface_Bound_Tests_Succeeded]++; in_shadow_test = ray.IsShadowTestRay(); if(Depth1 < 0.0) Depth1 = 0.0; if(Trans != NULL) { MInvTransPoint(Plocal, ray.Origin, Trans); MInvTransDirection(Dlocal, ray.Direction, Trans); } else { Plocal = ray.Origin; Dlocal = ray.Direction; } Thread->isosurfaceData->Inv3 = 1; if(closed != false) { VTmp = Plocal + Depth1 * Dlocal; tmp = Vector_Function(Thread->functionContext, VTmp); if(Depth1 > accuracy) { if(tmp < 0.0) /* The ray hits the bounding shape */ { IPoint = ray.Evaluate(Depth1); if(Clip.empty() || Point_In_Clip(IPoint, Clip, Thread)) { Depth_Stack->push(Intersection(Depth1, IPoint, this, 1, Side1)); IFound = true; itrace++; Thread->isosurfaceData->Inv3 *= -1; } } } else { if(tmp < (maxg * accuracy * 4.0)) { Depth1 = accuracy * 5.0; VTmp = Plocal + Depth1 * Dlocal; if(Vector_Function(Thread->functionContext, VTmp) < 0) Thread->isosurfaceData->Inv3 = -1; /* Change the sign of the function (IPoint is in the bounding shpae.)*/ } VTmp = Plocal + Depth2 * Dlocal; if(Vector_Function(Thread->functionContext, VTmp) < 0.0) { IPoint = ray.Evaluate(Depth2); if(Clip.empty() || Point_In_Clip(IPoint, Clip, Thread)) { Depth_Stack->push(Intersection(Depth2, IPoint, this, 1, Side2)); IFound = true; } } } } /* METHOD 2 by R. Suzuki */ tmax = Depth2 = min(Depth2, BOUND_HUGE); tmin = Depth1 = min(Depth2, Depth1); if((tmax - tmin) < accuracy) { if (IFound) Depth_Stack->pop(); // we added an intersection already, so we need to undo that return (false); } Thread->Stats()[Ray_IsoSurface_Tests]++; if((Depth1 < accuracy) && (Thread->isosurfaceData->Inv3 == 1)) { /* IPoint is on the isosurface */ VTmp = Plocal + tmin * Dlocal; if(fabs(Vector_Function(Thread->functionContext, VTmp)) < (maxg * accuracy * 4.0)) { tmin = accuracy * 5.0; VTmp = Plocal + tmin * Dlocal; if(Vector_Function(Thread->functionContext, VTmp) < 0) Thread->isosurfaceData->Inv3 = -1; /* change the sign and go into the isosurface */ } } Thread->isosurfaceData->ctx = Thread->functionContext; for (; itrace < max_trace; itrace++) { if(Function_Find_Root(*(Thread->isosurfaceData), Plocal, Dlocal, &tmin, &tmax, maxg, in_shadow_test, Thread) == false) break; else { IPoint = ray.Evaluate(tmin); if(Clip.empty() || Point_In_Clip(IPoint, Clip, Thread)) { Depth_Stack->push(Intersection(tmin, IPoint, this, 0, 0 /*Side1*/)); IFound = true; } } tmin += accuracy * 5.0; if((tmax - tmin) < accuracy) break; Thread->isosurfaceData->Inv3 *= -1; } if(IFound) Thread->Stats()[Ray_IsoSurface_Tests_Succeeded]++; } if(eval == true) { DBL temp_max_gradient = max_gradient; // TODO FIXME - works around nasty gcc (found using 4.0.1) bug failing to honor casting away of volatile on pass by value on template argument lookup [trf] max_gradient = max((DBL)temp_max_gradient, maxg); // TODO FIXME - This is not thread-safe but should be!!! [trf] } return (IFound); }