Open
Graph Drawing
Framework

 v.2010.10
 

ArrayBuffer.h

Go to the documentation of this file.
00001 /*
00002  * $Revision: 2027 $
00003  * 
00004  * last checkin:
00005  *   $Author: gutwenger $ 
00006  *   $Date: 2010-09-01 11:55:17 +0200 (Wed, 01 Sep 2010) $ 
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)); // double the size
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; // thank god i'm a friend of Array
00159             Array<E,INDEX>::m_high = num-1; // fake smaller size
00160             A2.copy(*this); // copy
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 } //namespace
00216 
00217 #endif // OGDF_ARRAY_BUFFER_H