Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00042 #ifdef _MSC_VER
00043 #pragma once
00044 #endif
00045
00046 #ifndef OGDF_ARRAY_BUFFER_H
00047 #define OGDF_ARRAY_BUFFER_H
00048
00049 #include <ogdf/basic/Array.h>
00050
00051 namespace ogdf {
00052
00054
00060 template<class E, class INDEX = int>
00061 class ArrayBuffer : private Array<E, INDEX> {
00062 INDEX num;
00063 public:
00065 ArrayBuffer() : Array<E,INDEX>(), num(0) {}
00067 explicit ArrayBuffer(INDEX size) : Array<E,INDEX>(size), num(0) {}
00068
00070 void init() { Array<E,INDEX>::init(); }
00072 void init(INDEX size) { Array<E,INDEX>::init(size); }
00073
00075 void clear() { num = 0; }
00076
00078 const E &top() const { OGDF_ASSERT(num>0); return Array<E,INDEX>::operator[](num-1); };
00080 E &top() { OGDF_ASSERT(num>0); return Array<E,INDEX>::operator[](num-1); };
00081
00083 void push(E e) {
00084 if(num == Array<E,INDEX>::size())
00085 Array<E,INDEX>::grow(max(num,1));
00086 Array<E,INDEX>::operator[](num++) = e;
00087 };
00088
00090 void pop() { OGDF_ASSERT(num>0); --num; };
00092 E popRet() { OGDF_ASSERT(num>0); return Array<E,INDEX>::operator[](--num); };
00093
00095 bool empty() const { return !num; }
00096
00098 INDEX size() const { return num; }
00099
00101 const E &operator[](INDEX i) const {
00102 OGDF_ASSERT(0 <= i && i < num)
00103 return Array<E,INDEX>::operator[](i);
00104 }
00106 E &operator[](INDEX i) {
00107 OGDF_ASSERT(0 <= i && i < num)
00108 return Array<E,INDEX>::operator[](i);
00109 }
00110
00112
00123 void compactCopy(Array<E,INDEX>& A2) const {
00124 OGDF_ASSERT(this != &A2);
00125 if(num) {
00126 A2.init(num);
00127 for(INDEX i = num; i-->0;)
00128 A2[i] = (*this)[i];
00129 } else
00130 A2.init(0);
00131 }
00132
00134
00145 void compactCpycon(Array<E,INDEX>& A2) const {
00146 OGDF_ASSERT(this != &A2);
00147 if(num) {
00148 INDEX tmp = Array<E,INDEX>::m_high;
00149 Array<E,INDEX>::m_high = num-1;
00150 A2.copy(*this);
00151 Array<E,INDEX>::m_high = tmp;
00152 } else
00153 A2.init(0);
00154 }
00155
00157
00168 void compactMemcpy(Array<E,INDEX>& A2) const {
00169 OGDF_ASSERT(this != &A2);
00170 if(num) {
00171 A2.init(num);
00172 memcpy(A2.m_pStart,this->m_pStart,sizeof(E)*num);
00173 } else
00174 A2.init(0);
00175 }
00176
00178
00183 INDEX linearSearch (const E& x) const {
00184 INDEX i;
00185 for(i = num; i-->0;)
00186 if(x == Array<E,INDEX>::m_vpStart[i]) break;
00187 return i;
00188 }
00189
00191
00196 template<class COMPARER>
00197 INDEX linearSearch (const E& x, const COMPARER &comp) const {
00198 INDEX i;
00199 for(i = num; i-->0;)
00200 if(comp.equal(x, Array<E,INDEX>::m_vpStart[i])) break;
00201 return i;
00202 }
00203 };
00204
00205 }
00206
00207 #endif // OGDF_ARRAY_BUFFER_H