00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 #ifndef skVALIST_H
00023 #define skVALIST_H
00024 
00025 
00026 #include "skGeneral.h"
00027 #include "skBoundsException.h"
00028     
00029 
00033 template <class T> class CLASSEXPORT skTVAList 
00034 #ifdef __SYMBIAN32__
00035 : public CBase
00036 #endif
00037 {         
00038  public:
00042   skTVAList();
00043 #ifndef __SYMBIAN32__
00044 
00048   skTVAList(const skTVAList<T>&);
00049 #endif
00050 
00053   virtual ~skTVAList();                                 
00058   skTVAList& operator=(const skTVAList<T>&);
00062   void moveFrom(skTVAList<T>&);
00066   void  clear();                                        
00070   USize entries() const;
00075   void  deleteElt(USize  n);
00080   void  prepend(const T &t);
00086   void  insert(const T &t,USize index);
00091   void  append(const T &t);
00095   void  remove(const T &t);     
00101   T& operator[](USize  n) const;
00106   int index(const T &t) const;
00111   bool  contains(const T &t) const;
00116   void  growTo(USize new_size);
00120   USize getArraySize() const;
00121 #ifdef __SYMBIAN32__
00122 
00127   operator TCleanupItem();
00132   static void Cleanup(TAny * s);
00133 #endif
00134  protected:
00138   int   findElt(const T &t) const;
00143   void  grow();
00148   void createArray();
00152   T*  m_Array;  
00156   USize m_ArraySize;
00160   USize m_Entries;
00161 };        
00162 
00163 #ifdef __gnuc__
00164 #define skTVALIST_PRE template <class T> 
00165 #else
00166 #define skTVALIST_PRE template <class T> 
00167 #endif
00168 
00169 
00170 
00171 skTVALIST_PRE inline skTVAList<T>::skTVAList()
00172 
00173   :m_Array(0),m_ArraySize(0),m_Entries(0)
00174 {
00175 }
00176 #ifndef __SYMBIAN32__
00177 
00178 skTVALIST_PRE inline skTVAList<T>::skTVAList(const skTVAList& l)
00179 
00180   : m_ArraySize(l.m_ArraySize),m_Entries(l.m_Entries)
00181 {
00182   if(m_ArraySize){
00183     m_Array=skARRAY_NEW(T,m_ArraySize);
00184     for (USize x=0;x<m_Entries;x++)
00185       m_Array[x]=l.m_Array[x];
00186   }else
00187     m_Array = 0;
00188 }
00189 #endif
00190 
00191 skTVALIST_PRE inline skTVAList<T>::~skTVAList()
00192 
00193 {
00194   if(m_Array)
00195     delete [] m_Array;
00196 }
00197 
00198 skTVALIST_PRE inline void skTVAList<T>::createArray()
00199 
00200 {
00201   if (m_ArraySize==0)
00202     m_ArraySize=1;
00203   if (m_ArraySize)
00204     m_Array=skARRAY_NEW(T,m_ArraySize);
00205 }
00206 
00207 skTVALIST_PRE inline void skTVAList<T>::clear()
00208 
00209 {
00210   m_Entries=0;
00211   if(m_Array)
00212     delete [] m_Array;
00213   m_Array=0;
00214   m_ArraySize=0;
00215 }
00216 
00217 skTVALIST_PRE inline USize skTVAList<T>::entries() const
00218      
00219 {
00220   return m_Entries;
00221 }
00222 
00223 skTVALIST_PRE inline USize skTVAList<T>::getArraySize() const
00224 
00225 {
00226   return m_ArraySize;
00227 }
00228 
00229 skTVALIST_PRE void skTVAList<T>::deleteElt(USize  n)
00230 
00231 {
00232   assert(n<m_Entries);
00233   if (n>=m_Entries)
00234 #ifdef EXCEPTIONS_DEFINED
00235     throw skBoundsException("Invalid index to DeleteElt",__FILE__,__LINE__);
00236 #else
00237   ExitSystem();
00238 #endif
00239   else{
00240     for (USize x=n;x<m_Entries-1;x++)
00241       m_Array[x]=m_Array[x+1];
00242     m_Entries--;
00243   }
00244 }
00245 
00246 skTVALIST_PRE void skTVAList<T>::insert(const T &t,USize index)
00247 
00248 {
00249   assert(index<=m_Entries);
00250   if (index>m_Entries)
00251 #ifdef EXCEPTIONS_DEFINED
00252     throw skBoundsException("Invalid index to Insert",__FILE__,__LINE__);
00253 #else
00254   ExitSystem();
00255 #endif
00256   if (m_Array==0)
00257     createArray();
00258   if (m_ArraySize==m_Entries)
00259     grow();
00260   if (index<m_Entries){
00261     for (USize x=m_Entries;x>index;x--)
00262       m_Array[x]=m_Array[x-1];
00263   }
00264   m_Array[index]=t;
00265   m_Entries++;
00266 }
00267 
00268 skTVALIST_PRE void skTVAList<T>::prepend(const T &t)
00269 
00270 {
00271   if (m_Array==0)
00272     createArray();
00273   if (m_ArraySize==m_Entries)
00274     grow();
00275   m_Entries++;
00276   for (USize x=m_Entries-1;x>=1;x--)
00277     m_Array[x]=m_Array[x-1];
00278   m_Array[0]=t;
00279 }
00280 
00281 skTVALIST_PRE inline void skTVAList<T>::append(const T &t)
00282 
00283 {
00284   if (m_Array==0)
00285     createArray();
00286   if (m_ArraySize==m_Entries)
00287     grow();
00288   m_Array[m_Entries]=t;
00289   m_Entries++;
00290 }
00291 
00292 skTVALIST_PRE void skTVAList<T>::remove(const T &t)
00293 
00294 {
00295   int index = findElt(t);
00296   assert(index>=0 && "VAList does not contain item"!=0);
00297   if (index>=0){
00298     for (USize x=(USize)index;x<m_Entries-1;x++)
00299       m_Array[x]=m_Array[x+1];
00300 
00301     m_Entries--;
00302   }
00303 }
00304 
00305 skTVALIST_PRE inline T& skTVAList<T>::operator[](USize  n) const
00306 
00307 {
00308   assert(n<m_Entries);
00309   if (n>=m_Entries)
00310 #ifdef EXCEPTIONS_DEFINED
00311     throw skBoundsException(skSTR("Invalid index to []"),__FILE__,__LINE__);
00312 #else
00313   ExitSystem();
00314 #endif
00315   return m_Array[n];
00316 }
00317 
00318 skTVALIST_PRE inline int skTVAList<T>::index(const T &t) const
00319 
00320 {
00321   return (USize)findElt(t);
00322 }
00323 
00324 skTVALIST_PRE inline bool skTVAList<T>::contains(const T &t) const
00325 
00326 {
00327   return (bool)(findElt(t) >= 0);
00328 }
00329 
00330 skTVALIST_PRE void skTVAList<T>::moveFrom(skTVAList<T>& l)
00331 
00332 {
00333   if (&l!=this){
00334     clear();
00335     
00336     m_ArraySize=l.m_ArraySize;
00337     m_Entries=l.m_Entries;
00338     m_Array=l.m_Array;
00339     l.m_ArraySize=0;
00340     l.m_Entries=0;
00341     l.m_Array=0;
00342   }
00343 }
00344 
00345 skTVALIST_PRE skTVAList<T>& skTVAList<T>::operator=(const skTVAList<T>& l)
00346 
00347 {
00348   if (&l!=this){
00349     clear();
00350     m_ArraySize=l.m_Entries;
00351     m_Entries=l.m_Entries;
00352     if(m_Entries){
00353       m_Array=skARRAY_NEW(T,m_Entries);
00354       for (USize x=0;x<m_Entries;x++)           
00355         m_Array[x]=l.m_Array[x];
00356     }else{
00357       m_Array=0;        
00358       m_ArraySize=0;
00359     }
00360   }
00361   return *this;
00362 }
00363 
00364 
00365 skTVALIST_PRE inline int skTVAList<T>::findElt(const T &t) const
00366 
00367 {
00368   for (USize index=0;index<m_Entries;index++){
00369     if (m_Array[index]==t)
00370       return (int)index;                
00371   }
00372   return -1;
00373 }
00374 
00375 skTVALIST_PRE void skTVAList<T>::grow()
00376 
00377 {
00378   m_ArraySize *= 2;     
00379   T *  new_array=skARRAY_NEW(T,m_ArraySize);
00380   if(m_Array){
00381     for (USize x=0;x<m_Entries;x++)             
00382       new_array[x]=m_Array[x];
00383     delete [] m_Array;
00384   }
00385   m_Array=new_array;
00386 }
00387 
00388 skTVALIST_PRE void skTVAList<T>::growTo(USize new_size)
00389 
00390 {
00391   if (new_size>m_ArraySize){
00392     m_ArraySize=new_size;
00393 
00394     T *  new_array=skARRAY_NEW(T,m_ArraySize);
00395     if(m_Array){
00396       for (USize x=0;x<m_Entries;x++)           
00397         new_array[x]=m_Array[x];
00398       delete [] m_Array;
00399     }
00400     m_Array=new_array;
00401   }
00402 }
00403 #ifdef __SYMBIAN32__
00404 
00405 skTVALIST_PRE skTVAList<T>::operator TCleanupItem()
00406 
00407 
00408 {
00409   return TCleanupItem(Cleanup,this);
00410 }
00411 
00412 skTVALIST_PRE void skTVAList<T>::Cleanup(TAny * s)
00413 
00414 
00415 {
00416   ((skTVAList<T> *)s)->clear();
00417 }
00418 #endif
00419 
00420 #endif