vee_object_store.h

Go to the documentation of this file.
00001 /* -*- C++ -*- */
00002 
00003 /* COPYRIGHT
00004  *
00005  * This file is part of the Visual Effects Engine - VEE
00006  *
00007  * Read the "VEE-LICENSE" file for the license.
00008  *
00009  * Authors & Copyright:   
00010  *
00011  * Tommi Ilmonen, Tuukka Heikura, Marko Myllymaa and 
00012  * Janne Kontkanen 2001-2004
00013  *
00014  * Additional copyrights: Tekes 2003-2004
00015  *
00016  * firstname.lastname@hut.fi
00017  *
00018  */
00019 
00020 
00021 #ifndef VEE_OBJECT_STORE_H
00022 #define VEE_OBJECT_STORE_H
00023 
00024 #include <list>
00025 
00026 template <typename T> class VEE_PointerStoreList
00027 {
00028 public:
00029 
00030   VEE_PointerStoreList() : m_last(0) {}
00031   
00032   void add(T * o) { m_objs.push_back(o); m_last = o; }
00033   
00034   bool remove(T * o) 
00035   {
00036     if(m_last == o) m_last = 0;
00037 
00038     typename std::list<T *>::iterator it = std::find(m_objs.begin(), m_objs.end(), o);
00039 
00040     if(it == m_objs.end())
00041       return false;
00042 
00043     if(it == m_it) {
00044 
00045       if(it == m_objs.begin()) {
00046   m_objs.erase(it); 
00047   m_it = m_objs.begin(); 
00048       }
00049       else {
00050   --m_it;
00051   m_objs.erase(it); 
00052       }
00053     }
00054     else
00055       m_objs.erase(it); 
00056 
00057     return true;
00058   }
00059 
00060   bool contains(T * o) 
00061   {
00062     if(o == m_last) return true;
00063 
00064     typename std::list<T *>::iterator it = std::find(m_objs.begin(), m_objs.end(), o);
00065 
00066     if(it != m_objs.end()) {
00067       m_last = o;
00068       return true;
00069     }
00070     return false;
00071   }
00072 
00073   int size() { return m_objs.size(); }
00074 
00075   void clear() { m_objs.clear(); m_last = 0; }
00076 
00078   void toFirst() { m_it = m_objs.begin(); }
00080   bool isAtEnd() { return m_it == m_objs.end(); }
00081   void advance() { ++m_it; }
00083   T * current() { return *m_it; }
00084   
00085 protected:
00086   T         *    m_last;
00087 
00088   std::list<T *> m_objs;
00089   typename std::list<T *>::iterator m_it;
00090 };
00091 
00094 
00095 /* #include <hash_set>
00096 
00098 
00099 template <class T> class VEE_PointerStoreHash
00100 {
00101 public:
00102 
00103   VEE_PointerStoreHash() : m_last(0) {}
00104   
00105   void add(T * o) { m_objs.insert(o); m_last = o; }
00106   
00107   bool remove(T * o) 
00108   {
00109     if(m_last == o) m_last = 0;
00110 
00111     std::hash_set<T *, vptrHash, eqVptr>::iterator it = m_objs.find(o);
00112 
00113     if(it == m_objs.end())
00114       return false;
00115 
00116     m_objs.erase(it);
00117 
00118     m_it = m_objs.begin();
00119 
00120     return true;
00121   }
00122 
00123   bool contains(T * o) 
00124   {
00125     if(o == m_last) return true;
00126 
00127     std::hash_set<T *, vptrHash, eqVptr>::iterator it = m_objs.find(o);
00128 
00129     if(it != m_objs.end()) {
00130       m_last = o;
00131       return true;
00132     }
00133     return false;
00134   }
00135 
00136   int size() { return m_objs.size(); }
00137 
00138   void clear() { m_objs.clear(); m_last = 0; }
00139 
00141   void toFirst() { m_it = m_objs.begin(); }
00143   bool isAtEnd() { return m_it == m_objs.end(); }
00144   void advance() { ++m_it; }
00146   T * current() { return *m_it; }
00147   
00148 protected:
00149   T *       m_last;
00150 
00151   struct vptrHash {
00152     size_t operator()(T * x) const { return ((ulong) x) >> 3; }
00153   };
00154 
00155 
00156   struct eqVptr
00157   {
00158     bool operator()(const T* s1, const T* s2) const
00159     {
00160       return s1 == s2;
00161     }
00162   };
00163 
00164   std::hash_set<T *, vptrHash, eqVptr> m_objs;
00165   typename std::hash_set<T *, vptrHash, eqVptr>::iterator m_it;
00166 };
00167 
00168 */
00169 
00172 
00173 #include <set>
00174 
00176 
00177 template <typename T> class VEE_PointerStoreSet
00178 {
00179 public:
00180 
00181   struct eqPtr
00182   {
00183     bool operator()(const T* s1, const T* s2) const
00184     {
00185       return s1 < s2;
00186     }
00187   };
00188 
00189   typedef typename std::set<T *, eqPtr>::iterator iterator;
00190 
00191   VEE_PointerStoreSet() : m_last(0) { m_it = m_objs.begin(); }
00192   
00193   void add(T * o) { m_objs.insert(o); m_last = o; }
00194   
00195   bool remove(T * o) 
00196   {
00197     if(m_last == o) m_last = 0;
00198 
00199     iterator it = m_objs.find(o);
00200 
00201     if(it == m_objs.end())
00202       return false;
00203     
00204     if(it == m_it) {
00205 
00206       if(it == m_objs.begin()) {
00207   m_objs.erase(it); 
00208   m_it = m_objs.begin(); 
00209       }
00210       else {
00211   --m_it;
00212   m_objs.erase(it); 
00213       }
00214     }
00215     else
00216       m_objs.erase(it); 
00217 
00218     return true;
00219   }
00220 
00224   void removeCurrent()
00225   {
00226     if(m_it == end())
00227       return;
00228     if(m_it == begin()) {
00229       m_objs.erase(m_it);
00230       m_it = begin();
00231     }
00232     else {
00233       iterator it = m_it;
00234       m_it--;
00235       m_objs.erase(it);
00236     }
00237   }
00238 
00239   bool contains(T * o) 
00240   {
00241     if(o == m_last) return true;
00242 
00243     typename std::set<T *, eqPtr>::iterator it = m_objs.find(o);
00244 
00245     if(it != m_objs.end()) {
00246       m_last = o;
00247       return true;
00248     }
00249     return false;
00250   }
00251 
00252   unsigned size() { return m_objs.size(); }
00253 
00254   void clear() { m_objs.clear(); m_last = 0;  m_it = m_objs.begin(); }
00255 
00257   void toFirst() { m_it = m_objs.begin(); }
00259   bool isAtEnd() { return m_it == m_objs.end(); }
00260   void advance() { ++m_it; }
00262   T * current() { return *m_it; }
00263 
00264   iterator begin() { return m_objs.begin(); }
00265   iterator end() { return m_objs.end(); }
00266   
00267   static T * getObject(iterator & it) { return (*it); }
00268 
00269 protected:
00270   T *       m_last;
00271 
00272   std::set<T *, eqPtr> m_objs;
00273   typename std::set<T *, eqPtr>::iterator m_it;
00274 };
00275 
00276 #endif

Generated on Mon Mar 12 21:09:00 2007 for VEE - The Visual Effects Engine by  doxygen 1.4.6