Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00052 #ifdef _MSC_VER
00053 #pragma once
00054 #endif
00055
00056 #ifndef OGDF_ARRAY_BUFFER_H
00057 #define OGDF_ARRAY_BUFFER_H
00058
00059 #include <ogdf/basic/Array.h>
00060
00061 namespace ogdf {
00062
00064
00070 template<class E, class INDEX = int>
00071 class ArrayBuffer : private Array<E, INDEX> {
00072 INDEX num;
00073 public:
00075 ArrayBuffer() : Array<E,INDEX>(), num(0) {}
00077 explicit ArrayBuffer(INDEX size) : Array<E,INDEX>(size), num(0) {}
00078
00080 void init() { Array<E,INDEX>::init(); }
00082 void init(INDEX size) { Array<E,INDEX>::init(size); }
00083
00085 void clear() { num = 0; }
00086
00088 const E &top() const { OGDF_ASSERT(num>0); return Array<E,INDEX>::operator[](num-1); };
00090 E &top() { OGDF_ASSERT(num>0); return Array<E,INDEX>::operator[](num-1); };
00091
00093 void push(E e) {
00094 if(num == Array<E,INDEX>::size())
00095 Array<E,INDEX>::grow(max(num,1));
00096 Array<E,INDEX>::operator[](num++) = e;
00097 };
00098
00100 void pop() { OGDF_ASSERT(num>0); --num; };
00102 E popRet() { OGDF_ASSERT(num>0); return Array<E,INDEX>::operator[](--num); };
00103
00105 bool empty() const { return !num; }
00106
00108 INDEX size() const { return num; }
00109
00111 const E &operator[](INDEX i) const {
00112 OGDF_ASSERT(0 <= i && i < num)
00113 return Array<E,INDEX>::operator[](i);
00114 }
00116 E &operator[](INDEX i) {
00117 OGDF_ASSERT(0 <= i && i < num)
00118 return Array<E,INDEX>::operator[](i);
00119 }
00120
00122
00133 void compactCopy(Array<E,INDEX>& A2) const {
00134 OGDF_ASSERT(this != &A2);
00135 if(num) {
00136 A2.init(num);
00137 for(INDEX i = num; i-->0;)
00138 A2[i] = (*this)[i];
00139 } else
00140 A2.init(0);
00141 }
00142
00144
00155 void compactCpycon(Array<E,INDEX>& A2) const {
00156 OGDF_ASSERT(this != &A2);
00157 if(num) {
00158 INDEX tmp = Array<E,INDEX>::m_high;
00159 Array<E,INDEX>::m_high = num-1;
00160 A2.copy(*this);
00161 Array<E,INDEX>::m_high = tmp;
00162 } else
00163 A2.init(0);
00164 }
00165
00167
00178 void compactMemcpy(Array<E,INDEX>& A2) const {
00179 OGDF_ASSERT(this != &A2);
00180 if(num) {
00181 A2.init(num);
00182 memcpy(A2.m_pStart,this->m_pStart,sizeof(E)*num);
00183 } else
00184 A2.init(0);
00185 }
00186
00188
00193 INDEX linearSearch (const E& x) const {
00194 INDEX i;
00195 for(i = num; i-->0;)
00196 if(x == Array<E,INDEX>::m_vpStart[i]) break;
00197 return i;
00198 }
00199
00201
00206 template<class COMPARER>
00207 INDEX linearSearch (const E& x, const COMPARER &comp) const {
00208 INDEX i;
00209 for(i = num; i-->0;)
00210 if(comp.equal(x, Array<E,INDEX>::m_vpStart[i])) break;
00211 return i;
00212 }
00213 };
00214
00215 }
00216
00217 #endif // OGDF_ARRAY_BUFFER_H