Open
Graph Drawing
Framework

 v.2012.05
 

ArrayBuffer.h
Go to the documentation of this file.
00001 /*
00002  * $Revision: 2299 $
00003  * 
00004  * last checkin:
00005  *   $Author: gutwenger $ 
00006  *   $Date: 2012-05-07 15:57:08 +0200 (Mon, 07 May 2012) $ 
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)); // double the size
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; // thank god i'm a friend of Array
00149             Array<E,INDEX>::m_high = num-1; // fake smaller size
00150             A2.copy(*this); // copy
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 } //namespace
00206 
00207 #endif // OGDF_ARRAY_BUFFER_H