00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _util_render_stack_h
00029 #define _util_render_stack_h
00030
00031 #include <iostream>
00032
00033 #define STACK_MAX_STACK_SIZE 20
00034 template <class T>
00035 class Stack {
00036 private:
00037 T objects[STACK_MAX_STACK_SIZE];
00038 int nobjects;
00039 public:
00040 Stack(): nobjects(0) {}
00041 void push(const T&a) {
00042 if (nobjects >= STACK_MAX_STACK_SIZE) {
00043 ExEnv::err() << "Stack: overflow" << std::endl;
00044 abort();
00045 }
00046 objects[nobjects++] = a;
00047 }
00048 T pop() {
00049 if (!nobjects) {
00050 ExEnv::err() << "Stack: underflow" << std::endl;
00051 abort();
00052 }
00053 nobjects -= 1;
00054 return objects[nobjects];
00055 }
00056 T top() const {
00057 if (!nobjects) {
00058 ExEnv::err() << "Stack: underflow" << std::endl;
00059 abort();
00060 }
00061 return objects[nobjects - 1];
00062 }
00063 int n() const { return nobjects; }
00064 T operator[](int i) { return objects[i]; }
00065 void print(std::ostream& os = ExEnv::out()) {
00066 os << "Stack (depth = " << nobjects << "):" << std::endl;
00067 for (int i=0; i<nobjects; i++) {
00068 os << " object " << i << ":" << std::endl;
00069 objects[i]->print(os);
00070 }
00071 }
00072 };
00073
00074 #endif
00075
00076
00077
00078
00079