static-stack.hpp
Go to the documentation of this file.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
00029
00030
00031
00032
00033
00034 namespace Gecode { namespace Support {
00035
00041 template<class T, class A>
00042 class StaticStack {
00043 private:
00045 A& a;
00047 int n;
00049 unsigned int tos;
00051 T* stack;
00052 public:
00054 StaticStack(A& a, int n);
00056 ~StaticStack(void);
00057
00059 void reset(void);
00061 bool empty(void) const;
00063 int entries(void) const;
00064
00066 T pop(void);
00068 T& top(void) const;
00070 T& last(void) const;
00072 void push(const T& x);
00073
00074 private:
00076 static void* operator new(size_t s) throw() { (void) s; return NULL; }
00078 static void operator delete(void* p) { (void) p; };
00080 StaticStack(const StaticStack& s) : a(s.a) {}
00082 const StaticStack& operator =(const StaticStack&) { return *this; }
00083 };
00084
00085 template<class T, class A>
00086 forceinline
00087 StaticStack<T,A>::StaticStack(A& a0, int n0)
00088 : a(a0), n(n0), tos(0), stack(a.template alloc<T>(n)) {}
00089
00090 template<class T, class A>
00091 forceinline
00092 StaticStack<T,A>::~StaticStack(void) {
00093 a.free(stack,n);
00094 }
00095
00096 template<class T, class A>
00097 forceinline bool
00098 StaticStack<T,A>::empty(void) const {
00099 return tos==0;
00100 }
00101
00102 template<class T, class A>
00103 forceinline int
00104 StaticStack<T,A>::entries(void) const {
00105 return tos;
00106 }
00107
00108 template<class T, class A>
00109 forceinline void
00110 StaticStack<T,A>::reset(void) {
00111 tos = 0;
00112 }
00113
00114 template<class T, class A>
00115 forceinline T
00116 StaticStack<T,A>::pop(void) {
00117 assert((tos > 0) && (tos <= static_cast<unsigned int>(n)));
00118 return stack[--tos];
00119 }
00120
00121 template<class T, class A>
00122 forceinline T&
00123 StaticStack<T,A>::top(void) const {
00124 assert((tos > 0) && (tos <= static_cast<unsigned int>(n)));
00125 return stack[tos-1];
00126 }
00127
00128 template<class T, class A>
00129 forceinline T&
00130 StaticStack<T,A>::last(void) const {
00131 assert((tos >= 0) && (tos < static_cast<unsigned int>(n)));
00132 return stack[tos];
00133 }
00134
00135 template<class T, class A>
00136 forceinline void
00137 StaticStack<T,A>::push(const T& x) {
00138 assert(tos < static_cast<unsigned int>(n));
00139 stack[tos++] = x;
00140 }
00141
00142 }}
00143
00144